我试图在Ubuntu 10.04中使用C程序溢出缓冲区,并将返回地址转移到函数"junk“。但是我不能用未使用的函数“垃圾”的地址覆盖返回地址。它只是在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 "wwwwwwwwwwww\x72\x84\x04\x08“| ./buffer
值:- "x72\x84\x04\x08“作为未使用的函数"junk”的第一条指令的转移地址。它在12个字节中存储了一些奇怪的内存值以及返回地址,但没有存储我的地址。并再次给出“分割错误”。在较新的Linux版本中,有没有其他方法来利用缓冲区?
发布于 2012-09-15 04:31:36
leave相当于以下内容:
movl %ebp, %esp
popl %ebp因此,在您的示例中,如果您为%ebp提供'wwww‘,程序将尝试执行以下操作:
movl $0x77777777, %esp ; 0x77777777 = 'wwww'
popl %ebp ; read from address 0x77777777!您需要为%esp!提供合理的值!
https://stackoverflow.com/questions/12304589
复制相似问题