1.计算缓冲区的偏移量
我之前一直都是手工计算缓冲区的大小,但是有时候就是会出错我也找不到原因
选择找到了一个很好用的方法利用gdb的cyclic(但是只能用于计算缓冲区不能是精细地址)
原理:填入一段很长的字符串让程序报错,找到报错的地址,这个地址就是整个缓冲区的大小也包括了ebp/rbp那个位置的大小
cyclic 150
#生成150个随机的字符串
cyclic -l 0x地址
#找到这个地址对应的偏移量
但是写到后面会发现有时候没有报错地址:
这是因为64位的结构的内存地址不能大于0x00007FFFFFFFFFFF/6个字节的长度 否则会报错
这个时候可以用 x/x $rsp 来查看报错的地址,注意了如果报错了字节很长,根据小端序只能取后面的8个字符
也可以使用 x/wx rsp地址
2.pwntool.elf模块的使用
ELF模块的使用可以便捷找到got和plt的地址计算偏移量
from pwn import *
e=ELF('./text')
#只要将文件路径给ELF(path)就可以分析ELF
e.symbols['system']
#找到这个函数的地址,在这里就是找到system函数的地址
e.got['system']
#找到这个函数的got
e.plt['system']
#找到这个函数的plt
offset=e.symbols['system']-e.symbols['printf']
#计算偏移量,这里是计算system函数和printf函数之间的偏移量
binshaddr=next(e.search('/bin/sh\x00'))
#找到包含这个字符串的地址 这里是找到/bin/sh\x00这个字符串的地址