我正在研究一个简单的弧注入(inject)漏洞,其中这个特定的字符串为我提供了我想要跳转的位置的所需地址:Á^F@^@
。这是地址0x004006c1
(我使用的是64位Intel处理器,所以x86-64采用小端序排列)。
当我提供此字符串 Á^F@^@
作为函数中易受攻击的 gets()
例程的输入并使用 gdb< 检查地址时
,地址被修改为 0x00400681
而不是 0x004006c1
。我不太确定为什么会发生这种情况。此外,有没有什么方法可以轻松地向 stdin
处的 gets
例程提供十六进制值?我尝试过执行类似以下操作: 121351...12312\xc1\x06\x40\x00
,但它不是按原样选取 \xc1
,而是翻译单个字符到十六进制,所以我得到类似 5c78..
(十六进制表示\和 x,后跟十六进制表示 c 和 1)。
感谢任何帮助,谢谢!
最佳答案
您可以将原始字节放入某个文件中,然后将其直接通过管道传输到您的应用程序中。
$ path/to/my_app <raw_binary_data
或者,您可以将应用程序包装在 shell 脚本中,该脚本将转义的十六进制字节转换为其相应的字节值。当在命令行上设置 -e
开关时,echo
实用程序将执行此操作,例如:
$ echo '\x48\x65\x6c\x6c\x6f'
\x48\x65\x6c\x6c\x6f
$ echo -e '\x48\x65\x6c\x6c\x6f'
Hello
您可以使用此功能来处理应用程序的输入,如下所示:
while read -r line; do echo -e $line; done | path/to/my_app
要终止输入,请尝试按 ControlD 或 ControlC。
关于c - 提供十六进制值作为 C 中获取的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28925811/