Wargame/abex` crackme

abex` 1st crackme Write-Up

0xe82de_ 2019. 7. 13. 22:39
728x90
728x90
728x90

abex` 1st crackme.exe
0.01MB

사용 도구: 올리디버거 2.01

 

abex` 1st crackme(이하 원본파일)를 풀어보자.

 

먼저 원본파일을 실행시키면 다음과 같은 메세지 박스가 뜬다.

하드디스크를 CD-Rom으로 인식시키라는 뜻이다.

 

올리디버거로 원본파일을 열어보면 다음과 같은 코드를 확인할 수 있다.

첫 번째 메세지 박스의 내용이 담긴 문자열들을 스택에 넣고 MessageBoxA 함수를 호출한다.

그리고 GetDriveTypeA 함수를 호출하면 EAX 레지스터에 3이 저장되는 것을 확인할 수 있다.

MSDN을 참조하면 GetDriveTypeA는 드라이브 타입에 따라 다른 값을 반환하며, 반환값 3은 하드디스크 드라이브임을 알 수 있다.

참고: https://jade9reen.tistory.com/27

 

GetDriveTypeA Function

https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getdrivetypea GetDriveTypeA function (fileapi.h) Determines whether a disk drive is a removable, fixed, CD-ROM, RAM disk, or net..

jade9reen.tistory.com

 

GetDriveTypeA 함수를 호출한 뒤 위와 같은 코드를 실행하는데, 요약하자면 ESI 레지스터를 3만큼 증가시키고 EAX 레지스터를 2만큼 감소시킨다. 그리고 ESI 레지스터와 EAX 레지스터를 비교하여 값이 같다면 지정된 주소인 0040103D 지점으로 점프한다.

 

하지만 어떠한 작업도 하지않고 그대로 실행하면 값이 다르기때문에 점프하지않고 다음 명령어를 실행한다.

다음 명령어들은 원본파일을 실행했을 때 떴던 두 번째 메세지박스의 내용임을 알 수 있다.

그리고 0040103D 지점을 보면 다른 내용의 메세지박스를 실행하는 것을 알 수 있다.

이 지점으로 점프하게 해보자.

 

위과 같이 ESI 레지스터와 EAX 레지스터가 같아야만 점프했던 명령어 JE를 JMP로 수정하였다.

 

이제 ESI, EAX 레지스터에 상관없이 무조건 0040103D 지점으로 점프하고 위와 같은 메세지박스가 뜨는 것을 확인할 수 있다.

728x90
728x90