196の日記

セキュリティ系の勉強、その他開発メモとか雑談、忘れそうな計算式などを書き溜める場所になっています. githhubはUnity触っていた頃ものがメイン https://github.com/196kakinuma

Return to libc (ret2libc) system関数を呼び出すメモ

はじめに

これはハリネズミ本の中のret2libcの内容に対する自分なりのメモです



環境はubuntu14.04.5です

ここに来る前にやったのは

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文字使用します。