不太喜欢写博客,水平有限见谅。
记录一些关于pwntools的简单用法
exp是exploit的简写,可不是experience。
0x00. 下载pwntools:
现在需要sudo pip install pwntools就可以了(linux环境下,且环境应该是2.7)
安装好之后你就也拥有了checksec 查看当前ELF文件的保护情况
以及ROPgadget 可以从文件中搜索你需要的gadget(ROP的时候需要)。
0x01. 编写一个exp的基本框架:
from pwn import *
DEBUG # 自己设定值 在本地调试还是远程利用 当然这只是一种相对规范的写法,不写也无所谓
if DEBUG:
p = process(bin路径) # 在本地调试
else:
p = remote(ip, port) # 连接其他主机的服务 需要输入对应的ip地址和端口号
... # 输入payload来进行操作以拿到程序的shell
p.interactive() # 反弹shell
0x02. io交互:
形式都是str类型
recv():接受收到的所有字符
recvuntil(str):接收到第一次出现str的内容为止
recvline():接受一行
send(str):发送str的内容,
sendline(str):发送str的内容并加上回车("\n")发送,推荐优先于send
当不确定自己的io内容时,可以在exp开头加上context.log_level = "debug" 帮助调试
有时候可能会因为缓冲区的问题阻塞一部分数据,有时加上sleep调整可能会得到改善
0x03.打包解包数据:
这里就不详细介绍了,其目的就是为了把我们理解的数据转化成机器需要的数据形式
总之是大端序和小端序的问题,想了解可以去了解一下
打包数据可以一般常用p64() 和 p32() ,分别对应32位和64位的ELF,当然也有p8等这种不常见的操作。
解包数据则对应为u64() 和 u32()
0x04.bin文件的操作:
常用的形式有:
elf = ELF("binfilepath")
libc = ELF("libcpath")
这样我们就可以得到里面的一些信息,比如说PLT和GOT这些
得到程序bss段的起始位置:bss_base_addr = elf.bss()
PLT:例如:write_plt = elf.plt["write"]
GOT:例如:write_plt = elf.got["write"]
当然,上述这些都是在系统ASLR关闭的情况下才可以找得到的,否则只会得到一个偏移量
现在好像还加入了自带的自动化的rop链方法,不过我不会用
0x05.其他:
DynELF函数:
无libc情况下泄露某些地址,这个文章说的很详细了,当然推荐你需要的时候再看就好:
https://www.anquanke.com/post/id/85129
LibcSearch模块:
安装以及使用方法:
https://github.com/lieanu/LibcSearcher
gdb.attach():
一个方便我们调试的方法,我用的也不是特别好而且我的这个函数就有点问题......
不过,栈溢出题目IDA足够了。
其他的想到再继续补充......