如何向运行中程序写入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当作输入结束,导致输入提前终止; - 非打印字符(比如控制字符)会被文本编辑器显示成占位符,复制时可能被转换成其他编码的字节,完全偏离你要的原始值。
- NULL字节(
记住,gets本身不做任何输入长度检查,只要输入的字节数超过buf的大小(100)就能触发溢出,关键是要确保输入的字节完全符合你的预期——绕过复制粘贴的编码坑,直接用二进制流输入是最稳妥的方式。
内容的提问来源于stack exchange,提问作者Jacob H
相关产品推荐
相关产品推荐

