공부/리버싱핵심원리

6장 abex' crackme #1 - 나의 풀이

리버싱 핵심원리.

드디어 CrackMe를 풀어본다. 간단한 crackme라고 한다. 그러므로 먼저 나 스스로 풀어보고 책을 봐야겠당 

문제에서는 HD라고 했지만, 아마 HDD를 의미하는 것 같다. 이 프로그램이 내 HDD를 CD-Rom으로 인식하도록 만들어야 할 것 같다.

확인을 눌러보면 틀렸다고 뜬다.

 

단순히 CD-ROM으로 인식했을 때의 메시지 Text가 뭔지 보는게 아니라, 메시지박스를 띄워야 하는 것 같다.

 

GetDriveType API를 통해 C:\ Type을 알아내는 것 같다.

vlindersec.tistory.com/24

 

[WINAPI] GetDriveType 함수

GetDriveType 함수의 원형 UINT WINAPI GetDriveType( _In_opt_ LPCTSTR lpRootPathName ); 인자 lpRootPathName은 말 그대로 드라이브의 루트 이름을 전달해주면 됩니다. GetDriveType 함수는 인자로 전달받은..

vlindersec.tistory.com

이 블로그에 따르면 CD ROM의 경우 ReturnValue=5여야 한다.

그래서 GetDriveType API 내부로 F7을 통해서 들어가고, CTRL+F9를 하고 RETN이 나왔을 때 EAX가 3이어서 EAX를 5로 바꾸고 F7했는데 풀리지가 않는다. 사이 사이 EAX를 DEC하는 연산이 있던데 그걸 고려해야 할 것 같다.

 

먼저 생각해본건 JE 어셈블리어 명령은 윗줄의 CMP가 같을 때 JMP문이 된다는 점을 이용한다.

성공하면 0040103D 의 주소로 가야하는데, 그 위에 있는 CMP EAX, ESI에서 False가 나와서 틀린다고 뜨는 것이다. 그러므로 JE를 JMP로 바꿔보자.

 

오 풀렸다................ 너무 쉽게 풀린 것 같다.

GetDriveType API에서 결과가 반환되었을 때 EAX=3, ESI=0040100이다.

이후 0040103D 주소로 가기 전 까지 INC ESI는 3번, DEC EAX는 2번 존재한다.

그럼 EAX는 1이 되고, ESI는 00401003이 되어있을 것이다.

딩동댕댕댕

그럼 여기서 두가지 방법을 생각해 볼 수 있을 것이다.

첫 번째는 0040103D주소에서 ZF를 1로 설정해주는 것이고, 다른 하나는 CMP를 할 때 EAX를 ESI값으로 맞춰 주는 것이다.

 

첫 번째 방법을 먼저 해보자.

 

계속 F8을 해보자.

오 풀렸당.

 

다른 방법은 EAX랑 ESI를 같게 설정해주는 것인데, ESI에 대한 지식은 아직 없고, 건들면 안될 것 같이 생겨서 EAX를 ESI로 설정해주겠다.

 

CMP를 진행해주기 전에 EAX를 ESI로 맞추어 줬다.

 

제대로 풀렸다.

 

다른 방법을 생각해보면 EIP를 건들 수도 있다고 생각된다. 

프로그램이 실행되자마자 0040103D로 넘어가는 것이다. 뭐 프로그램 실행하자마자 JMP 0040103D 정도로 해주면 풀릴 것 같다. (EIP는 직접 수정은 못하는 것 같다.)

 

 

 

 

오늘은 시간이 늦었으니 이쯤에서 멈추고 내일 내가 푼 방법과 책에서 푼 방법이 어떻게 다른지 확인해봐야 겠다.