LLDB调试时如何直接输入十六进制值覆盖返回地址实现缓冲区溢出
LLDB会话内手动输入十六进制字节实现缓冲区覆盖的方法
核心原因说明
你直接在LLDB交互界面输入\x开头的十六进制转义符时,LLDB会将转义符拆解为普通字符传入程序标准输入,不会解析为对应的单字节值,因此无法实现内存覆盖。
以下是两种符合要求的、完全在LLDB调试会话内操作的实现方案:
方案1:直接写入目标栈内存(最灵活,推荐)
无需走程序输入流,直接通过LLDB内存操作命令写入你需要的任意字节,还可以避开gets遇到换行/EOF终止的限制:
- 先编译测试程序(关闭栈保护方便调试):
gcc -fno-stack-protector -z execstack -o overflow_test overflow_test.c
- 启动LLDB加载程序:
lldb ./overflow_test
- 在
return_input函数入口下断点并启动程序:
b return_input run
- 断住后获取目标数组的栈地址:
frame variable array
输出示例:(char [30]) array = 0x00007ffeefbff5a0 "",记录下该地址。
- 用
memory write命令手动输入你需要的十六进制字节,按顺序写即可:
# 示例:写入4个A+0x01+0x02,后续可追加字节直到覆盖返回地址 memory write 0x00007ffeefbff5a0 0x41 0x41 0x41 0x41 0x01 0x02
- 验证写入结果是否正确:
x/30x 0x00007ffeefbff5a0
- 确认内容无误后继续运行程序即可:
continue
方案2:模拟标准输入流输入
如果你需要完全模拟gets读取标准输入的场景,可在LLDB内通过进程输入重定向实现转义符解析:
在LLDB会话内执行以下命令启动程序,printf会自动将十六进制转义符转换为对应字节传入程序标准输入:
process launch -i <(printf "AAAAA\x01\x02\xff\xde\xad\xbe\xef")
你可以修改printf后的字符串内容,自定义你需要的输入字节。
内容的提问来源于stack exchange,提问作者Bala
相关产品推荐
相关产品推荐

