Pwntool

官网的一个简单样例

from pwn import *
context(arch = 'i386', os = 'linux')
r = remote('exploitme.example.com', 31337)
# EXPLOIT CODE GOES HERE
r.send(asm(shellcraft.sh()))
r.interactive()
基本上仿造这个格式就可以写exp了。
from pwn import *
用来导入pwntools模块
context(arch = 'i386', os = 'linux')
设置目标机的信息
r = remote('exploitme.example.com', 31337)
用来建立一个远程连接,url或者ip作为地址,然后指明端口 这里也可以仅仅使用本地文件,调试时方便:
r = process("./test")
test即为文件名,这使得改变远程和本地十分方便.
asm(shellcraft.sh())
asm()函数接收一个字符串作为参数,得到汇编码的机器代码。 比如
>>> asm('mov eax, 0')
 '\xb8\x00\x00\x00\x00'
shellcraft模块是shellcode的模块,包含一些生成shellcode的函数。 其中的子模块声明架构,比如shellcraft.arm 是ARM架构的,shellcraft.amd64是AMD64架构,shellcraft.i386是Intel 80386架构的,以及有一个shellcraft.common是所有架构通用的。 而这里的shellcraft.sh()则是执行/bin/shshellcode
elf = ELF('xxxx')
elf.symbols['callsystem']
读取一个elf文件,并获取其中callsystem函数的地址
r.send()
r.sendline() # 在发送的内容末尾加空格
shellcode发送到远程连接
r.interactive()
将控制权交给用户,这样就可以使用打开的shell了 数据打包 数据打包,即将整数值转换为32位或者64位地址一样的表示方式,比如0x400010表示为\x10\x00\x40一样,这使得我们构造payload变得很方便 用法:p32/p64打包一个整数,分别打包为32或64位 u32/u64解包一个字符串,得到整数 p对应pack,打包,u对应unpack,解包