这题出的很奇怪,本地调试不知道为什么出问题,远程也调了很久才通,希望路过的大佬提出更好的思路和解题方式!
查看一下保护:
开了canary,NX,部分打开RELRO,没开PIE,可以尝试got表的覆盖。
这里不能有时候全信,还是要打开IDA自己分析才行。
可以看到有明显的格式化字符串漏洞,看看怎么利用他。
要运行到格式化字符串漏洞,我们必须完成一个判定,我们进入CheckIn函数看看。
CheckIn函数其实就是程序产生一个随机数,然后需要我们输入一个数字,程序检查我们输入的数字和随机数是否一样,一样便可以进入下一阶段。
随机数的范围不大,我们就直接爆破就没问题了。
这里我选择的是手动爆破,反正概率很高,你也可以写try…Except…来写一个自动爆破的函数。
这里选择输入1,一直运行就有几率成功。
好的,进入格式化字符串漏洞的重头戏,由于程序运行到一次就会exit(0),我们首先利用格式化字符串漏洞把exit函数的got地址改写了(注意不是got表里边的地址)。
我们首先查看一下偏移:
这里可以看到有两种方式,一种是工具提供的偏移为7,另一种是