第五空间2019 决赛 - PWN5

题目开了 canary 保护,不能栈溢出了。

漏洞在于题目把输入的字符串直接 printf 出来,这样就可以利用 printf 的格式化输出的漏洞。

(这也居然也能有漏洞囧)

printf 输出的时候,如果遇到了 % ,就会期望这后面跟着一个格式化字符串,并递增它的栈指针去找。如果字符串里的参数多于函数的参数,就会导致访问越界。

此外 printf 还有一个 %n 格式,可以把之前已打印的字符长度写到某个地址里,利用这个甚至可以进行任意地址读写。

利用格式化漏洞首先要找偏移量,即 printf 的栈指针增加到能访问到输出字符串的量。输出这样的字符 ‘AAAA %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x’,然后在结果里找 41414141 ,就是 AAAA 。

在这道题中,程序会先输出第一个输入,再把第二个输入和一个随机数比较,如果一样就执行 shell 。可以利用格式化漏洞把随机数覆写。

首先找到偏移量是 10 个字节,然后就可以构造输出 p32(addr) + b’%10$n’ ,这里 10$ 是偏移 10 个字节(n 是写一个字节)。这样就会把 addr 地址上的值写为 4(因为 p32(addr) 是 4 个字符)。

然后再输入 4 就可以比对成功。