Root-me Cracking 7번 문제입니다.
ELF Ptrace관련 문제입니다.
먼저, Ptrace가 어떤 기능을 하는지 알아보시죠.
(*참조URL : http://linux4u.kr/manpage/ptrace.2.html)
ptrace(process trace)는 유닉스/유닉스 계열 운영체제에서 사용되며
대상 프로세스의 내부 상태를 조사하고 조작하게 함으로써
한 프로세스가 다른 프로세스를 제어할 수 있는 시스템 호출입니다.
주로 디버깅 또는 시스템 콜 추적을 수행하는데 사용됩니다.
자세한 사항은 참조 URL 또는 구글검색을 통해 찾아보실 수 있습니다.
해당 문제에서 사용되는 ptrace 함수 콜은 디버깅 탐지를 위해
사용되어 졌습니다.
문제 바이너리 파일을 IDA 로 먼저 보시죠.
메인함수에서 ptrace 를 통해 디버깅 탐지를 하고 "Debugger detect"
메시지를 출력합니다. 디버깅 탐지가 안되면,
패스워드를 입력하라는 메시지가 출력됩니다.
이 후 fgets 함수를 통해 입력한 패스워드 문자열을 받고,
_notng 함수를 eax 레지스터에 저장하여 입력한 문자열과
저장된 패스워드와 한 글자씩 비교 후
"Good Password" 또는 "Wrong Password"를 출력합니다.
자세한 사항은 gdb를 통해 보시죠.
mov 명령어를 통해 "ksuiealohgy" 문자열을 스택에 올립니다.
이 후, ptrace 함수 호출을 통해 디버깅 탐지 유무를 체크합니다.
[0x0804841a] JNS 분기를 통해 프로그램을 종료할 지 Password를
입력할 지 결정됩니다.
(JNS : Jump if sign flag not set, SF=0)
분기문에 브레이크 포인트(b *0x804841a)를 걸고 프로그램을 진행시켜 보면
위 그림과 같이 문자열 출력 후 프로그램이 종료됩니다.
패스워드 입력하기도 전에 걸려서 패스워드를
알아볼 수가 없네요...ㅠㅠ 그럼 우회를 해야겠죠?
eflags에 설정되어 있는 SF 플래그 설정을 삭제 시킨 후 다시
디버깅 실행해보시죠.
set $eflags=0x42 (ZF flag 설정)
입력 후 레지스터를 다시 확인해 보니 SF 플래그 설정은 사라지고
ZF 플래그가 설정되었네요.
프로그램을 다시 돌려보니 패스워드 입력 창까지 도달하였습니다.
디버깅 탐지를 우회하였습니다.
패스워드는 1234를 입력 후 계속 분석 해보시죠.
[0x08048486] call 0x8048f90 <fgets> 함수 호출을 통해 위와 같이
password 입력창까지 도달하였습니다.
이후 ni 를 통해 한줄 씩 디버깅을 해보니
[0x080484a5] jne 0x80484e4<main+244>로 이동하여
Wrong 패스워드 출력 후 프로그램이 종료되었습니다.
코드를 자세히 보면,
cmp dl, al 코드를 통해 입력한 문자열과 어떤 문자열과
비교 후 jne 분기문이 실행되었습니다.
cmp dl, al 코드가 4번 반복되네요.
맨 처음 디버깅 탐지 분기문 jns와
cmp 코드 주소를 브레이크 포인트 걸었습니다.
프로그램을 다시 돌려보도록하겠습니다.
디버깅 탐지 우회 후, 첫번째 cmp 코드에서 멈췄네요.
dl, al 레지스터를 확인해보니 dl 레지스터에는
입력하였던 숫자 1(0x31)이 보이네요.
al 레지스터에는 0x65
cmp 코드 이 후 jne 분기문이므로 dl, al 레지스터 값을
동일하게 설정한 후 분기문을 우회합니다.
두번째 cmp 코드 값이네요.
역시 동일하게 레지스터 값을 설정 후 우회합니다.
세번째도 동일하게~
네번째도 동일하게 우회합니다.
진행시켜보면 Good password가 출력되네요.
그럼, al 레지스터에 들어있던 값들을 아스키코드로 바꾸어보면
단어가 만들어지네요.
(0x65, 0x61, 0x73, 0x79)
미션 클리어~!
'War-Game > Root-me' 카테고리의 다른 글
ROOT-ME CHALLENGES - CRACKING : 8 ELF - ARM Basic (0) | 2019.04.03 |
---|---|
ROOT-ME CHALLENGES - CRACKING : 9 PYC - ByteCode (0) | 2019.04.03 |
ROOT-ME CHALLENGES - Web Server : 32 SQL injection - numeric (0) | 2019.04.03 |
ROOT-ME CHALLENGES - CRACKING : 6 ELF - Fake Instructions (0) | 2019.04.03 |
ROOT-ME CHALLENGES - CRACKING : 4 ELF C++ 0 PROTECTION (0) | 2019.04.03 |