如何通过 stdin 输入 shellcode,该 shellcode 将作为 shellcode 读取,而不是 stdin 中的字符串文本?

How can I input shellcode via stdin that will be read as shellcode instead of a string literal from stdin?

提问人:Emily 提问时间:7/30/2023 更新时间:7/30/2023 访问量:92

问:

我正在进行(合法的)二进制开发实践,并且有一个易受攻击的缓冲区,我正在尝试将特定的内存地址写入其中。但是,用户输入是通过 stdin 的 fgets 收集的,当我输入输入时,它不会被解析为字节,而是被解析为字符串文字。

这就是我试图传递的内容: 啊啊啊

尝试了原始方法,并且 AAAAAAAAAAAAAAA$'\x20\x3d\x00\x00\x01',似乎没有任何效果

C UNIX FGETS 缓冲区溢出 shellcode

评论

0赞 William Pursell 7/30/2023
如果要在 stdin 上传递特定数据,只需将该数据写入 stdin。也许吧,但有些实现不采用 \x.(如果是这种情况,您可以使用八进制。print 'AAAAA\x20\x3d' | ./cmdprintf
0赞 Charles Duffy 7/30/2023
Bash 确实支持,但它使用 C 字符串;因为它们是以 NUL 结尾的,所以根据定义,您不能在 C 字符串中包含 NUL 字节,因此只是一个空字符串,而不是带有 NUL 的单字节字符串。正如 William 在上面向您展示的那样,printf 可以将 NUL 写入格式字符串参数位置给出的输出 - 请注意,这不是声称创建的字面 NUL 字节,而是一个转义序列。$''$'\x00''\x00'$'\x00'
1赞 Charles Duffy 7/30/2023
但是,要做到这一点,我们需要您正在运行的实际代码,而不仅仅是您尝试表示的数据,以及一种明确确定您的代码是否正在执行您想要的事情的方法。(考虑预期和实际或输出作为证明这一点的一种方式 - 尽管一旦你有一个带有预期数据的 xxd 输出,你就可以直接使用,而根本不会弄乱 printf)。hexdump -Cxxdxxd -r

答:

0赞 ikegami 7/30/2023 #1

从 stdin 读取时,您将获得提供给 stdin 的确切字节。(至少在二进制模式下。在文本模式下,您可能会在 Windows 中获得一些 0D 0A ⇒ 0A 翻译。

听起来您想提供以下字节(以十六进制表示):

41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 20 3D 00 00 01

若要提供这些字节,可以使用以下任一方法:

perl -e'print pack "H*", "41414141414141414141414141414141203D000001"'

perl -e'print "AAAAAAAAAAAAAAAA =\x00\x00\x01"'

printf 'AAAAAAAAAAAAAAAA =\x00\x00\x01'

(有人评论说,并非所有支持十六进制转义。printf

您可以使用 验证输出的字节是否正确。od -t x1

$ printf 'AAAAAAAAAAAAAAAA =\x00\x00\x01' | od -t x1
0000000 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
0000020 20 3d 00 00 01
0000025