PwnTools学习

做题发现好多方法不知道,得系统的看看Pwntools

持续更新……

连接

本地用process(),远程用remote()。

IO模块

recv,send

send(data) # 发送数据
sendline(data) # 发送一行数据,相当于在末尾加\n
recv(numd=4096,timeout=default) # 给出接收字节数,timeout指定超时
recvuntil(delims, drop=False) # 接收到delims的pattern
recvline(keepends=True) # 接收到\n,keepends指定保留\n
recvall() # 接收到EOF
recvrepeat(timeout=default) # 接收到EOF或timeout
interactive() # 与shell交互

ELF模块

ELF模块用于获取ELF文件的信息,首先使用ELF()获取这个文件的句柄,然后使用这个句柄调用函数,和IO模块很相似。

下面演示了:获取基地址、获取函数地址(基于符号)、获取函数got地址、获取函数plt地址

>>> e = ELF('./filename')
>>> 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

调试工具

  • Linux下 可以使用binutils的objdump工具来查看目标文件内部结构
  • Linux下 还可以使用readelf来解析ELF文件

ELF动态链接文件被称为动态共享对象,简称共享对象,它们一般都是以”.so”为拓展名的文件;而在Windows中,动态链接文件被称为动态链接库,他们通常就是平时常见的“.dll”为拓展名的文件。

GOT与PLT

全局偏移表(GOT)

对于类型三,我们需要用到代码地址无关(PIC)技术,基本的思想就是把跟地址相关部分放到数据段里面。

ELF的做法是在数据段里建立一个指向这些变量的指针数据,称为全局偏移表(GOT),当代码需要引用该全局变量时,可以通过GOT中相对应的项间接引用。

延迟绑定(PLT)

动态链接以牺牲一部份性能为代价。PLT是另一种优化动态链接性能的方法。

在动态链接下,程序模块之间包含了大量的函数引用,所以在程序开始执行前,会耗费不少时间解决函数引用的符号查找以及重定位。
但是,在一个程序运行过程中,可能很多函数在程序执行完时都不会被用刀,比如一些错误处理函数。
所以ELF采用了一种叫做延迟绑定的做法。
基本思想:就是当函数第一次被用到时才进行绑定。如果没有用则不进行绑定,所以在开始时模块间的函数调用都没有进行绑定,而是需要用到时才绑定。

数据处理

主要是对整数进行打包,就是转换成二进制,比如转换成地址。p32、p64是打包,u32、u64是解包。

DynELF

DynELF是leak信息的神器。前提条件是要提供一个输入地址,输出此地址最少1byte数的函数。官网给出的说明是:Given a function which can leak data at an arbitrary address, any symbol in any loaded library can be resolved.

参考文章