提供十六进制值作为 C 中获取的输入

Provide hex value as an input to gets in C

我正在研究一个简单的弧注入漏洞,其中这个特定的字符串为我提供了我想要跳转的地方的所需地址:Á^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 脚本中,该脚本将转义的十六进制字节转换为相应的字节值。 echo 实用程序将在命令行上设置 -e 开关时执行此操作,例如:

$ 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

要终止输入,请尝试按 ControlDControlC.