19번째 푼 문제이다!
오늘은 BOF원정대의 고블린을 처치해보자!

고블린이 보인다.



(고블린)



먼저 C코드를 확인해보자.



(고블린 C코드)



C코드를 보니 코볼트 녀석과 동일하다. 다만 입력에 있어서 차이가 있다.

입력을 표준입력으로 넣어주기만 하면 동일하게 처치할 수 있다.

먼저 메모리 주소를 확인하기 위하여 gdb로 분석해보자.



(표준입력 메모리 위치)



표준입력이 어디에 올라가는지 확인해보자.
여기서 버퍼를 배열을 사용한다. 배열은 힙 자료구조와 같이 높은주소로 자라기 때문에 배열로 된 버퍼가 주어지면 RET 주소를 쉽게 덮어 쓸 수 있다.

먼저 주어진 배열 버퍼를 꽉채워보자. A 16개를 입력한다.



(메모리 상태)



16바이트가 A로 가득 찬 모습을 볼 수 있다. 마지막 00 널문자가 다음 메모리 영역으로 초과된 것을 볼 수 있다. 이제 우리는 여기서 +4바이트(Saved EBP자리) 를 A로 더 채워준 후 RET주소를 EBP+8의 주소로 덮어 쓸 것이다. EBP+8에 우리의 쉘코드를 올릴 것이기 때문이다. :)

그렇다면 우리가 쉘코드를 올릴 EBP+8의 위치를 먼저 살펴보자.



(쉘코드가 올라갈 위치)



쉘코드가 올라갈 위치까지 확인했다면 끝이다.

정리를 하면
A 20개를 입력한 후 그 뒤에 RET주소에 쉘코드가 올라갈 위치로 덮어쓴다. 그리고 그 뒤에 이어서 쉘코드를 올려서 입력할 것이다.

고!



(공격 성공)



바로 쉘이 떨어지는 것을 확인 할 수 있다.

whoami로 확인 후 my-pass를 확인해보면 고블린 문제도 해결할 수 있다.



(고블린 처치)


'WarGame > 500 Project' 카테고리의 다른 글

(21/500) Lord of the BOF - wolfman  (0) 2017.06.20
(20/500) Lord of the BOF - orc  (0) 2017.06.20
(18/500) Lord of the BOF - cobolt  (0) 2017.05.05
(17/500) Lord of the BOF - gremlin  (0) 2017.05.05
(16/500) Wargame.kr - ip log table  (0) 2017.04.20

+ Recent posts