質問: ret2libc 攻撃を実験してみようと思い、SSPとASLRを無効にして、バッファオーバーフローによりリターンアドレスをsystem()へのアドレスに書き換え、引数を/bin/shにしようとしました。 しかし、system()アドレスが0x0000......だったため引数を指定できませんでした。 実行環境のメモリアドレスは8バイトあるため、全てが0x0000......で表されています。このような場合に、上手くsystem(/bin/sh)を実行する方法を教えて下さい。 補足 このプログラムを、gdbにおいて、 r `perl -e 'print "A"x128,"B"x8,"(system関数のアドレス)","(exit関数のアドレス)", "(環境変数を用いた 文字列/bin/sh へのアドレス)"'` で実行した所、system関数のアドレスが \x--\x.......\x00\x00となってしまうため、strcpyが文字列として認識するのが入力値のsystem関数のアドレスの6バイト目までとなってしまい、system関数の引数部分を書き換えられない、という意味です。うまく伝わればいいのですが・・・ また、この実験はCTFに参加してみたく行ったものなので、悪意ある攻撃のためではありません。 この実験で使用したコードは以下の通りです。 ``` #include #include void bug(char *arg1){ char name[128]; strcpy(name,arg1); printf("Hello %s\n", name); } int main(int argc, char **argv){ if(argc < 2){ printf("Usage: %s \n", argv[0]); return 0; } bug(argv[1]); return 0; } ``` ubuntu14.04 64bitで実行しました。
回答: > > しかし、system()アドレスが0x0000......だったため引数を指定できませんでした。 > > > ちょっと意味を掴みかねていますが、先のご質問 #170151 - gdbのSIGSEGVについて の延長でしょうか? もし、先の質問内容中のコード`perl -e 'print "A"x144'` に関連して、戻り先アドレスとして値に0を埋めたいと言うことであれば、perlの文字列でC言語のように16進数指定や`\0`指定もできるので、それを利用すれば所望の結果を得られると思います。 ``` # 'A'を2文字 + '\0'(0x00) + '0'を3文字 $ perl -e 'print "A"x2 . "\0" . "\x30"x3' | od -t xC 0000000 41 41 00 30 30 30 0000006 # 'A'を2文字 + 0x00, 0x01, 0x02 + '0'を3文字 $ perl -e 'print "A"x2 . "\x00\x01\x02" . "\x30"x3' | od -t xC 0000000 41 41 00 01 02 30 30 30 0000010 ``` 純粋に技術的な興味からくる実験だとは思いますが、最終的には攻撃手法の解説やヘルプになってしまう恐れはありますので、回答としてはこの辺にしておきます。そもそも回答として外していたらごめんなさい。 **質問者さんの補足を受けて追記しました:**2019-01-23 09:55 > > strcpyが文字列として認識するのが入力値のsystem関数のアドレスの6バイト目までとなってしまい > > > つまりは`perl -e ...`での実行結果をコマンドライン文字列として`main`で受け取っていて、その生成されたコマンドラインオプションの文字列が途中で`'\0'`を含んでしまっているので、`strcpy`で途中までしか取り込めない、と言うことでしたか。理解しました。 実験の主旨からするとコマンドラインから指定するのが必須要件ではないはずです。perlのスクリプトを使っているのは「便利だから」程度の理由だと思いますが、プログラム中で定数で指定してしまっても実験はできるはずですし、あくまで「外部から入力したい」と言うことであればパラメータを渡す方法はいくらでも考えられます。※どのような方法があるかは課題としてご自分で考えてみてください。 > > また、この実験はCTFに参加してみたく行ったものなので、悪意ある攻撃のためではありません。 > > > 個人的には低レイヤーでかつ、セキュリティ系に興味を覚える方は少なく、(良い意味での)貴重な将来の人材と成り得るとは思っているので、若干の警戒はあるものの全面的に疑っている訳ではありません。ただ、別回答にもありましたが、どんな内容が悪用されるか分かりません。初心者レベルの攻撃でも、例えば子供でも刃物を持ってうろついていたら保護されるように、初心者レベルのプログラムでも意図した攻撃や誤用で罪になることも考えられます。 ご存知だとは思いますが: 警視庁 - 不正指令電磁的記録に関する罪 今に始まったことではありませんが、teratailをはじめ、公共の目にとまりやすいWEBサイトでそのような情報を共有すること自体がリスクになっているので、慎重にならざるを得ません。