如何输入ASCII码16字符并构造1161258512值实现缓冲区溢出?
解决Linux下C语言缓冲区溢出的载荷构造问题
核心步骤拆解
解析目标数值的字节表示
目标INT值1161258512在x86/x86_64架构(小端序)的Linux下,对应的4字节序列为:\x10\x11\x30\x45。其中第一个字节\x10就是你需要的ASCII 16(数据链路转义␐),正好满足需求。
(验证方式:用Python执行struct.pack('<I', 1161258512)可直接得到该字节序列)构造完整溢出载荷
假设程序中需要覆盖的INT变量位于缓冲区之后,比如缓冲区大小为100字节,那么载荷需要包含:- 100个填充字符(比如'A',用来填满缓冲区并覆盖到变量位置)
- 上述4字节序列(用来覆盖INT变量为目标值)
输入载荷的可行方法
控制字符无法直接通过普通键盘输入转义序列,推荐以下两种可靠方式:- 方法一:用printf生成载荷并通过管道传入
执行命令:
把printf '%.100s\x10\x11\x30\x45' 'A' | ./your_vulnerable_program100替换为实际缓冲区大小,your_vulnerable_program替换为目标程序名。 - 方法二:生成载荷文件后输入
先生成载荷文件:
再让程序读取该文件:printf '%.100s\x10\x11\x30\x45' 'A' > payload.bin./your_vulnerable_program < payload.bin - 方法三:直接键盘输入(需禁用流控制)
先禁用终端的Ctrl+P/Q流控制:
然后输入对应数量的填充字符,接着按stty -ixonCtrl+P(输入ASCII16)、Ctrl+Q(输入ASCII17)、字符'0'、字符'E',回车即可。
- 方法一:用printf生成载荷并通过管道传入
注意事项
- 若程序运行在大端架构Linux(如PowerPC),字节序需反转,序列变为
\x45\x30\x11\x10,但x86/x86_64平台无需考虑。 - 直接输入转义字符串(如
\x10)无效,因为程序的输入函数(如scanf)会将其视为普通字符,而非转义后的字节。
内容的提问来源于stack exchange,提问作者Bbird
相关产品推荐
相关产品推荐

