攻防世界新手练习区之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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2022-03-13 12:04  Eip的浪漫  阅读(136)  评论(0)    收藏  举报