惯例checksec发现开了,但也没开。
打开IDA进行分析
main函数很简洁,也没有内套其他函数。有一个很明显的溢出漏洞,可以通过read函数来把♂栈♂填♂满。那么如果我们把ret地址填写成我们想要的函数,就可以对他进行调用。看看本题题目,名副其实了属于是。
很明显,我们可以使用printf函数泄露libc基址。
printf函数的形式大概像这样:printf(“%s“,Moriarty),其中格式化字符串是第一个参数,放在rdi中,第二个参数放在rsi中。很明显的,我们应该想办法把rdi覆盖成一个格式话字符串,然后把rsi覆盖成我们想泄露的地址。
使用gadget工具,找到了一个pop rdi指令。
再使用gadget工具,又找到了一个pop rsi,只是后面跟了一个pop r15.没关系我们可以任意对其进行填充。然后再ret到printf函数即可。
我们要找一个格式化字符串来当填充rsi,很容易找到
接下来构造payload如下:
通过libcsearcher得到libc基址
接下来将rdi府改为/bin/sh,syscall便可。
学到一个小技巧,接收地址的时候可以用下面这行代码:
最后得到flag
我在想,是不是可以不用文件里的格式话字符串,通过自己写入一个%s,再通过确定偏移找到他在栈里的位置。下次可以试试