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

时间:2015-03-08 11:21:33

标签: c buffer-overflow gets

我正在研究一个简单的电弧注入漏洞,其中这个特定的字符串为我提供了我想要跳转的地方所需的地址:Á^F@^@。这是地址0x004006c1(我使用的是64位英特尔处理器,因此x86-64采用小端序排列)。

当我将此字符串Á^F@^@作为我的函数中易受攻击的gets()例程的输入并使用gdb检查地址时,地址将被修改为0x00400681而不是0x004006c1。我不太清楚为什么会这样。此外,有没有办法轻松地为gets的{​​{1}}例程提供十六进制值?我尝试过做stdin之类的操作,但不是按原样选择121351...12312\xc1\x06\x40\x00,而是将单个字符转换为十六进制,因此我得到类似\xc1的内容(十六进制为\和x,然后是c和1)的十六进制。

感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:2)

您可以将原始字节放入某个文件中并将其直接传送到您的应用程序中。

$ 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

要终止输入,请尝试按 Control D Control C