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

如何向终端中已运行的程序输入十六进制值(GDB调试场景)

向GDB中运行的程序输入十六进制值的方法

针对你在CTF调试中遇到的「程序启动后等待输入时,需要传入十六进制字节触发缓冲区溢出」的需求,以下是两种可靠的实现方法:

方法1:通过进程文件描述符直接写入

  1. 获取目标程序的进程ID(PID):
    • 在GDB中执行 info inferiors,第一列就是进程ID;
    • 或者在另一个终端用 ps aux | grep <程序名> 查找。
  2. 构造十六进制字节并写入程序的标准输入:
    以目标地址0x12345678为例(x86架构需使用小端序,即字节逆序为\x78\x56\x34\x12),执行以下命令:
    echo -n -e '\x78\x56\x34\x12' > /proc/<PID>/fd/0
    
    • -n 避免添加多余换行符干扰输入;
    • -e 让echo解析\xXX格式的十六进制转义字符。

方法2:绑定独立终端输入

如果进程文件描述符写入无效(部分环境下存在权限限制),可以用GDB绑定外部终端:

  1. 打开一个新终端,执行 tty 命令获取终端路径(比如/dev/pts/2)。
  2. 在GDB中,当程序暂停在等待输入状态时,执行:
    set inferior-tty /dev/pts/2
    continue
    
  3. 回到新打开的终端,执行构造输入的命令:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 19:12:52