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

如何向运行中程序写入stdin,实现C语言缓冲区溢出(免手动输特殊字符)

解决gets缓冲区溢出的复制粘贴字符异常问题

嘿,我懂你碰到的糟心事——那段用gets的代码本来就是缓冲区溢出的活靶子,但复制粘贴特殊字符时总出岔子,这多半是因为文本工具或终端对二进制字节做了隐形处理,比如转义、截断或者编码转换,导致你实际输入的字节和预期的完全不一样。

给你几个靠谱的解决办法,不用手动敲Unicode,也能精准触发溢出:

  • 直接用管道喂纯字节流(最推荐)
    跳过复制粘贴这一步,用命令行工具直接生成你需要的字节序列,通过管道传给目标程序。比如用Python生成120个'A'(足够覆盖buf[100]加上栈上的返回地址区域),再加上你想要覆盖的特定字节:

    python3 -c 'print(b"A"*120 + b"\x41\x42\x43\x44")' | ./your_compiled_program
    

    这样所有字节都是原始二进制,不会被任何工具篡改,完美匹配溢出需求。

  • 如果非要复制粘贴:用二进制安全的剪贴板工具
    要是你坚持要用剪贴板,得用能处理原始二进制的工具,避免文本编辑器或终端的自动转换。比如在Linux下用xclip:

    # 把生成的二进制字节存到剪贴板
    python3 -c 'print(b"A"*120 + b"\x41\x42\x43\x44")' | xclip -selection clipboard
    

    然后在运行程序的终端里直接粘贴——不过要注意,有些终端对非打印字符还是会有处理,所以管道方法依然是首选。

  • 为啥复制粘贴会出问题?
    核心原因是大多数文本工具是为处理可打印文本设计的,不是二进制:

    • NULL字节(\x00)会被当作字符串结束符,复制时直接截断后面的内容;
    • 换行符(\x0a)会被gets当作输入结束,导致输入提前终止;
    • 非打印字符(比如控制字符)会被文本编辑器显示成占位符,复制时可能被转换成其他编码的字节,完全偏离你要的原始值。

记住,gets本身不做任何输入长度检查,只要输入的字节数超过buf的大小(100)就能触发溢出,关键是要确保输入的字节完全符合你的预期——绕过复制粘贴的编码坑,直接用二进制流输入是最稳妥的方式。

内容的提问来源于stack exchange,提问作者Jacob H

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:37:38