Cプログラムを使用してUbuntu 10.04でバッファをオーバーフローさせようとしており、リターンアドレスを関数「ジャンク」に流用しています。しかし、リターンアドレスを未使用の関数「ジャンク」のアドレスで上書きすることはできません。スタックの 12 バイトに未知のアドレスをダンプするだけです。トラブルシューティングを手伝ってください。ここにCコードがあります: -
(gdb) list
1 #include<stdio.h>
2 void display()
3 {
4 char buff[8];
5 gets(buff);
6 puts(buff);
7 }
8 main()
9 {
10 display();
(gdb)
11 return(0);
12 }
13 junk()
14 {
15 printf("cracked");
16 }
main の逆サンブルされたコードは次のとおりです。- 関数 main のアセンブラー コードのダンプ:
0x08048462 <+0>: push %ebp
0x08048463 <+1>: mov %esp,%ebp
0x08048465 <+3>: call 0x8048444 <display>
0x0804846a <+8>: mov $0x0,%eax
0x0804846f <+13>: pop %ebp
0x08048470 <+14>: ret
アセンブラー・ダンプの終わり。
関数表示用のアセンブラ コードのダンプ:
0x08048444 <+0>: push %ebp
0x08048445 <+1>: mov %esp,%ebp
0x08048447 <+3>: sub $0xc,%esp
0x0804844a <+6>: lea -0x8(%ebp),%eax
0x0804844d <+9>: mov %eax,(%esp)
0x08048450 <+12>: call 0x8048350 <gets@plt>
0x08048455 <+17>: lea -0x8(%ebp),%eax
0x08048458 <+20>: mov %eax,(%esp)
0x0804845b <+23>: call 0x8048380 <puts@plt>
0x08048460 <+28>: leave
0x08048461 <+29>: ret
アセンブラー・ダンプの終わり。
関数ジャンクのアセンブラー コードのダンプ:
0x08048471 <+0>: push %ebp
0x08048472 <+1>: mov %esp,%ebp
0x08048474 <+3>: sub $0x4,%esp
0x08048477 <+6>: mov $0x8048550,%eax
0x0804847c <+11>: mov %eax,(%esp)
0x0804847f <+14>: call 0x8048370 <printf@plt>
0x08048484 <+19>: leave
0x08048485 <+20>: ret
アセンブラー・ダンプの終わり。
今、私はスタック保護なしでそれを組み立てます:-
gcc -ggdb -fno-stack-protector -mpreferred-stack-boundary=2 -o buffer buffer.c
次のように入力した場合:- printf "wwwwwwww\x72\x84\x04\x08" | 。/バッファ
値:- "x72\x84\x04\x08" は、未使用関数 "ジャンク" の最初の命令の流用アドレスとして。12バイトにいくつかの奇妙なメモリ値とリターンアドレスも保存しますが、私のアドレスは保存しません。そして再び「セグメンテーション違反」を与えます。新しい Linux フレーバーでバッファを利用する他の方法はありますか?