본문 바로가기

Reverse Engineering/abex' crackme

abex' crackme #1

1. 실행



실행하면 창이 하나가 뜬다.

내용을 보면 'Make me think your HD is a CD-Rom'이라 적혀있다.

HD를 CD-Rom으로 인식하게끔 요구하는 것 같다.

확인 버튼을 눌러보겠다.



확인 버튼을 누르자 에러 메시지가 나온다.

'Nah... This is not a CD-Rom Drive!' 요구하는 대로 인식하지 못해서 나오는 메시지인거 같다.




2. 실행파일 분석


올리 디버거를 사용하여 실행파일을 분석해보겠다.

먼저, 올리 디버거에 실행파일을 올린 뒤에 'F9'를 눌러 Entry Point로 이동하였다.


이동한 후 'F8'을 사용하여 어셈블리 명령어를 하나씩 실행하였다.



'CALL <JMP .&USER32.MessageBoxA>' 명령어를 실행하니 처음 실행파일을 실행했을 때에 뜨던 메시지가 나왔다.

계속해서 다음 명령어를 실행해보겠다.



실행을 하다가 '00401024'에서 'CMP EAX, ESI'를 비교하고 그 결과에 따라서 에러 메시지를 출력하는 것으로 보인다.

아무런 작업없이 계속해서 명령어를 실행하면 EAX와 ESI가 서로 다른 값을 가져서 '00401026'에서 'JE SHORT crackme1.00401030' 명령어를 만나 '00401030'명령어를 수행하지 못하게 된다.

'00401030'명령어 부분을 살펴보면 에러 메시지가 아닌 성공을 알리는 메시지가 나옴을 알 수 있다.



성공 메시지가 나오게 하기 위해서는 'JE SHORT crackme1.00401030'명령어에서 '00401030'으로 이동하게끔 만들면 된다.

여기서 나의 생각에서는 두 가지의 방법이 있었다.

첫번째는 명령어를 바꾸는 것이다.

JE를 JNE로 바꾸게 되면 성공 메시지 출력시키는 함수로 이동할 것이다.

두번째는 레지스터의 값을 바꾸는 것이다.

EAX와 ESI의 값이 같게 되면 성공 메시지를 출력시키는 함수로 이동한다.


나는 레지스터의 값을 바꾸는 방법으로 문제를 해결하였다.

EP에서 명령어를 하나씩 실행하면서 '00401024' 앞부분에서 멈춘다.

왜냐하면, 이 부분에서 레지스터 값을 비교하기 때문에 레지스터 값을 바꾼 후에 명령어를 실행시켜줘야 한다.

멈춘 후 우측의 레지스터 모니터를 보면 레지스터 값들이 나오는 것을 볼 수 있다.

EAX 레지스터에 ESI 레지스터 값을 복사해주었다.


그리고 난 뒤 실행을 해보겠다.



'00401030'으로 이동하여 성공을 알리는 메시지를 출력시키는 함수가 실행되었다.