리버싱/리버싱 입문

abexcrackme1 풀이

상세 2021. 3. 14. 16:40

목표는 이 창을 띄우는 것이다.

 

 

위는 abex crackme1 예제의 코드 화면이다.

abexcrackme1을 푸는 방법은 여러가지라고 하는데 이 게시물에서는 두가지 방법만 사용해서 풀것이다.

 

1. 점프문으로 레지스터 값 동일하게 하기

이 방법은 간단하지만 어려운 문제가 나오면 이런 방법으로는 실력을 키우지 못할수도 있다고 하니 참고만 하자.

 

먼저 0040101F에서 JMP SHORT 0040_1021은 바로 다음 명령어 줄인 0040_1021로 이동한다는 의미이다.

그리고 코드를 살펴보면 주소 0040_1024의 명령어가 눈에 띈다. 이 명령어는 CMP EAX, ESI 값을 비교하여 같다면 0040_103D로 이동하는 명령어이다. 

 

즉 EAX(현재 하드디스크의 값을 의미하는 3이 들어있다.)와 ESI(0이 들어있다)값이 같으면 0040_103D로 이동하고

이동하여 계속 실행하면 목표창이 나오게 된다는 것을 추측할수 있다.

 

따라서 우리의 목표는 ESI값과 EAX값을 같게 만들어야 하는데 0040_1021~ 0040_1023까지의 명령어를 살펴보자

INC는 INC뒤에 오는 레지스터의 값을 1증가시키고 (Increase) DEC는 DEC뒤에 오는 값을 1 감소시킨다. 

따라서 0040_101F에 도달하였을때 EAX, ESI값은 

EAX : (DEC EAX)가 두 번 있으니 3 - 2 = 1이고

ESI : (INC ESI)가 세 번 있으니 0 + 3 = 3이 된다.

따라서 0040_101F에서는 EAX : ESI = 1 : 3으로 값이 달라 실패화면이 뜨게 된다.

 

여기서 값을 같게 하려면 0040_101F의 JMP 명령어를 사용하면 되지 않을까?

자세히 살펴보면 0040_101F를 기준으로 했을때 EAX의 값은 2 , ESI값은 1이다. 이제 0040_101F의 아래 명령어를 보면

이제 EAX값은 1번 또 감소하여 1이 될것이고 ESI는 2 증가하여 3이 될것이다. 

이제 점프 명령어로 DEC EAX 명령어로 가게 하면 EAX : 2 - 1, ESI : 1 (ESI값을 +2 하는 코드를 뛰어넘었으므로 ESI는 변하지 않는다.) 로 두 값이 같게 되어 0040_103D로 이동시키는 00401026명령어가 실행되어 성공 코드가 실행된다.

 

2. 제로 플래그를 변경하여 문제를 풀기

일단 위 위치에 브레이크 포인트를 잡은 후 프로그램을 처음부터 F9를 눌러 실행한다.

그러면 00401026에서 프로그램이 멈추게 되고 CMP EAX, ESI 명령어가 실행되었으나 값이 1 : 3으로 다르므로 

제로 플래그는 0이다. 여기서 오른쪽의 레지스터에서 제로 플래그의 값은 Z : 0으로 되어 있는데 

이 값을 더블클릭하여 1로 바꾸면 0040_1028의 명령어의 실행을 위한 조건이 참이 되어 목표화면으로 이동하여 

목표화면을 띄우게 된다.

 

3. 점프문으로 바로 목표화면 띄우기

위와 같이 무조건 실행되는 점프문인 0040_101F의 명령어에서 JMP SHORT 주소값의 주소를 목표화면이 나오게 하는 주소 0040_103D로 바꾸어 이 명령어가 실행될때 바로 목표값이 나오게 하는 방법이다. 

이 방법은 꼼수? 같은것이라  별로 권장하지 않는다고 한다.