#About


[그림 1] - iron_golem.c 소스 코드 확인




#Solution


[그림 2] - 메모리 보호 기법 NX(Non Executable stack) 및 Ascii Armor 설정 확인 


스택 영역이 가지는 권한 중 실행 권한이 미설정 되어 있음을 확인할 수 있고, 또한 Ascii Armor라 하여 라이브러리 영역의 최상위 1 바이트를


NULL 값을 넣어 줌으로써(ex : 0x00123456) RTL 공격 구성 시 연속적인 페이로드를 작성할 수 없게 만드는 기법을 확인할 수 있으며 


해당 파일을 확인한 경로에 대한 설명은 다음과 같다


/proc = 프로세스 정보를 보유하는 디렉터리

/proc/self = 현재 실행중인 프로세스의 디렉터리 표시

/proc/[pid]/maps = 고유 pid 값을 가지는 프로세스가 메모리 주소 공간에 맵핑된 정보 표시


또한 ALSR이라하여 스택의 주소 값을 랜덤하게 설정해줌으로써 셸 코드의 시작 주소 및 리턴 주소가 불분명해지고 


이로 인해 메모리 보호의 효과를 볼 수 있는 기법이 있으며 바로 아래에서 확인할 수 있다 


[그림 3] - 메모리 보호 기법 ASLR(Address Space Layout Randomiztion) 설정 확인


[그림 2]와 동일하게 확인 결과 메모리 주소 값이 변한 것을 확인할 수 있으며 이를 ASLR이라 한다


문제로 돌아와, [그림 1]의 소스를 확인하면 buffer에 256바이트를 할당하며, strcpy에서 오버플로우가 발생한다


[그림 4] - buffer 할당 크기 확인


실제로 256바이트를 할당하는지 확인해보았더니 0x108 즉, 264바이트를 할당함을 확인할 수 있었고 이는 dummy 8바이트가 붙음을 알 수 있다


따라서 스택의 구조를 표현하면 | buffer [256] | Dummy [8] | ebp [4] | RET [4] | 와 같아지며, 위에서 확인한 메모리 보호 기법으로 인해 LOB에서 사용하던 


셸 코드 삽입 및 리턴 주소 조작으로 인한 오버플로우 및 RTL 기법을 통한 리턴 주소에 연속적인 페이로드 작성을 할 수 없는 상황이다


hint를 확인하면 Fake ebp 기법을 이용하라 되어 있으며, ebp를 변조할 수 있다는 말은 ebp+4 영역을 참조하는 리턴 값을 


변조할 수 있다는 말과 같으며 이는 또한 ebp+8, ebp+c를 참조하는 인자 또한 변조할 수 있다는 말과 같아진다


ebp 값을 변조할 때 ASLR으로 인해 스택 영역의 주소가 계속 바뀌므로 GOT 영역이나 BSS 영역, 과 같이 주소가 변하지 않는 부분을 사용해야 하며


아래와 같이 readelf 명령을 이용하여 알고자하는 영역이 위치하는 주소를 확인할 수 있다


[그림 5] - readelf 명령을 통한 섹션 정보 확인


Ascii Armor로 인한 RTL을 할 수 없는 상황에서 먼저, 리턴 영역에 execl 함수를 넣어주고 Fake EBP 기법을 이용하면 


위에서 언급했듯 인자 값은 ebp+8, ebp+c, ... 로 확인하기 때문에 execl 함수의 인자 값을 컨트롤할 수 있게 된다


ebp 값을 변조해야할 부분은 주소 값이 변하지 않는 got 영역이 되어야하며 got 영역의 시작 주소는 


plt 영역에서 제일 처음 jmp하는 부분이며 [그림 5]에서 또한 확인할 수 있다


[그림 6] - GOT(Global Offset Table) 영역 확인


execl 함수는 int (excel const char * path, const char *arg0, ..., const char *argn, NULL);로 구성되기 때문에 위 [그림 6]과 매칭시켜보게 되면 


0x0804954c이 가리키는 값이 실행 파일명이 되며 세 번째 인자가 NULL이 되므로 인자로 사용하기에 적합한것을 확인할 수 있다


따.라.서 EBP가 위치해야할 곳은 GOT 영역주소 - 0x08이 되며 이는 거듭 설명하지만 인자가 ebp+8, ebp+c, ...에 의해 컨트롤되기 때문이다


GOT 영역의 시작주소는 0x08049618이며, 페이로드가 구성 될 때는 -0x08을 해주고 메모리 구성은 다음과 같아진다 


| buffer + dummy [264] | 0x08049610 | execl 함수 주소 + 3 | *0x0804954c | 0x00000000 |


이 때, execl 함수 주소 +3이 되는 이유는 excel 함수가 시작되며 진행되는 프롤로그 과정에 의해 ebp 값이 변하므로 


프롤로그 과정을 건너 뛰어야 하기 때문이다 ( 이때 생기는 의문은, 프롤로그 과정을 뛰어넘게 되면 함수의 흐름에 문제가 없는지 ? 궁금 )


또한 execl의 첫 번째 인자인 실행 파일이 가리키는 값을 확인 결과 아래와 같이 0x00000001이라는 값을 가지고 있음을 확인할 수 있다


[그림 7] - 실행 파일 명 확인


최종적으로 페이로드를 실행하게 되면 execl("1");이 실행될 것이며 이는 1이라는 파일을 실행하므로 


셸을 띄워줄 수 있게 끔 아래와 같이 shell.c를 작성해주고 심.볼.릭 링크를 통해 실행 흐름을 넘겨주면 된다


[그림 8] - shell.c 소스 코드 작성


(상) 소스코드 작성 (하) 심볼릭 링크 작성


[그림 9] - exploit



'Wargame' 카테고리의 다른 글

[FEDORA CORE 3] Dark_eyes > Hell_fire  (0) 2017.12.21
[FEDORA CORE 3] Iron_golem > Dark_eyes  (0) 2017.12.21
[DISK] Root Me > Find the cat  (0) 2017.12.14
[MEMORY] Root Me > Command & Control level 6  (0) 2017.12.14
[REV] 2017 TUCTF > Funmail  (0) 2017.12.14

+ Recent posts