下载
python3版本
这个就去看我写的pwn基础配置吧,一般而言不做老题目的话python3适配的pwntools完全够用了。不过我为了测试和学习一些老东西留下的宝贵信息,还是会用到适配python2的pwntools的。
pwn基础配置
python2版本
pwntools 从 4.0 版本开始完全移除了 Python 2 支持,依赖现代 Python 特性(如 asyncio)。
现在想用pwntools的python2版本只能用pwntools 3.14.1
检查python2和pip2
1 2
| python2 --version # 应输出 Python 2.7.18 pip2 --version # 应输出 pip 20.3.4 或类似版本
|
一般而言,可能没有python2.可以去看我写的另外一个工具笔记:
python2环境
如果上面ok了
1 2
| pip2 install --user pyelftools==0.27 pip2 install --user --upgrade 'pwntools<3.15'
|
使用
pwntools的使用非常简单,记住一些简单的函数就可以用起来了:
这边写一个简单的脚本,主要是看函数的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| from pwn import *
context(arch='amd64', log_level='debug', os='linux')
p = process('./binary')
p.send(b'data') p.sendline(b'data\n') p.sendafter(b'prompt: ', b'data') p.sendlineafter(b'prompt: ', b'data')
data = p.recv() data = p.recv(1024) data = p.recvline() data = p.recvuntil(b'delim') data = p.recvregex(b'pattern')
addr = 0x123456789ABCDEF0 payload = b'A'*40 + p64(addr) value = u64(b'\xef\xcd\xab\x89\x67\x45\x23\x01')
payload = fmtstr_payload(6, {elf.got.puts: elf.plt.system})
elf = ELF('./binary') rop = ROP(elf) rop.call(elf.plt.puts, [elf.got.puts]) rop.call(elf.symbols.main) p.sendline(rop.chain())
libc = ELF('./libc.so.6') puts_leak = u64(p.recv(6).ljust(8, b'\x00')) libc.address = puts_leak - libc.symbols.puts
rop = ROP(libc) rop.system(next(libc.search(b'/bin/sh'))) p.sendline(rop.chain())
shellcode = asm(shellcraft.sh()) p.sendline(shellcode)
p.interactive() p.close()
|