Leviathan Level 3 입니다.
저번 레벨과 비슷하게, SetUID가 설정된 실행파일이 있습니다.
소유자는 leviathan4 이니, 이 파일을 잘 이용하면 다음 레벨의 권한을 얻을 수 있을 것 같습니다.
인자 없이 실행시켜 보았습니다. 패스워드를 요구하길래 1234를 입력해 보았습니다만, 틀린 패스워드라고 나오네요.
리버싱을 통해 패스워드가 무엇인지 알아내야 할 것 같습니다.
저는 radare2 이용하겠습니다.
radare2로 level3 파일을 실행해주고, aaaa 명령어로 프로그램을 분석했습니다.
이후 afl 명령어로 함수목록을 불러왔습니다. 그런데 main 함수가 보이지 않네요..
어떤 함수를 먼저 살펴볼까 하다가, main은 아니지만 dbg.main 함수를 찾았습니다.
일단 이 함수부터 살펴보겠습니다.
pdf @ dbg.main 명령어로 dbg.main 함수를 호출했습니다.
이것은 dbg.main 함수의 마지막 부분인데요, 맨 위를 보면 Enter the password 문자열을 출력하는 것을 볼 수 있습니다.
우리가 프로그램을 실행했을 때, Enter the password 문자열을 보았으니 최소한 저 부분까지는 진행된다는 뜻 이겠죠?
하지만, 이 함수엔 패스워드가 틀렸을 때 출력되는 wrong 문자열이 보이지 않습니다. 물론 성공했을 때 진행되는 부분도요.
0x08049364 부분을 보시면, dbg.do_stuff 함수를 호출하는 것을 알 수 있습니다. 이후의 과정이 저 함수에서 진행되는 것 같습니다. dbg.do_stuff 함수를 확인해 봅시다.
dbg.do_stuff 함수입니다. 사진 가장 윗부분에 strcmp 함수로 문자열 비교를 하고 있습니다.
이후 문자열이 일치할 경우, You've got shell 문자열을 출력한 후 맨 아래쪽 부분에선 /bin/sh 쉘을 실행하고 있네요.
이것은 올바른 패스워드를 입력했을 때의 진행으로 보입니다. 이 프로그램은 SetUID가 설정되어 있으니, 쉘을 실행시켜 준다는 건 다음 레벨 권한의 쉘을 준다는 뜻이니까요.
여긴 패스워드 입력에 실패했을 경우의 진행입니다. 점프구문을 통해 아래쪽 실패부분으로 오게 되는데요.
bzzzzzap. WRONG 문자열을 출력하는 게 보이시죠?
여기로 오지 않고 쉘을 획득하기 위해서는, 앞선 비교구문에서 올바른 패스워드를 입력해야 한다는 뜻입니다.
자 다시 위쪽으로 와서, strcmp 비교구문입니다. strcmp 위쪽을 보면 push eax 명령을 통해 스택에 값을 저장한 후 두 값을 비교하고 있습니다.
저 두 값중 하나는 우리가 입력한 값, 하나는 올바른 패스워드가 아닐까 싶은데요.
break point를 설정한 후 저 부분에서 멈춰서, eax 레지스터 값을 확인해 봅시다.
저는 push eax 부분을 breakpoint로 설정했습니다.
db 명령어로 breakpoint 설정을 한 후, dc 명령어로 프로그램을 실행했고, 패스워드로 1234를 입력했습니다.
그리고 지정해둔 포인트에서 멈춘 것을 확인할 수 있습니다.
V 명령어로 Visual mode로 들어와서, 직접 breakpoint를 확인했습니다. push eax 부분에 잘 걸려 있네요.
과연 저기에 무슨 값이 담겨 있는지 확인해 볼까요?
dr 명령어로 레지스터 값을 확인 후, 해당 주소의 값을 px 명령어로 확인했습니다.
"snlprintf" 문자열이 저장되어 있군요. c언어 함수 아닌가? 했는데, 그건 snprintf 입니다. 따라서 이 값은 그냥 문자열입니다.
Visual Mode에서 S 명령어로 스텝오버를 두번 진행했습니다. 비교값이 무엇인지도 확인해 봅시다.
1234네요. 1234라... 이건 우리가 처음에 입력했던 패스워드값 이군요.
정리하자면 strcmp함수는 snlprintf와 1234를 비교하는 것이었네요.
그렇다면 패스워드가 snlprintf 인 것일까요? 확인해 봅시다.
오! 쉘을 획득했습니다. 패스워드는 snlprintf가 맞았습니다. 그렇다면 권한은?
leviathan4의 권한입니다. 이제 다음레벨 password를 확인하는 일만 남았네요.
이렇게 리버싱을 통해서 문제를 해결하고, leviathan4의 password를 획득할 수 있었습니다.
솔직히 전 레벨보다 훨씬 쉬웠습니다. 다만 다른 점이라면 main함수가 없었다는 점 정도네요.
'Hacking > [System]Leviathan' 카테고리의 다른 글
OverTheWire [Leviathan Level 5] (0) | 2023.05.24 |
---|---|
OverTheWire [Leviathan Level 4] (0) | 2023.05.24 |
OverTheWire [Leviathan Level 2] (0) | 2023.04.10 |
OverTheWire [Leviathan Level 1] (0) | 2023.04.09 |
OverTheWire [Leviathan Level 0] (0) | 2023.04.05 |