バッファオーバーフローの勉強をしています。
ASLRは無効。SSPも無効にしてコンパイルしてあります。
cのプログラムです。
上のプログラムには脆弱性があり、bufferで定義されている32byteよりも大きい値を入力されるとオーバーフローがおきます。
プログラムを実行し、入力に、
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB
と与えてみたところ、下の画像のように
EIPがBBBBで書き換えられました。
これで自分の好きな場所に実行位置を移すことが出来ると思ったので、main関数に飛ばしてもう一度Helloと表示させたいと思いました。下の画像のように逆アセンブリしてみてみると、どうやらmain関数はメモリの000005b4に格納されているみたいなので、
もう一度、プログラムを実行して入力に
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAb4050000
(インテルCPUのためリトルエンディアンです。)
と入力してみましたが、うまく行きません。
下の画像のようになってしまいます。
なんとなく16進数に変換しないとだめかなと思いましたが、
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0xb40x050x000x00
のように0xをつけてみてもダメでした。
調べてもどのような入力を渡せば良いか分かりませんでした。
環境はkali linux2017.3です。
どなたかご教授お願いいたします。
追記
回答してくださった方の方法でうまくいくと思うけど、もう少し回答いただきたいので一様追記。
EIPに0x000005b4を格納できれば良いみたい。
python3で000005b4をバイト文字列に変換してみると、
\x00\x00\x05\xb4となった。
echo -e 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\xb4\x05\x00\x00' | ./一番上の画像のcのプログラム
としてみても上手くいきませんでした。
書くの忘れていましたが、gcc -m32 でコンパイルしているのでレジスタのサイズは32bitなのでそもそも\x00\x00\x05\xb4がEIPに入りきらない気がする・・・。
(\x00\x00\x05\xb4は16byteもあるので)
BBBBは4byteだから入るけど・・・
asm様のコードがいまいち理解できていません・・・
キーボードでは普通の文字列しか入力できないから、バイナリで入力を渡せるようにファイルにバイナリ形式で書き込んでそれをfgetsで読み込んでいるコードのようだけれど、コンパイルして実行すると、input: となって入力を待たれて何を入れてもWrong anserとなって
コードが進まないです。
ついでに教えて頂けると嬉しいです。

回答2件
あなたの回答
tips
プレビュー