学习与收获
对于
RELRO保护,有以下3种情况:No RELRO:init.array,fini.array,got.plt均可读可写PARTIAL RELRO:init.array,fini.array可读不可写,got.plt可读可写FULL RELRO:init.array,fini.array,got.plt均可读不可写程序在加载的时候,会依次调用
init_arry中的每一个函数指针,程序在结束的时候,会依次调用fini_array中的每一个函数指针,而我们可以修改其中的函数指针为main函数地址,使main函数再执行一次。一般来说,这个数组的长度为1,也就是说只能写一个地址。有时候思路对了一直打不通,可能是参数偏移量算错了。
保护&源码
保护:

源码:
int __cdecl main(int argc, const char **argv, const char **envp) |
思路
程序中有一个格式化字符串漏洞,但只能执行一次格式化漏洞函数,有system函数。我们可以看到printf(format)后面main函数就执行完了,所以不管我们修改哪一个函数的got表值为system@plt的地址,都不行。后来看wp,发现我们可以修改fini_array的函数指针为main函数地址,这样就能再执行一次main函数了。
刚开始用下面这个方法,泄漏我们输入的第一个参数在栈中的偏移量,以为是4,一直打不通,调试的时候查看栈中的值,发现栈中的第1,2和5个参数都是我们输入的第一个参数,所以我们并不能确定准确的偏移量


然后我发送下面这个payload
payload = b'aaaabbbb'+b'%p%p%p%p%p' |
现在可以看出泄漏的第1个参数地址是栈中的第2个参数,也就是说我们计算偏移量的时候要从02这个序号开始往下数

exp
from tools import * |
拿到flag
