セキュリティ系の勉強・その他開発メモとか雑談. Twitter, ブログカテゴリ一覧
本ブログはあくまでセキュリティに関する情報共有の一環として作成したものであり,公開されているシステム等に許可なく実行するなど、違法な行為を助長するものではありません.

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