Hacking/[System]Leviathan

OverTheWire [Leviathan Level 4]

양선규 2023. 5. 24. 15:30
728x90
반응형

Leviathan Level 4 입니다.

 

 

숨겨진 디렉터리

 

숨겨진 디렉터리 .trash 가 있네요.

 

 

.trash 디렉터리

 

.trash 디렉터리 안에, bin 이라는 SetUID가 설정된 파일이 있습니다.

이 파일을 이용해서 다음 레벨 password를 획득할 수 있을 것 같습니다.

 

 

인자 없이 실행

 

인자 없이 실행해 보았습니다. 2진수가 나오는데요.

.....솔직히 이거 보자마자 감이 와서 리버싱 할 필요도 없이 바로 풀었습니다.

 

2진수를 아스키코드로 변환했더니 그게 바로 다음 레벨 password였습니다.

하지만 이렇게 끝내면 배우는 게 없으니 간단하게라도 분석을 해보겠습니다.

 

 

main함수

 

main함수 입니다.

일단 시작하자마자 fopen 함수를 통해 leviathan5의 password 파일을 열고 있습니다.

이후, 아래쪽 fgets 함수로 password값을 꺼내왔습니다.

 

 

매우 복잡함

 

음... 많은 점프구문으로 복잡하게 이루어져 있습니다. 많은 조건문들이 달린 반복문 입니다.

간단하게 진행을 살펴보면..

 

 

길이를 잰다

 

가장 먼저 출력값의 길이를 잰 후(맨 윗줄 cmp), 그 길이가 8자리가 되었을 경우 띄어쓰기를 합니다(push 0x20 그리고 밑에 putchar).

아까 bin 프로그램을 실행했을 때, 01010000 11010100 이런식으로 8개씩 띄워져 있었죠? 그렇게 만드는 부분입니다.

 

 

1또는 0

 

여기는 2진수 숫자를 생성하는 부분입니다. 어떠한 조건에 의해서 1 또는 0을 출력하게 됩니다.

물론 출력하기 전에 매번, 위에 있던 길이검증을 수행합니다.

 

정리하자면 이 프로그램은 leviathan5의 password 파일을 읽어와서, 그 값을 2진수로 8자리씩 끊어 출력해주는 프로그램 이었던 것입니다.

이제 우리가 할 일은 2진수를 아스키코드로 변환해 주는 것 뿐입니다.

 

 

password_list = ['01000101', '01001011', '01001011', '01101100', '01010100',
                 '01000110', '00110001', '01011000', '01110001', '01110011', '00001010']
password = ""

for i in password_list:
    password += chr(int(i,2))

print(f"leviathan5 password : {password}")

 

저는 파이썬 코드를 이용해 변환해 주었습니다.

2진수 값을 리스트로 저장해서 반복문으로 만들었습니다.

 

chr 함수는 숫자를 아스키코드로 바꾸어 줍니다.

int는 어떤 값을 10진수로 바꾸어주는 함수이고, 2를 입력하여 해당 값은 2진수라는 것을 알려주었습니다. 

 

password 획득

 

실행 결과입니다. 이렇게 다음 레벨 password를 획득할 수 있었습니다.

728x90
반응형