如何向终端中已运行的程序输入十六进制值(GDB调试场景)
向GDB中运行的程序输入十六进制值的方法
针对你在CTF调试中遇到的「程序启动后等待输入时,需要传入十六进制字节触发缓冲区溢出」的需求,以下是两种可靠的实现方法:
方法1:通过进程文件描述符直接写入
- 获取目标程序的进程ID(PID):
- 在GDB中执行
info inferiors,第一列就是进程ID; - 或者在另一个终端用
ps aux | grep <程序名>查找。
- 在GDB中执行
- 构造十六进制字节并写入程序的标准输入:
以目标地址0x12345678为例(x86架构需使用小端序,即字节逆序为\x78\x56\x34\x12),执行以下命令:echo -n -e '\x78\x56\x34\x12' > /proc/<PID>/fd/0-n避免添加多余换行符干扰输入;-e让echo解析\xXX格式的十六进制转义字符。
方法2:绑定独立终端输入
如果进程文件描述符写入无效(部分环境下存在权限限制),可以用GDB绑定外部终端:
- 打开一个新终端,执行
tty命令获取终端路径(比如/dev/pts/2)。 - 在GDB中,当程序暂停在等待输入状态时,执行:
set inferior-tty /dev/pts/2 continue - 回到新打开的终端,执行构造输入的命令:
此时程序会读取该终端传入的十六进制字节数据。echo -n -e '\x78\x56\x34\x12' > /dev/pts/2
注意事项
- x86架构下,缓冲区溢出覆盖返回地址时必须使用小端序,即把
0x12345678拆分为0x78 0x56 0x34 0x12对应\x78\x56\x34\x12; - 如果需要更长的溢出 payload,可以在
echo命令中拼接更多字节(比如填充大量\x90nop指令再加目标地址)。
内容的提问来源于stack exchange,提问作者gtakovic
相关产品推荐
相关产品推荐

