got rewriter

TCPサーバの接続情報が与えられた。
また、ELFファイル got と、C言語のソースコード got.c が与えられた。

got.c を読むと、system("/bin/sh"); を実行する関数 win のアドレスを出力した後、 書き込むアドレスとデータを指定して書き込める関数 vuln を無限ループで呼び出していることがわかった。
この関数 vuln は、関数 read を用いる関数 get_val を用いていた。

TDM-GCCのobjdumpでgotを逆アセンブルした結果の以下の部分から、関数 read のメモリ上のアドレスは 0x601048 に格納されることがわかった。

Information to connect to a TCP server was given.
Also, an ELF file got and a C source code got.c were given.

Reading got.c, I found it first prints the address of a function win that executes system("/bin/sh");, and then infinitely calls a function vuln that can write data with specifying the address and data to write.
The function vuln uses a function get_val that uses the function read.

From this part of the disassembling of got by "objdump" in TDM-GCC, I found that the address of the function read on the memory is stored to 0x601048.

00000000004006f0 <read@plt>: 4006f0: ff 25 52 09 20 00 jmpq *0x200952(%rip) # 601048 <read@GLIBC_2.2.5> 4006f6: 68 06 00 00 00 pushq $0x6 4006fb: e9 80 ff ff ff jmpq 400680 <.plt>

書き込むアドレスにこの 601048 を、値に出力された関数 win のアドレス 400807 を指定すると、シェルを起動できた。
ls -al コマンドを実行するとファイル flag.txt があることがわかり、cat flag.txt コマンドを実行するとflagが得られた。

I succeeded to launch the shell by specifying this 601048 as the address wo write, and 400807, which is the printed address of the function win, as the value to write.
Executing a command ls -al revealed that there is a file flag.txt, and I obtained the flag by executing a command cat flag.txt.

FLAG{you-are-pro-pwner-or-learned-how-to-find-writeup}

WaniCTF 2021