Leviathan Level 1 입니다.
리버싱 문제입니다만, 제가 리버싱에 대해 전혀 모르던 상태라 따로 리버싱 공부를 한 후에 문제 해결에 성공하였습니다.
홈디렉터리에 있는 문제파일 "check" 입니다.
SetUID 비트가 설정되어 있고, 소유자는 leviathan2 입니다. 저 프로그램을 실행하는 동안 leviathan2 의 권한을 얻게 되는 겁니다.
프로그램을 한번 실행시켜 보겠습니다.
./check
password 입력을 요구하네요. "1234"를 입력해 보았지만 틀린 password라고 쫓겨났습니다.
아무래도 리버싱을 통해 password를 알아내는 문제인 것 같습니다.
r2 -d check
r2 : radare2(리버싱 프로그램)를 실행하는 명령어
-d : 디버깅 모드로 실행
저는 리버싱을 위해 radare2 프로그램을 사용하겠습니다. 디버깅 모드로 바로 실행시켜 줍시다.
aaaa
aaaa : 프로그램을 분석하는 명령어
aaaa 명령을 입력해 프로그램을 분석해 줍니다.
afl
afl : 분석된 함수 리스트를 출력해줌
afl 명령어로 함수 리스트를 출력하였습니다. 가운데 약간 위쪽에 main 함수가 존재하죠?
일반적으로 프로그램의 중심이 되는 "main" 함수를 기준으로 분석해 보겠습니다.
s @ main
s : 현재위치(탐색위치)를 변경하는 명령어
s 명령어를 통해 현재위치를 main함수의 시작 위치로 변경하였습니다.
pdf : disassemble된 함수를 출력합니다. 현재위치 기준으로 출력하며, @ [함수이름] 으로 따로 지정해줄 시 해당함수 기준으로 출력할 수도 있습니다.
pdf 명령어로 main함수를 출력하였습니다.
9230,9235 부분을 보시면, "password: " 문자열을 출력하고 있는걸 알 수 있습니다.
우리가 아까 프로그램을 그냥 실행했을 때 password: 문자열이 출력되고 passwor입력을 요구했죠? 여기가 그 부분입니다.
이어서 923d,9242 부분을 보시면, getchar함수로 입력을 받고 있으며 해당 값을 var_24h의 위치에 저장하고 있습니다.
아마도 우리의 입력값이 var_24h 위치에 저장되는 게 아닌가 싶습니다.
lea 명령어로 var_20h와 var_24h를 스택에 저장한 후,
strcmp 함수를 호출하여 두 문자열을 비교하고 있습니다.
strcmp 함수는 두 문자열이 같을 경우 0을 출력하고, 앞의 값이 작으면 -값, 앞의 값이 더 크면 +값을 출력합니다.
var_24h는 우리가 입력한 password라고 생각해볼 수 있지만, var_20h엔 어떤 값이 존재하는 걸까요?
약간 위쪽을 보시면, mov 명령어를 통하여 "sex" 라는 문자열이 var_20h 의 위치에 저장되고 있는 걸 알 수 있습니다.
따라서, strcmp 함수를 호출하여 우리가 입력한 password와 "sex" 문자열을 비교하고 있는 것입니다.
이후 test eax, eax 비교구문을 실행하고 jne 라는 점프명령어가 있는데요.
test eax, eax는 쉽게 말해서 eax의 값이 0인지를 확인하기 위한 명령입니다.
test 명령어는 쉽게 말해 and연산입니다. 따라서 eax값이 0일때만 0 and 0 연산이 실행되어 출력값이 0이 되겠죠.
그리고 출력값이 0이라면, Zero Flag가 "1"로 셋팅됩니다.
(and연산은 같은 값을 넣을 경우 그 값이 그대로 출력됨, eax and eax -> eax)
jne는 Zero Flag가 "0" 일 경우 지정된 위치로 점프하는 명령어입니다.
종합해보면, 입력한 password가 "sex" 일 때 점프하지 않고 진행하는 것 입니다.
점프하지 않고 진행하였을 때(password가 일치할 때) 프로그램의 진행입니다.
9281 부분을 보시면 setreuid 함수로 권한을 변경해주고 있습니다. (SetUID로 인해 권한이 변경되는 부분인듯)
928c, 9291 부분을 보시면 /bin/sh 를 system 함수로 실행하고 있습니다. 즉 "쉘"을 실행하는 것입니다.
점프한 후 진행하였을 때(password가 일치하지 않을 때) 프로그램의 진행입니다.
push 명령어를 통해 Wrong password Good Bye 문자열이 스택에 저장된 후
puts 함수를 통해 해당 문자열이 출력됩니다.
종합하자면, password로 "sex"문자열을 입력하면 leviathan2의 권한으로 쉘이 실행된다고 할 수 있겠습니다.
한번 시도해 봅시다.
q
q : radare2를 종료하는 명령어
일단 radare2를 종료해 줍니다.
예상대로 "sex"를 입력했더니 쉘이 실행되었습니다!!
과연 leviathan2의 권한일까요?
id
id : 현재 계정의 권한을 확인하는 명령어
id명령어로 확인해 보았더니, leviathan2의 권한이 있습니다.
이제 password를 확인하는 일만 남았습니다.
bash
cat /etc/leviathan_pass/leviathan2
bash쉘로 바꿔준 후 leviathan2 파일을 확인했습니다. ( bash쉘로 굳이 바꾸지 않아도 됩니다 )
이렇게 다음 레벨의 password를 획득할 수 있었습니다.
'Hacking > [System]Leviathan' 카테고리의 다른 글
OverTheWire [Leviathan Level 5] (0) | 2023.05.24 |
---|---|
OverTheWire [Leviathan Level 4] (0) | 2023.05.24 |
OverTheWire [Leviathan Level 3] (0) | 2023.05.24 |
OverTheWire [Leviathan Level 2] (0) | 2023.04.10 |
OverTheWire [Leviathan Level 0] (0) | 2023.04.05 |