17번째 풀이 문제이다!

요즘 시스템공부를 하는 겸 BOF 원정대 문제를 풀어 나갈것이다. :)

BOF 원정대 메인 화면



(메인 화면)



첫 계정은 gate : gate 이다.

들어가보게 되면 파일이 2개 있다.




(바이너리 파일)



mygremlin은 gdb 분석을 위해 내가 cp명령을 이용해 복사한 파일이다.

먼저 C코드를 확인해보자 :)



(C코드)



C코드를 보면 프로그램실행시 인자를 넘겨주어 동작하게 되어있다.
넘겨준 인자를 버퍼에 strcpy를 이용해 복사한다. 
버퍼의 크기는 256바이트. strcpy를 이용하기에 bof 취약점이 존재한다.

gdb로 분석을 해보면.



(AAA인자 전달)



먼저 입력이 어떻게 들어가는지 확인하기 위하여
AAA를 전달하였다.



(저장된 값 확인)



strcpy 함수 명령이 지난후 메모리를 덤프해 확인해보니 AAA가 들어가있는 것을 확인 할 수 있다.

사용할 쉘코드는 
\x31\xd2\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x52\x8d\x54\x24\x04\x52\x31\xc0\xb0\x0b\x8b\x1c\x24\x89\xe1\x31\xd2\xcd\x80
이며 32바이트이다.

총 256바이트(버퍼) + 4바이트(Saved EBP) + 4바이트(RET) 까지 덮어쓰면된다.
즉 우리 쉘코드
쉘코드(32바이트) + 패딩(228바이트) + RET주소(4바이트) 이렇게 맞출 수 있다.



(메모리 주소 확인)



코드가 올라갔을 때의 메모리 주소를 확인한다.

0xbffff918 에 우리의 쉘코드가 올라가게된다. 그러니 RET주소를 

0xbffff918로 덮어쓰면 된다.!



(덮어쓰기)



문제풀이를 위해 캡쳐하는 과정에서 오타가 나서 여러번 다시 찍고는 했다. 위 캡쳐에서 적혀있는 RET 주소는 잘못된 RET 주소이다. 하지만 과정상의 사진으로 보고 이해하면된다. 실제로 RET주소는 위에 우리가 구한 주소를 적어주면 된다.

아래는 주소부분에 C4개를 넣어 과연 주소부분을 잘 덮을지 실제 주소를 넣기 전에 테스트 해보고 있는 사진이다.



(RET주소)



RET주소에 C4개가 들어간 것을 확인 할 수 있다. 
이제 이 자리에 우리가 아까 구한 쉘코드의 위치 주소를 넣어주면 된다.

이제 우리의 gremlin을 실행시켜 인자를 전달해보자.



(인자 전달)



실행시 bof가 발생하여 쉘이 떨어지는 것을 확인 할 수 있다.
SETUID가 설정되어있기 때문에 gremlin의 비밀번호를 확인 할 수 있다.



(문제 해결)


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

(19/500) Lord of the BOF - goblin  (0) 2017.05.07
(18/500) Lord of the BOF - cobolt  (0) 2017.05.05
(16/500) Wargame.kr - ip log table  (0) 2017.04.20
(15/500) Wargame.kr - lonely guys  (0) 2017.04.18
(14/500) Wargame.kr - strcmp  (0) 2017.04.16

+ Recent posts