温馨提示:本期全是干货!!!
保护全开,64位,动态编译,IDA查看:
程序的大体是一个循环,循环的内容是让我们读入一个数,判断是不是1,如果是1就让我们读入一次,无法栈溢出,但是存在格式化字符串漏洞,随后进行下一次循环,直到我们读入的数不是1,就结束循环
既然存在格式化字符串漏洞可以利用,那第一步肯定得先泄露出libc基址与一个栈地址(格式化字符串漏洞常规思路)
随后将某个函数的返回地址修改为one_gadget地址,libc基址用于one_gadget地址,栈地址用于求出返回地址
有些看过我之前写的格式化字符串漏洞修改__stack_chk_fail函数的got地址的朋友就想到了用fmtstr_payload(偏移,{被修改的got表:改之后的地址})来修改,没看过的可以去了解了解
https://blog.youkuaiyun.com/2301_79880752/article/details/135916347?spm=1001.2014.3001.5501
但是我要告诉你本题不可以哦,这也是为什么我们标题为手搓格式化字符串漏洞
由于本题的读入字节仅仅是0x30个,而我们用工具生成的payload远超0x30,因此我们需要手搓出修改返回地址的payload
其实也不难,不过这里我们要用到%$hn
学过格式化字符串漏洞的朋友应该都知道%$n的作用吧,那这个%$hn又是跟%$n又有