You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

《Hacking: The Art of Exploitation》缓冲区溢出Exploit在Protostar Stack5运行失败

核心错误原因

你代码中计算shellcode长度的逻辑存在严重错误:
你定义的shellcode是char*类型的指针,在32位的Protostar运行环境中,指针长度固定为4字节,因此sizeof(shellcode)的返回值为4,你再减1后只剩3字节,最终memcpy仅拷贝了shellcode的前3个有效字节,这就是你观察到NOP sled后只有少数字节变化、完整shellcode没有写入的直接原因。

修正方案

修改shellcode的定义方式,将其从指针改为数组类型:

char shellcode[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";

此时sizeof(shellcode)会返回整个数组的实际长度(包含末尾自动添加的\0),你原有sizeof(shellcode)-1的写法刚好可以取到完整的有效shellcode长度。
也可以直接手动指定shellcode长度,你当前使用的shellcode有效长度为24字节,将memcpy写法改为:

memcpy(buffer + 26, shellcode, 24);

其他需要修正的问题

  • 返回地址计算逻辑错误:你现在用攻击程序中局部变量i的地址减偏移得到ret,而攻击程序和目标程序stack5是两个独立的进程,地址空间完全隔离,这个ret值完全无效。你需要先gdb调试/opt/protostar/bin/stack5,获取目标程序运行时的栈地址范围,再确定合法的返回地址取值。
  • payload传递方式存在风险:用echo通过shell传递payload时,如果payload中包含单引号、换行符等shell特殊字符会被解析截断,更稳妥的方式是直接在C代码中通过管道向stack5的标准输入写入payload,避免shell解析的干扰。
  • 填充逻辑可以优化:你当前先全填返回地址再覆盖前半段为NOP和shellcode的逻辑可以运行,但需要先确认stack5的缓冲区到返回地址的实际偏移,再对应调整payload长度和各部分的填充位置,避免返回地址没有覆盖到目标位置。

内容的提问来源于stack exchange,提问作者Leonardo Polo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 21:57:04