#About
[그림 1] - darknight.c 소스 코드 확인
#Solution
[ + ] 소스 코드 해석
1. buffer라는 변수 선언 및 40바이트 할당
2. 사용자 입력 값인 argv[1]로부터 41바이트 만큼 복사 후 출력
해당 소스코드에서는 buffer로부터 41바이트를 읽으므로 EBP의 1바이트를 변조할 수 있으며 이를 FPO(Frame Pointer Overflow)라고 한다
이를 이해하기 위해서는 먼저, 함수의 에필로그 과정을 이해하여야한다. 에필로그 과정은 leave-ret 과정으로, esp를 ebp로 옮기며,
ebp+4 부분인 리턴 값을 eip에 넣고 실행한다. 구체적인 방법은 아래의 과정을 통해 이해하길 바란다
[그림 2] - 임의의 페이로드 삽입 및 EBP 확인
임의의 페이로드를 삽입해줌으로써 core 파일을 얻을 수 있었으며 core 파일의 분석을 통해 빨간색 부분이 EBP 임을 확인할 수 있다.
만약 EBP의 마지막 바이트를, buffer의 1byte 오버플로우를 통해 0x08048500이라는 값을 가지고 있는 주소인 0xbffffa7c로 변조하면 어떻게 될까?
함수의 에필로그 과정을 거치면서 esp는 ebp인 0xbffffa7c로 이동할 것이며 또한 리턴 값을 eip에 담기 위해 ebp+4의 값을 참조할 것이다
ebp+4의 값은 초록색부분으로 buffer의 시작 주소를 가리킨다. 이는 오버플로우가 가능하고 buffer에 셸 코드를 넣으면 셸을 획득할 수 있음을 의미한다
따라서 아래와 같이 buffer에 NOP과 셸 코드를 삽입해준 뒤 0xbffffa7c로 EBP를 변조해주었더니 셸을 획득할 수 있었다
[그림 3] - golem 권한의 셸 획득
이와 같은 방식으로 darkknight에 페이로드를 삽입해주면 역시 아래와 같이 셸을 획득할 수 있다
[그림 4] - 셸 획득
'Wargame' 카테고리의 다른 글
[Lord of Buffer Overflow] Bugbear > Giant (0) | 2017.11.25 |
---|---|
[Lord of Buffer Overflow] Darkknighht > Bugbear (0) | 2017.11.21 |
[Lord of Buffer Overflow] Skeleton > Golem (0) | 2017.11.21 |
[Lord of Buffer Overflow] Vampire > Skeleton (0) | 2017.11.21 |
[Lord of Buffer Overflow] Troll > Vampire (0) | 2017.11.21 |