2
我尝试使用C程序在Ubuntu 10.04中溢出缓冲区,并将返回地址转移到函数“垃圾”。但是我无法用未使用的函数“垃圾”的地址覆盖返回地址。它只是在12个字节的堆栈上转储一些未知的地址。请帮我解决它。下面是C语言代码: -Ubuntu 10(程序集)中的实验性缓冲区溢出
(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 }
为主要的disasambled代码是: - 转储的汇编代码功能主要:
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 <[email protected]>
0x08048455 <+17>: lea -0x8(%ebp),%eax
0x08048458 <+20>: mov %eax,(%esp)
0x0804845b <+23>: call 0x8048380 <[email protected]>
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 <[email protected]>
0x08048484 <+19>: leave
0x08048485 <+20>: ret
汇编转储结束。
现在我组装它没有堆栈保护: -
gcc -ggdb -fno-stack-protector -mpreferred-stack-boundary=2 -o buffer buffer.c
如果我给的输入: - printf的 “wwwwwwwwwwww \ X72 \ X84 \ X04 \ X08” | ./buffer
值: - “x72 \ x84 \ x04 \ x08”作为未使用函数“垃圾”的第1条指令的转移地址。 它与12位字节一起存储一些奇怪的内存值以及返回地址,但不是我的地址。并再次给出“分段错误”。在更新的Linux版本中是否有其他方式来利用缓冲区?