linux环境下shellcode的编写
shellcode的理解
我们在做pwn的时候经常需要使用shellcode来获取到flag,那么shellcode如何理解,简单一句话就是:获取到shell的code就是shellcode。
在漏洞利用过程时,我们将精心编制好的shellcode通过有问题的程序写入到内存中,然后执行。该shellcode对应的c语言代码一般为:
system("/bin/sh");
也就是说我们将上述的c语言代码翻译成汇编语言,然后进一步翻译成opcode(汇编语言对应的十六进制表示),最后按照正确的大小端顺序存放到内存中。通过一定手段让shellcode执行,然后我们就会得到linux下的交互终端。至于如何注入shellcode,如何让其执行,以及在复杂的题目条件下对shellcode进行拆分、组装以及重新编码(去掉特殊字符)等,此处不讲解,可以参考我其它的博文,重在积累。
使用pwntools工具编写
对于一般pwn的shellcode题目求解,我们可以直接利用python的库pwntools来自动生成shellcode。按照下面的步骤进行即可:
# 安装pwntools
pip install pwntools
# python3
from pwn import *
# 配置上下文
# context(os="linux", arch="i386") 32位系统
context(os="linux", arch="amd64") 64位系统
# 生成shellcode
code = shellcraft.sh()
print(code) # 汇编语言
print(asm(code)) # opcode,十六进制形式
print(len(asm(code))) # 查看汇编后的字节长度
自己实现更精炼的
对于一些读取输入大小有限制的题目,我们需要自己编写更短小的shellcode,下面我将分别介绍32位和64位的shellcode编写原理以及自己实现的更精炼的shellcode代码。这里展示的是汇编代