Return to libc (ret2libc) system関数を呼び出すメモ
//
ここに来る前にやったのは
ret2pltという、printf関数を呼び出すやつでした。この際は
A*44文字 + printfのアドレス + ダミー(bbbb) + 引数アドレス(bufferアドレス)
をechoで実行ファイルに渡すことで、ret2pltを再現してました。
ret2libcを行うには
一般的には、実行ファイルの中で”/bin/bash”や"/bin/sh"という文字列を検索して、そこへのアドレスを引数アドレスに渡してあげるらしいのですが(gdbないでfind /bin/bash文字列を検索する)、今回はスクリプト内最後でstrcpyを実装しているので、echoの入力がbufferに入ります。ということで、A*44の始めの部分を/bin/bashに変更します。
(/bin/bash+A*?文字)=44文字 + systemのアドレス + ダミー(bbbb) + 引数アドレス(bufferアドレス)
ここで、bufferはsystem関数でコマンドとして実行できるような文字列である必要があるらしいです。
・文字列がNULLバイト(¥x00)で終わる
・不要な文字をコメントアウトする
/bin/bashを使用する場合でやってみる
・/bin/bash は 9文字としてカウントします
・NULLバイト¥x00は1文字としてカウントします
・上記の2つと残りはAを使って44文字になるようにする
例えば以下のようになります。
(echo -e '/bin/bash¥x00AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¥x70¥x2e¥xe5¥xf7BBBB¥x60¥xa0¥x04¥x08';cat) | ./bof3
Aの部分は34文字で+9+1で44文字になってます。
余談ですが、コメントアウトする場合は'/bin/bash #AAAA...'となり、A以外は11文字、Aで33文字使用します。