首先需要 from pwn import *
把 pwntools 导入进来,它同时会把一些系统库给导入进来
本地打的话 p=process('./filename')
,远程的话 p=remote('192.168.1.103',10001)
p.close() 关闭
发送 payload
p.send(payload)
发送 payload
p.sendline(payload)
发送 payload,并进行换行(末尾\n)
p.sendafter(some_string, payload)
接收到 some_string 后, 发送你的 payload
p.sendlineafter(some_string, payload)
接收到 some_string 后, 发送你的 payload,加个换行
接收返回内容
p.recvn(N)
接受 N(数字) 字符
p.recvline()
接收一行输出
p.recvlines(N)
接收 N(数字) 行输出
p.recvuntil(some_string)
接收到 some_string 为止
p.interactive()
直接进行交互,相当于回到shell的模式,一般在取得shell之后使用
生成 shellcode
asm(shellcraft.sh())
首先需要 elf=ELF('./filename')
来产生一个对象
elf.symbols['a_function']
找到 a_function 的地址
elf.got['a_function']
找到 a_function的 got
elf.plt['a_function']
找到 a_function 的 plt
elf.next(e.search("some_characters"))
找到包含 some_characters 可以是字符串,汇编代码或者某个数值的地址
rop = ROP('./filename')
还是要先创建一个对象
rop.raw('a'*32)
在构造的 rop 链里面写 32 个 a
rop.call('read', (0, elf.bss(0x80)))` 调用一个函数,可以简写成:`rop.read(0, elf.bss(0x80))
rop.chain()
就是整个 rop 链,发送的 payload
rop.dump()
直观地展示当前的 rop 链
rop.migrate(base_stage)
将程序流程转移到 base_stage(地址)
rop.unresolve(value)
给出一个地址,反解析出符号
rop.search(regs=['ecx','ebx'])
搜索对 eax 进行操作的 gadgets
rop.find_gadget(['pop eax','ret'])
搜索 pop eax ret 这样的 gadgets
引用自pwntools使用 · 语雀 (yuque.com)以供方便使用。