본문으로 바로가기

ROOT-ME CHALLENGES - CRACKING : 6 ELF - Fake Instructions

category War-Game/Root-me 2019. 4. 3. 13:23

Root-me Cracking 6번 문제입니다.

5번 문제는 닷넷 PE 파일에서 패스워드를 찾는 문제인데...

.Net Reflector로 문제파일 오픈하여 금방 찾을 수 있는 문제입니다.

PASS~!

 

바로 6번 문제로 가시죠.

 

 

 

Start the challenge 버튼을 누르면 crackme 파일을 다운로드합니다.

패스워드 인자값을 입력하여 실행하면 그에 따른 결과값이 출력이 됩니다.

 

아래 IDA 그래프뷰를 통해 MAIN 함수 흐름을 보시면,

 

실행 인자값 비교후 offset a_0cgj35m9v5t3Z 주소를 

memcpy 함수를 통해 메모리 영역을 복사합니다.

cmp eax, 4 코드를 통해 eax 레지스터와 4를 비교 후 

jb short loc_804861C 주소로 이동합니다.

(*jb 분기문은 왼쪽 인자 값이 오른쪽 인자 값보다 작으면 점프)

 

그렇지 않으면 프로그램은 종료되며, jb 분기문을 통해 loc_804861C 주소로

이동하면 WPA 함수에서 문자열 값을 다시 비교하여 패스워드를 출력합니다.

 

의사코드로 자세하게 확인해보시죠.

(main 함수)

 

 

(WPA함수)

 

 

(blowfish 함수)

 

 

(RS4 함수)

 

6번 문제 핵심은, 

WPA 함수에서 strcmp 함수를 이용하여 문자열 비교 후 

blowfish 함수를 호출하여 패스워드를 출력해야 합니다.

 

(처음에 아무생각없이 main 함수에서 삽질을 하였습니다..ㅠㅠ)

 

 그럼 gdb 를 이용하여 문제파일을 디버깅 해보시죠.

 

 

바로 WPA 함수를 디스어셈블링 합니다.

strcmp 함수를 호출하여 문자열 비교 후 test eax, eax코드를 통해

0인지 확인 후 blowfish 함수 또는 RS4 함수로 점프하게 됩니다.

eax 레지스터 값을 변조하여 우회하면 되겠군요.

 

 

브레이크 포인트를 걸고 실행합니다.

eax 레지스터 값을 확인해보니 0xffffffff 입니다.

 

 

set $eax=0x0 명령을 통해 eax 레지스터 값을 변경합니다.

 

 

eax 레지스터 값이 잘변경되었는지 확인한번!

 

 

예상대로 패스워드가 출력되었네요.

 

 

 

미션클리어~!