在C语言中,将十六进制值作为输入提供给gets函数。

4
我正在开发一个简单的弧形注入漏洞,其中此特定字符串给出了我想要跳转的地址:Á^F@^@。这是地址0x004006c1(我使用64位英特尔处理器,因此为x86-64并具有小端排列)。
当我将此字符串Á^F@^@用作我的函数中易受攻击的gets()例程的输入,并使用gdb检查地址时,地址会被修改为0x00400681而不是0x004006c1。 我不太确定为什么会发生这种情况。此外,是否有任何方法可以轻松地向stdin提供十六进制值以供gets例程使用? 我曾尝试过类似以下内容:121351...12312\xc1\x06\x40\x00 ,但它会将单个字符转换为十六进制,因此我得到了一些类似于5c78..(\和x的十六进制,后跟C和1的十六进制)的东西。
感谢您的帮助!

这似乎是一个字符编码问题:Á 是 U+00C1 -- 一个 Unicode 值。然而,您的区域设置似乎表明它被转换为 UTF-8 作为 \xC3\x81,但由于某种原因,\xC3 字节被丢弃或交换了(?), 或者转换为 GB 18030 作为 \x81\x30\x86\x39,在这种情况下,如果您打印更多内容,您将会看到更多信息。这只是一个快速的 Python 编码测试,但 UTF-8 和 GB 18030 是唯一包含 \x81 字节序列的编码方式。个人建议只需将 stdin 重定向到文件,以避免出现此类字符输入的编码问题。 - user539810
1个回答

3
你可以直接将原始字节放入文件中,并将其直接传输到你的应用程序中。
$ 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

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


谢谢你的帮助,但那并不能解决我的问题 :-/ 某些原因下 Á 仍然被翻译成 0x81 - user2841250
@user2841250 如果这就是你想要的,为什么不直接输入\xc1呢? - r3mainer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接