gpt4 book ai didi

c - Ubuntu 10 中的实验性缓冲区溢出(汇编)

转载 作者:太空狗 更新时间:2023-10-29 12:35:41 25 4
gpt4 key购买 nike

我正在尝试使用 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 "wwwwwwwwwwww\x72\x84\x04\x08"| ./缓冲区

值:- "x72\x84\x04\x08"作为未使用函数“垃圾”的第一条指令的转移地址。它在 12 个字节上存储了一些奇怪的内存值以及返回地址,但不是我的地址。并再次给出“段错误”。有没有其他方法可以在较新的 Linux 版本中利用缓冲区?

最佳答案

leave 等同于:

movl %ebp, %esp
popl %ebp

因此,在您的情况下,如果您为 %ebp 提供“wwww”,程序将尝试执行如下操作:

movl $0x77777777, %esp    ; 0x77777777 = 'wwww'
popl %ebp ; read from address 0x77777777!

您需要为 %esp 提供一个合理的值!

关于c - Ubuntu 10 中的实验性缓冲区溢出(汇编),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12304589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com