abex crack me
현재 HD를 CD-Rom으로 인식을 하게 만들어야 한다.
그래서 OllyDBG로 실행을 하여 분석해 보았다.
현재 00401000의 이 프로그램의 EP(Entry Point)인것을 알 수 있다. (Message Box)를 출력하는 것으로 보아 여기가 main함수 인것을 알 수 있다.
디버깅을 계속 진행해보면 아까 봤었던 메세지 박스가 실행된다
따라서 0040100E에서 Make me think your HD is a CD-Rom 이라는 메세지 박스를 실행시키는 주소이다.
HD를 CD-Rom으로 인식을 하게 해야하는데 인식의 여부에 따라서 성공과 에러창이 실행되는 주소로 이동한다.
- CD-Rom으로 인식을 못했을 경우 에러창이 실행된다.
0040100E 주소에서 Msagge BoxA를 실행시키고 계속 디버깅을 해보면 00401018의 CALL 명령어를 실행하여
아래의 주소로 이동한다.
어셈블리 명령어들을 살펴보면 JMP를 통해서 00401021주소로 이동하고 ESI값을 2 감소시킨 다음 EAX를 1증가시킨 후
CMP EAX, ESI를 통해 비교를 한다. 그리고 JE라는 구문을 통해서 EAX와 ESI의 값이 일치하면 0040130D 주소로 이동하여 성공이라는 Message Box를 실행한다.
처음부터 다시 디버깅을 해보았다.
0040100E까지 실행한 결과 리턴값이 1이되었다.(EAX는 리턴 값을 저장한다.)
00401018에서 처음보는 함수가 등장했다. GetDriveTypeA라는 함수인데 WIN32 API에서 사용하는것 같다.
그래서 구글링을 해보았다. https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getdrivetypea
CD-ROM으로 인식되게 하려면 리턴 값이 3이되어야 한다.
그럼 다시 돌아가서 디버깅을 진행해보자.
아까 0040100E까지 실행한 결과 리턴값이 1이되었다.
004010D에서 EAX값은 3으로 변경되었다.
0040101E에서 ESI의 값은 1 증가하였다.
결국 어셈블리 명령어에 따라서 증감을 한다
JE라는 명령어를 통해서 Z가 1이면 해당 주소(성공메세지가 실행되는 곳으로 이동한다.)
EAX는 2번 감소 그래서 3-2 = 1 EAX의 값은 1이다.
0040101E 에서 DEC
00401023 에서 DEC
ESI는 3번 증가 그래서 0 + 3 = 3이다.
0040101D에서 INC
00401021에서 INC
00401022에서 INC
이렇게 되면 CMP로 비교를 할때 ESI 와 EAX가 값이 일치하지 않아서 에러창이 실행되는 곳으로 이동할 것이다.
(1과 3은 다르기 때문에 Z(ZeroFlag)가 0이되기 때문에 JE 구문이 실행되지 않는다.)
아까 보았던 GetDriveTypeA함수가 CD-Rom으로 인식되기 위해서는 리턴값이 3이되야 한다고 했다.
그래서 EAX값을 5로 바꿔주면 EAX는 2번 감소하기 때문에 3이될것이고, ESI는 원래 3이 되기때문에 비교를 했을때
일치하게 된다. 따라서 성공메세지를 실행하는곳으로 이동할것이다.
EAX 값을 5로 변경해주고 디버깅을 계속 진행해보면 에러창이 실행되는 곳으로 이동하는데
이것은 CMP를 할때 Z의 값이 0이기 때문에 JE 구문이 실행되지 않는다.
따라서 JE 구문이 실행이되게 하려면 Z의 값을 1 증가 시키면 된다.
성공!
따라서 문제의 답은 5
'CTF > Reversing' 카테고리의 다른 글
Code Engn Basic RCE level 6 (0) | 2020.12.02 |
---|---|
Code Engn Basic RCE level 5 (0) | 2020.08.16 |
Code Engn Basic RCE level4 (0) | 2020.08.16 |
Code Engn Basic RCE level3 (0) | 2020.08.12 |
Code Engn Basic RCE Level2 (0) | 2020.08.12 |