执行缓冲区溢出时,argc的地址是否有意义?

问题描述 投票:0回答:1

我正在解决Protostar上的堆栈缓冲区溢出问题,而我的最终目标是更好地了解正在发生的事情。我正在练习4(https://exploit.education/protostar/stack-four/)。我缓冲区溢出以执行所需的功能,但只能在gdb中执行。我只能在gdb中执行此操作的原因是因为我要利用的缓冲区结尾之后的第二个字包含argc的内存地址。如果第二个单词被覆盖,则函数调用将不起作用。我使用-fno-stack-protector选项进行编译。

在gdb中,我运行:

run <<< (echo -e "$(python -c "print('h'*64)")aaaa\xa0\xf0\xff\xbfaaaaaaaaaaaaaaaaaaaa\x3b\x84\x04\x08\x37\x16\xe2\xb7")

64 h充满了缓冲区,前四个a只是一个字溢出,接下来的四个字节是argc的地址,接下来的5个字(20 a)刚溢出。然后,我将win的地址(我要调用的函数)放入,然后将旧的返回地址退出而不会出现段错误。

当我在gdb中运行此程序时,我调用win函数,并且该过程退出。当我在gdb之外运行此命令时,会出现段错误。我以为可能是环境变量不同导致了这种情况,但事实并非如此,我更改了gdb中的环境变量以使其完全匹配gdb之外的内容,但仍然无法正常工作。

缓冲区结尾之后和返回地址之前的7个字是:1:0xb7fbb300-未知2:0xbffff0a0-argc的地址3:0x00000000-空4:0xb7e21637-返回地址,但不是实际的重要地址。 (不确定为什么有两个)5:0xb7fbb000-未知6:0xb7fbb000-未知7:0x00000000-未知

所以我的问题是为什么这仅在gdb中起作用? argc的地址对防止段错误有何意义?另外,为什么我两次看到寄信人地址?一次在缓冲区后的第4个字处,再一次在缓冲区后的第8个字处。

c gdb stack-overflow buffer-overflow exploit
1个回答
0
投票

当我在gdb中运行此程序时,我调用win函数,并且该过程退出。当我在gdb之外运行此命令时,会出现段错误。

默认情况下,GDB禁用地址随机化(使用(gdb) set disable-randomization off在GDB下启用它)。

地址随机化was implemented 精确地使堆栈溢出攻击变得更加困难,因此,攻击阻止了它也就不足为奇了。

您可以disable在系统范围内解决随机化问题,也可以尽管进行随机化也可以使您的攻击有效(可能通过尝试使用不同的地址数千次并希望您会感到幸运,或使溢出有效负载对变化有鲁棒性)在&argc中)。

© www.soinside.com 2019 - 2024. All rights reserved.