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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:45:03