minhui study

Crackme #1 본문

Hacking/Reversing

Crackme #1

minhui 2020. 9. 13. 01:26

abexcm1.exe
0.01MB

문제 파일은 위에서 다운 받으면 됩니다~!

다음 파일을 실행시켜 보면 다음과 같은 알림창이 뜬다.

 

확인 눌러보면 다음과 같이 에러가 뜬다.

열어보았더니 다음과 같다.

X32dbg
올리디버거

MessageBoxA(1,2,3,4)

 

① : hOwner ( 메시지 박스의 오너 윈도우. 메시지 상자를 소유한 윈도우를 말하며 메시지 박스가 떠있는동안 다른 행위를 할수없다 )

② : text ( MessageBox에 출력할 텍스트 " Make me think your HD is a CD-Rom" )

③ : title ( MessageBox 윗부분의 텍스트 "abex' 1st crackme" )

④ : style ( MB_OK = OK버튼 1개, MB_OKCANCEL = OK와 CANCEL 총 2개 버튼 등 몇몇 종류의 값이 있다.)

 

401000 ~ 40100E 주소 사이의 명령어를 보면 MessageBoxA()함수를 호출하기 전에 4번의 push명령어를 이용하여 필요한 파라미터를 역순으로 입력하고 있다. C언어로 나타내면 아래와 같다.

MessageBox(NULL, "Make me think your HD is a CD-ROM.", "abec' 1st crackme", MB_OK|MB_ARRPLMODAL);

역순으로 입력하는 이유는 스택 메모리가 LIFO 구조이기 때문이다. 그러므로 역순으로 입력해야 파라미터를 꺼내서 사용하는 MessageBox입장에서 스택에 파라미터의 순서대로 들어 있는 것이 되는 셈이다.

MessageBox를 실행하면 다음의 창이 나오게 된다.

그리고 GetDriveTypeA()함수를 호출하게 되는데 이때 리턴값은 3(DRIVE_FIXED)이다. C드라이브의 EAX값의 종류는 다음과 같다.

https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getdrivetypea

f7/f8을 누르면서 레지스터 값들이 변화하는 걸 관찰해보았다.

INC ESI                          ; ESI = 0

DEC EAX                       ; EAX =2

JMP abexcm1.401021 ; 의미 없는 JMP 명령 ( garbage code ) 어차피 다음 코드로 넘어가므로                     

INC ESI                          ; ESI = 1

INC ESI                          ; ESI = 2

DEC EAX                      ; EAX = 1

CMP EAX, ESI              ; EAX와 ESI값을 비교하여 두 값이 같으면 

JE abexcm1.40103D   ; 40103D 로 점프 다르면 바로 밑에 있는 주소 401028로 진행

 

우리는 40103D로 점프해야 OK, I really think that yout HD is a CD-ROM! :p라는 문구를 띄울 수 있으므로 cmp에서 eax와 esi값이 같게 해주거나 je명령어 대신 무조건 점프를 하게끔 jmp명령어로 바꿔주는 방법 등이 있다.

 

JE abexcm1.40103D -> JMP abexcm1.40103D (무조건 점프 하도록 명령어 바꿔주기)

 

  → 다음과 같이 바꿔주면 우리가 원하는 메세지가 뜨는 것을 확인할 수 있다.

 

 

② EAX와 ESI 값 같게 고치기( EAX = ESI )

 

 

cmp에 들어가기 전 EAX와 ESI 값이다. 지금 상태에서 서로 값이 다르므로 다음과 같이 ESI를 00000001로 바꿔주면 역시 우리가 원하는 메세지가 나온다.

 

Comments