本人也是在自学过程,主要目的也是记录学习过程,有些地方做的不太好,都是按照自己理解进行讲解的(不专业),欢迎大家指出问题
此处我将文件命名为pwn_fm
checksec pwn_fm查看一下保护机制
可以看到这是一个32-bit的文件,并且Canary,NX保护开启
将文件拖入ida,按F5将汇编代码转换成c语言代码,得到
可以看到printf(&buf)存在格式化字符串漏洞,当x等于4时得到shell。所以我们只需要将第n参数的内容改成x的地址,然后利用%n$n将x的值改成4,而且这里输出的字符串总数也就是我们x的地址,本来就是4个字节
(%n不输出任何字符,而是把当前已经输出的字符串总数,写入到对应参数所指的地址中)
回到虚拟机
gdb pwn_fm 动态调试一下
b *0x804859d(第一个read的地址,可以在ida里得到)
r
n
AAAAAAAA
stack 24
我们从此题的0xffffced4开始数第一个参数,到我们输入的AAAAAAAA就是第十一个参数
q
nano exp.py 开始写攻击脚本
payload中的0x804a02c是x的地址,在ida里双击x可以看到,%11$n中的11就是第十一个参数,在上方已经讲解过了
保存退出
python3 exp.py
得到flag
CTF2{55a73db9-6d7e-45cf-98f4-0360856c0966}
此题完