攻防世界新手练习区之CGfsb(PWN)
题目链接:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5050&page=1
第七次做pwn题记录
0x01
首先运行一下
有两个要我们输入,checksec一下
是一个32位程序,emmm,开了金丝雀(栈保护)和NX(堆栈不可执行),第一次见栈保护
0x02这样程序基本就了解了,进入到IDA了,直接进入mian
可以看到,pwnme要等于8,就可以输出flag,那么问题来了,如何让pwnme等于8?
我们看pwnme == 8的上一行代码,printf(&s),但是我记得这种一般的格式是:printf("%s", s)这样吧,然后我看了一下网上的wp,原来这样写是不安全的字符串
其实是涉及到格式化字符串漏洞,那么就可以用%n(打印出来%n之前的字符个数,并且可以赋值给变量),那么这样不就可以让pwnme == 8了吗
但是还有一个问题,就是我们输入的数据的偏移量在哪里
我们可以在输入massage那里输入这一行代码
AAAA-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p
可以看到偏移量为10,数一下就知道了
0x03
那么exp就可以编写了
这里+aaaa是因为p32(pwnme)是编码以后是4,为了筹够8,所以加上aaaa
最终得出flag