#About


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




#Solution


이전 문제와 달라진 점이라면 Fake EBP 기법의 사용을 막기위해, strcpy 함수가 진행되어 오버플로우가 발생하여 


SFP 값이 변조가 되었을 경우에 대비해 SFP 값을 복원해오는 과정을 거친다


[그림 2] - 복원 된 SFP 값 확인


위 그림은 함수의 에필로그 과정의 시작점인 leave에 중단점을 걸어둔 뒤, buffer 256byte + dummy 8byte의 총 264byte와 


변조할 EBP 값인 BBBB, 변조할 리턴 값인 CCCC를 넣은 상황이며, EBP 값이 변조 되지 않고 다시 복원된 것을 확인할 수 있다


이러한 상황에서 주어진 hint는 RET sleding이며, NOP Sleing이 아무런 동작을 하지 않는 0x90을 타고 흐르듯, 


RET sleding 역시 RET을 이용하여 메모리를 타고 흐르는 것과 비슷한 개념이라고 생각하면 쉬울 것이다


[그림 3] - 오버플로우에 필요한 ret 명령의 주소 및 execl 함수 주소 확인


위 그림은 [그림 2]에서 RET 값을 CCCC를 넣어주었던것과 달리, 계속 ret 명령이 위치한 주소를 넣어줌으로써 


pop eip를 계속적으로 수행하게 되고 결과적으로 스택에서 원하는 주소로 이동할 수 있게 된다.


execl 함수는 NULL 값으로 인자의 끝을 알리므로 execl 함수를 사용하기 위한 적절한 메모리 공간을 찾아야한다


[그림 4] - execl 함수가 위치할 스택 공간 확인


위 그림은 RET sleding 기법을 통해 execl 함수가 위치해야할 주소를 확인한 것이며 이는, 함수의 인자가 ebp+8, ebp+c, ...가


 되므로 실행 파일 이름은 ebp+8이 될 것이며 인자의 끝을 나타내는 0x00000000이 ebp+c에 위치하기 때문이다


먼저 ebp+8에 해당하는 주소에 위치하는 값을 확인하면 아래와 같다


[그림 5] - ebp+8 값 확인


확인 결과, 0x0083ed3c이며 이는 execl(0x0083ed3c,0x00000000)와 같이 실행될 것이므로, 아래와 같이 셸을 띄우는


 C 코드를 작성해주고 0x0083ed3c의 이름으로 심볼릭 링크를 걸어주었으며 그 과정은 아래와 같다


[그림 6] - 셸을 띄우는 C 코드 작성 및 컴파일


[그림 7] - 심볼릭 링크 설정


[그림 4]에서 확인할 수 있듯, RET sleding 기법을 통해 execl 함수를 적절한 인자가 위치하는 메모리 주소에 삽입시키기 


위해서는 ret 명령이 위치하는 주소를 세번 넣어준 뒤 execl 함수의 주소를 적어주면 되고 페이로드는 아래와 같다


[그림 8] - 최종 페이로드 확인


execl 주소 값 중 0x20이라는 값은 공백을 의미하여 에러가 출력되므로 에러를 방지하기 위해 페이로드 앞 뒤에 더블쿼터를 붙여주었다



'Wargame' 카테고리의 다른 글

[FEDORA CORE 3] Hell_fire > Evil_wizard  (0) 2017.12.23
[FEDORA CORE 3] Dark_eyes > Hell_fire  (0) 2017.12.21
[FEDORA CORE 3] Gate > Iron_golem  (0) 2017.12.17
[DISK] Root Me > Find the cat  (0) 2017.12.14
[MEMORY] Root Me > Command & Control level 6  (0) 2017.12.14

+ Recent posts