提供十六进制值作为 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
要终止输入,请尝试按 ControlD 或 ControlC.
我正在研究一个简单的弧注入漏洞,其中这个特定的字符串为我提供了我想要跳转的地方的所需地址:Á^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
要终止输入,请尝试按 ControlD 或 ControlC.