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

标签 c buffer-overflow gets

我正在研究一个简单的弧注入(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

要终止输入,请尝试按 ControlDControlC

关于c - 提供十六进制值作为 C 中获取的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28925811/

相关文章:

c - 缓冲区溢出,不是预期的结果

c - 即使使用 fflush(stdin),程序也不会在 scanf() 之后执行 gets()

C - fgets() - 如果字符串更长怎么办?

c - 如何使用 GNU C vector 扩展从 double 组加载/存储到 double 组?

c# - BTLE 4.0 负载

c - Ret2libc 漏洞在 gdb 中有效,但在正常 shell 中会出现错误 sh : 1: g:0:1: not found

无法找出严重的堆栈段故障

ruby - 如何在进入 Ruby 后覆盖当前控制台行?

c - Valgrind 在我的代码中发现了漏洞,有人能帮我找到它吗?

c - 错误: expected expression before ‘void’