공부/리버싱핵심원리

8장 abex' crackme #2 (abexcm2) - 나의 풀이

리버싱 핵심원리.

이번 abex 2nd crackme 는 조금 어렵다 ㅎㅎ 아직 처음이라 그런지 많이 어려웠다.

그래두 어떻게 어떻게 해서 해결 방법을 스스로 알아냈다. 

VB로 개발된 프로그램이고, Windows Form으로 만들어져 있다.

되게 기분이 나쁘게 생김.

기분이 매우 나쁘게 디자인되었다. 

1999년도에 개발된 것 같다........ Name -> a , Serial -> a 로 Check해보겠다.

4글자 이상...
이것도 안된다....

Name -> aaaa, Serial -> aaaa도 안된다. 올리디버거로 분석해보자.

40123D 주소에서 F8을 눌렀는데, 자동으로 실행되어 버렸다. 저 주소에서 F7을 통해 들어가보자.

스택프레임을 형성하는 코드가 보였다. 아직 Form이 로드되지는 않았으니 F8을 통해 계속 가보자.

 

733735FB 주소에서 프로그램이 하나 실행된것이 보인다. 프로그램을 확인해보면 이름이 abex 2nd crackme이다.

7337365C의 주소를 CALL하는데, 한번 따라가보자. 가지말자. 엄청 많이 복잡했다. ㅎㅎㅎㅎㅎㅎㅎㅎㅎ

어쨌든 레지스터를 요리조리, 스택을 요리조리 막 뭘 해주면

 

이렇게 조건문이 있는 주소까지 오게된다. 결국 위에있는 TEST EAX, EAX 명령을 살펴봐야 하는데,

TEST명령은 처음 들어보니까 구글에 검색해봐야겠다.

 

ko.wikipedia.org/wiki/TEST_(x86_%EB%AA%85%EB%A0%B9%EC%96%B4)

 

TEST (x86 명령어) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. x86 어셈블리어에서 TEST 명령어는 두 피연산자들에 대한 비트 연산인 AND를 수행한다. SF, ZF, PF 플래그가 수정되며 AND의 결과는 버려진다. OF와 CF 플래그는 0으로

ko.wikipedia.org

TEST 명령을 알 수 있다.

한마디로, TEST 명령은 두 인자를 AND연산을 진행하는데, 그 값을 어디에 저장해놓지는 않는다.

하지만 플래그에는 저장된다. TEST EAX, EAX의 결과는 EAX의 값이 무엇이든 간에 EAX가 된다.

이때 EAX가 0이라면 TEST EAX,EAX의 결과는 0이 되며 ZF는 1로 설정된다.

그럼 JE의 조건이 만족되므로 7338F9B7 주소로 JUMP 될 것이다. 

 

실제로 TEST EAX,EAX 명령을 진행할 때 

-> 맥북에서 Ctrl+f2를 했을 때 설정된 브레이크 포인트가 해제되는 에러가 있으므로 X32DBG로 진행함.

 

7338F9B7 에서 무슨 일이 일어나는지 보자.