HyeM

[1]abex' crackme #1 본문

Study/Reversing

[1]abex' crackme #1

Hailey_HyeM207 2020. 9. 12. 03:17

#1. 문제

문제는 다음과 같다. 프로그램을 실행하면 다음과 같이 메시지 창이 뜨고, 확인버튼을 누르면 cd-rom이 아니라는 창이 뜨고 프로그램은 종료된다. 아마 cd-rom으로 인식되도록 해야 풀리는 문제로 보인다. 

실행시, 보이는 첫 메시지창

 

'확인'을 누르면, CD-ROM이 아니라고 한다. 확인 버튼 누르면 프로그램은 종료된다.

 

 

 

#2. 문제 풀이

첫번째 화면을 살펴보자.

1) 디버거로 실행하면 보이는  첫 화면이다. API함수들 이름이 보이는 것을 확인가능하다. 

또한, 메시지 창에서 봤던 문자들도 보이고, ' YEAH! I really think that your HD is a CD-ROM!' 이라는 문구도 보인다. 왠지 쉽게 풀릴 가능성이 있어보인다.

 

 

 

F7과 F8로 코드들을 실행해보며 흐름을 살펴보자.

2) call <JMP.MesageBoxA>

코드를 보니 매개변수 4개를 스택에 역순으로 저장하고, MessageBoxA api함수를 호출하는 코드이다.

 

MessageBoxA함수는 메시지 박스를  출력해주는 api로 호출시, 필요한 매개변수는 다음과 같다. 

자세한 정보는  공식 사이트에서 확인 가능하다.

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

int MessageBoxA(
  HWND   hWnd,   //핸들
  LPCSTR lpText,   //내용
  LPCSTR lpCaption,  //제목
  UINT   uType   //박스타입
);

MessageBoxA 파라미터 그림 ( 출처 : https://m.blog.naver.com/PostView.nhn?blogId=noksek0615&logNo=221587536210&proxyReferer=https:%2F%2Fwww.google.com%2F )

위의 어셈블리어 코드를 해석해보면,

제목은 "abex' 1st crackme'이고, 

내용은 "Make me think your~" 으로 메시지 박스를 만들어 띄우는 것으로 보인다.

 

MessageBoxA로 만든 메시지 박스

 

 

 

이제 다음 어셈블리 코드도 살펴보자.

3) 이번에도 call 명령어로 GetDriveTypeA api 함수를 호출하는 코드 이다.

 

드라이브의 루트 이름을 전달해주는 GetDriveTypeA함수의 파라미터는 다음과 같다.

자세한 정보는  공식 사이트에서 확인 가능하다.

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

UINT GetDriveTypeA(
  LPCSTR lpRootPathName   //드라이브의 루트디렉토리
);

이를 보면, call하기 전에 00401013번지에서 push 명령어로 c:\\문자열을 스택에 넣어 파라미터로 역할을 하는 것을 확인가능하다.이 함수로, 지금 내 드라이브가 무엇인지 알아내려고 하는거 같다. (이미 코드로 내 드라이브는 c로  정해져 있다.)

 

 

 

 

그리고 다음 코드들을 살펴보면, 분기 명령어로 인해, mesageBox로 출력되는 문자열이 달라지는 것을 확인가능하다.

4) je 01.40103D 명령어로 바뀌는 메시지 박스를 볼 수 있다.

조건을 만족하면,  제목은 'YEAH!'이고, 내용 'OK, I really ~' 인 메시지 박스를 만드는 코드 흐름을 갖는 것으로 보인다.

만약 조건을 만족하지 않으면, 'Error' 제목으로 메시지 박스가 띄워진다. 

 

여기서 ERROR 대신에 YEAH라는 문구가 나와야되는데, 그러기 위해선 

JE를 JNE로 바꾸어, 코드 흐름을 ERROR가 아닌 다른 곳으로 바꿀 수 있다.

(현재는 조건을 만족하지 않아서, je명령어를 실행하지 않고, error의 메시지 박스가 뜬다.)

스페이스바를 눌러 어셈블리를 jne바꾸게 되면 다음과 같이 YEAH라고 뜬다.

 

문제 풀기 성공이다!

 

수정전 : je
수정 후 : jne
수정 후, 실행한 결과 원하던 메시지 박스가 출력되었다.!

 

'Study > Reversing' 카테고리의 다른 글

[2]PE구조&wow64 fs redirection + a  (0) 2020.09.20
[1]호출규약 + wargame 정리 + a  (0) 2020.09.14
[1]Dreamhack_Rev 0번 문제  (0) 2020.09.12
[0]Stack & StackFrame  (0) 2020.09.05
[0]32bit Register  (0) 2020.09.05
Comments