XCTF-forgot WP

Posted on Nov 2, 2020

这是我做的第一道处于进阶区pwn题。

checksec查看安全保护

中规中矩

到ida里反汇编一下,shift+F12发现有这么一个函数

所以调用它就是了

同时可以发现有两个溢出点,第一个溢出点只有32的上限,没什么用处,因为会发现,这里面若想直接改变调用的函数,就必须修改v14,然后v14正好离s 32个字节处,这里的fgets只读到32-1位哈哈哈哈哈哈哈哈哈哈。

所以就考虑使用第二个溢出点。这个不错,可以无限溢出。

我们再看看这个switch,会发现case 5之前的判断都比较麻烦,但是case 5之后就都是v2[i]在a~z中的时候就v14++,并且v14只会加到10,之后就是一直default break,

再结合栈中变量的分布,,当v14等于10的时候,就会调用v12中存的函数,所以我们可以考虑改变v12的指向的函数位置,这个很容易,只要覆盖掉就可以了

看一眼exp,'a'*0x44+p32(..)(注意!必须是a~z中的字母,不然没法通过switch)把v12指向的函数地址变为了有cat flag的函数,然后通过'a'*0x20+p32(0x8)把v14修改为8,之后的for中就可以把v14变成10了。当然0x5-0x7也是(应该)可以的(0x6是可以的,我测了),那么为什么不一开始直接赋给v14 10或9呢,这是因为0x9和0x分别是

scanf读到这些的时候就停了,然后就玩完了,所以必须要是0x8(或者之前一点)

这个还挺恶心的,所以要留点心。