본문 바로가기
Study/Reversing

[Reversing] abex' Crackme #1

by Jamie Lim 2020. 9. 14.

exe 파일을 실행시키면 다음과같이 나온다

 

exe 실행 시 나오는 메시지 박스

 

 

코드를 살펴보면 위 에러가 출력되게 하는 메시지 박스와 YEAH! Ok, I really think that your HD is a CD-ROM! :p이 있다. 아마 이 문장이 출력되는 메시지 박스를 띄워야 하는 것 같다.

 

 

 

* MessageBoxA

int MessageBoxA(
  HWND   hWnd,
  LPCSTR lpText,
  LPCSTR lpCaption,
  UINT   uType
);

MessageBoxA(핸들, 내용, 제목, 박스 종류) 함수로 메시지 박스는 총 4개의 인수를 가진다.

 

* GetDirveType

  함수를 호출하기 바로 전에 'c:\\'로 설정했기 때문에 함수에서 반환 값이 3이 되어 고정 미디어라는 것을 알 수 있다.

UINT GetDriveTypeA(
  LPCSTR lpRootPathName
);

지정한 디스크가 어떤 형태의 저장소인지 특정 정수 값을 반환해 판단해준다. 아래 표는 특정 정수 값에 대한 설명입니다.

Return code value Description
DRIVE_UNKNOWN 0 드라이브 유형을 확인할 수 없다
DRIVE_NO_ROOT_DIR 1 루트 경로가 잘못되었다 (최상위 경로가 없음)
DRIVE_REMOVABLE 2 드라이브에는 이동식 미디어가 있다
DRIVE_FIXED 3 드라이브에는 고정 미디어가 있다
DRIVE_REMOTE 4 드라이브는 원격(네트워크)드라이브다
DRIVE_CDROM 5 드라이브는 CD-ROM드라이브다
DRIVE_RAMDISK 6 드라이브는 RAM디스크다

 

 

둘 중 문장을 선택하는 건 JE 명령어가 수행하는 것을 볼 수 있다. cmp를 통해 eaxesi가 같은 지 확인했는데 만약 같다면 점프를 통해 우리가 원하는 문자열을 출력해줄 것이다. 하지만 같지 않다면 아까 처음에 봤던 에러 메시지 박스를 띄운다.

 

 

 

그런데 뭐가 같아야 할지는 잘 모르겠어서 다른 쉬운 방식을 생각해보면 원래 같을 때 점프해 성공한 메시지 박스에 갔다면 반대로 같지 않을 때 점프하도록 만들면 된다. 그 명령어는 je 대신 jne를 쓰면 된다.

 

 

 

그러면 이렇게 성공한 메시지 박스를 볼 수 있다.

 

 

 

< 참고 >

https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messageboxa

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

댓글