PwnTools学习
PwnTools学习
做题发现好多方法不知道,得系统的看看Pwntools
持续更新……
连接
本地用process(),远程用remote()。
IO模块
recv,send
send(data) # 发送数据 |
ELF模块
ELF模块用于获取ELF文件的信息,首先使用ELF()获取这个文件的句柄,然后使用这个句柄调用函数,和IO模块很相似。
下面演示了:获取基地址、获取函数地址(基于符号)、获取函数got地址、获取函数plt地址
'./filename') e = ELF( |
调试工具
- 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.
参考文章