드디어 CrackMe를 풀어본다. 간단한 crackme라고 한다. 그러므로 먼저 나 스스로 풀어보고 책을 봐야겠당
문제에서는 HD라고 했지만, 아마 HDD를 의미하는 것 같다. 이 프로그램이 내 HDD를 CD-Rom으로 인식하도록 만들어야 할 것 같다.
확인을 눌러보면 틀렸다고 뜬다.
단순히 CD-ROM으로 인식했을 때의 메시지 Text가 뭔지 보는게 아니라, 메시지박스를 띄워야 하는 것 같다.
GetDriveType API를 통해 C:\ Type을 알아내는 것 같다.
이 블로그에 따르면 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는 직접 수정은 못하는 것 같다.)
오늘은 시간이 늦었으니 이쯤에서 멈추고 내일 내가 푼 방법과 책에서 푼 방법이 어떻게 다른지 확인해봐야 겠다.
'공부 > 리버싱핵심원리' 카테고리의 다른 글
7장 스택 프레임 (궁금한 것 있었으니 다시 읽어볼 것.) (0) | 2020.12.06 |
---|---|
6장 abex' crackme #1 - 책의 풀이 (0) | 2020.12.01 |
5장 스택 (0) | 2020.11.30 |
4장 IA-32 Register (0) | 2020.11.30 |
3장 리틀 엔디언 표기법 (1) | 2020.11.28 |