본문 바로가기

Reverse Engineering

[Reverse Engineering] #01. abex crackme 예제 01.

Intro


리버스 엔지니어링 공부를 시작하며, 첫번째로 맞이할 예제 프로그램이다.

사용한 도구

  • Ollydbg 2.01

MessageBoxA

MessageBoxA는 윈도우에서 제공하는 API로서, 우리가 흔히 접할 수 있는 상태 창이다.

즉, abex crackme#01을 실행했을 때 나타나는 창을 의미한다.

 

CALL은 함수 호출 시 사용하며, JMP와 같이 실행 흐름이 변경되지만 JMP와 다른 점은 되돌아올 반환 주소를 스택에 저장한다는 점에서 차이가 있다.

 

우리는 분석을 할 때, cmp와 같은 조건 분기문을 유심히 살펴봐야 한다.

CMP EAX,ESI

EAX 레지스터의 값과, ESI 레지스터의 값을 비교하여 같으면 Zero Flag 레지스터의 값을 1로 설정한다는 의미이다.

위의 그림에서는 EAX가 0000 0001이고, ESI가 0000 0003이다. 따라서 ZF는 0으로 설정되는 모습을 볼 수 있다.

 

JE SHORT 0040103D

JE란, Jump If Equal의 약자로. 그대로 해석하여 같다면 점프를 수행한다. 하지만 바로 전 구문인 CMP문에서 ZF가 0으로 설정되었기 때문에 ‘0040103D’의 주소로 점프하지 않는다.

그림에서와 같이 ‘0040103D’의 주소로 점프하지 않기 때문에 “Nah.. This is … “ 라는 실패 메시지가 메시지 박스의 인수로 넘어가게 된다.

 

해결 방법


이전의 분석을 통하여 우리는 CMP의 영향으로 문제가 발생할 수 있다는 사실을 알 수있다.

번째로, JE를 통하여 에러메시지를 통과하는 방법으로 해결을 해보자.

현재 주소‘0040101F’를 수행할 차례이고, EAX 값이 2, ESI 값이 1인 상태이다. JMP SHORT 00401021을 수행하면 바로 다음 커맨드를 실행하게 된다. 그렇게 된다고 가정하였을때의 EAX값과 ESI의 값을 생각해보자.

  • 00401021로 간다면
    • INC는 인수의 값을 1 증가시키고, DEC는 인수의 값을 1 감소시킨다 최종적으로 EAX : 1, ESI : 3 이 되는 모습이다.

앞에서 설명한 바와 같이, 점프문을 실행시키지 못하여 에러메시지가 발생할 것이다.

 

  • 00401023으로 간다면

  • 해당 명령어 위에서 스페이스바를 누르면 Assemble창과 함께, 명령어를 만질 수 있다. 주소값을 ‘00401023’으로 바꿔주도록 한다
  • “OK, I really think… “ 인수를 MessageBoxA에 전달하여 성공적으로 crack을 수행한다
  • .ESI값을 증가시키는 구문을 두번 무시하여 EAX : 1, ESI : 1이 되어 JE문을 수행할 수 있게 된다.

 

 

두번째로는, 플래그 값을 변경하는 방식을 사용한다.

이 방식은 훨씬 간단하다.

 

JE SHORT 0040103D 구문을 실행할 차례일 때, Z플래그를 1로 변경해준다. (Z 옆의 ‘0’을 더블클릭한다.)

그렇게 되면 JE 구문이 정상적으로 작동하여, “OK, I really think… “ 인수를 MessageBoxA에 전달하여 성공적으로 crack을 수행한다