ciscn_2019_sw_1
学习与收获
对于
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