XCTF-Mary_Morton WP

Posted on Nov 3, 2020

这是一道格式化字符串和栈溢出结合的题目,也是我第一次smash了canary:)

发现有canary和栈不可执行。

然后到IDA里面看一下

我们发现确实有有栈溢出和格式化字符串的漏洞。栈溢出由于有Canary,不能直接用,所有我们可以考虑用格式化字符串来泄露Canary,然后再写回栈时不改变Canary,就可以返回到

这里了。

首先我们考虑泄露Canary,先构造字符串aaaaaaaa-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p,看一下输出

我们可以发现aaaaaaaa在第六个参数上(这里前面几个参数是栈中的buf前面的参数,但其实对这个我还不是很了解,准备以后再好好补补,现在就先用着),这里我们看到buf在)0x90处,是第六个参数,(0x90-0x8)/0x8=17,所以我们就知道Canary在第23个参数上,于是格式化字符串为%23$就可以泄露出Canary的值。

有了Canary,我们就可以进行栈溢出。

首先我们要知道在有Canary的时候,栈帧的结构是改变的

我们也可以理解为多了一个不能改变的局部变量,又有,所以偏移就是'a'*0x88。

最后的exp: