OverTheWire_Wargame Leviathan

[ level3 -> level4 ]




이번 문제는 trash 폴더가 숨김 속성으로 꽁꽁 숨어있었습니다. 해당 폴더로 들어가서 ls를 때려주면 bin이라는 바이너리가 존재하는데, 실행시켜보니 다수의 2진코드들이 나타났습니다. 일단 gdb로 분석 해 보도록 하죠.



일단 시작하자마자 fopen으로 파일 하나를 열어둡니다. 그리고 fgets 함수로 어떤 값을 받네요. 그리고 putchar 함수가 있는 것을 보니, putchar 함수를 통해 한 바이트씩 출력을 해 주는 것 같습니다.

fopen을 호출 할 때 상수값을 이용하여 인자를 입력받기 때문에 해당 상수에 어떤 값이 들어있는 지 확인해보도록 합시다.




fopen 함수는 f = fopen("/etc/leviathan_pass/leviathan5", "r"); 와 같이 실행이 된 모양입니다.

그리고 곧바로 if함수로 해당 FILE 포인터(ex. f)가 존재하지 않을 경우(파일이 존재하지 않을 경우) 프로그램을 즉시 종료시킵니다.

정상적으로 파일이 열렸을 경우에는 fgets로 값을 입력받는데, if문에서 FILE 포인터를 검사 할 때 사용했던 [esp+0x1c]를 다시 사용하는 것을 보니, leviathan5로 통하는 패스워드가 들어있는 파일을 읽어내는 듯 합니다.

분석해보면 fgets(buffer, 256, f); 와 같이 사용을 한 것 같습니다.

그리고 아래쪽으로 jmp 등으로 분기하는 부분이 여럿 있는데, 디버깅 능력이 부족하다 보니 이것까지 분석을 하지는 못했습니다.

하지만 putchar 함수를 이용하여 1바이트씩 찍어내는 부분이 있으며, 따로 암호화 하는 부분은 보이지 않기 때문에 해당 파일의 내용을 1바이트씩 출력한 것으로 예상하고 값을 찾아냈습니다.


01010100 : 0x54 : T

01101001 : 0x69 : i

01110100 : 0x74 : t

01101000 : 0x68 : h

00110100 : 0x34 : 4

01100011 : 0x63 : c

01101111 : 0x6f : o

01101011 : 0x6b : k

01100101 : 0x65 : e

01101001 : 0x69 : i

00001010 : 0x0a : 개행


Tith4cokei


Leviathan5 계정의 패스워드로 위 문자열을 집어 넣었더니 정상적으로 접속이 되었습니다.





+ Recent posts