gpt4 book ai didi

c - 为什么在这次缓冲区溢出尝试中 eip 没有改变?

转载 作者:太空宇宙 更新时间:2023-11-04 03:52:22 28 4
gpt4 key购买 nike

我正在尝试解决缓冲区溢出问题。我不明白这里的 eip 值是怎么回事。

这是 C 代码:

void copy(char *arg) {
char msg[256];
strcpy(msg,arg);
}

它的程序集:

0x804847d <copy+25>:    call   0x8048368 <strcpy@plt>
0x8048482 <copy+30>: leave
0x8048483 <copy+31>: ret

我输入一个字符串作为参数,如“_\xAA\xBB\xCC\xDD”,其大小经过计算,因此最后 4 个字节为 4 个字节在 $ebp 之后(为了覆盖真实的返回地址)。它似乎有效。

在 gdb 中:

(break before strcpy)
x/2wx $ebp
0xbffffb38: 0xbffffb58 0x080484d2
n
(just after strcpy execution)
x/2wx $ebp
0xbffffb38: 0x80cdd189 0x080484b6
...
n
...
x/2wx $ebp
0xbffffb38: 0x80cdd189 0x080484b6

所以返回地址是0x080484d2,溢出后是0x080484b6,这就是我想要的。但程序退出:“无法访问地址 0x80cdd18d 处的内存”。

我不知道为什么 $eip 没有设置到我的地址,而且因为 0x08048 中的代码地址......我非常有信心 $ebp+4 是包含返回地址的地方

我再次尝试使用一个小 4 个字节的字符串,这次它覆盖了 $ebp 而不是 $ebp+4,返回后 $eip 被设置为 $ebp+4 中包含的值

有什么解释吗?

最佳答案

好的,谢谢@Wumpus Q. Wumbley,这帮助我理解了一些事情。

执行next 会跳转leaveretret是改变eip的指令,它必须等价于pop eip。但是 leave 修改了堆栈指针 espebp 之前(特别是因为当我覆盖 ebp+4 时我改变了 ebp 中包含的值)

TLDR:不覆盖 ebp 的值使其成功运行。

关于c - 为什么在这次缓冲区溢出尝试中 eip 没有改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19756602/

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