DongDD's IT

리버싱 예제 - abex crackme1 본문

IT 보안/Reversing

리버싱 예제 - abex crackme1

DongDD 2017. 12. 12. 16:39

리버싱 예제 - abex crackme1



Problem



abex crackme1.exe을 실행 시 "Make me think your HD is a CD-Rom"이라는 메시지를 볼 수 있다. 이 상태에서 확인을 누르면 "Nah... This is not a CD-ROM Drive!"라는 창이 나타난다. 즉, CD-ROM을 사용중이지 않기 때문에 Error message가 나오는 것이고 이것을 디버깅을 통해 CD-ROM으로 인식하도록 바꾸는 문제이다.


Analysis



먼저 프로그램이 어떻게 작성되어 있는지 확인하기 위해 Ollydbg를 통해 프로그램을 실행시켜보았다.

Entry point인 0x401000에서 시작을 하고 처음에 바로 MessageBox를 호출한다. 위에서 보았던 "Make me think your HD is a CD-Rom" 라는 메시지와 "abex' 1st crackme"라는 caption을 인자로하여 MessageBox를 호출한다.

그 후 GetDriveType을 호출한다. 아마 현재 사용중인 Drive Type을 가져오는 함수인 것 같다. 함수 호출 시 반환값은 EAX에 저장되기 때문에 GetDriveType 함수 호출 이후에 변환되는 EAX값을 보면 될 것 같다.



GetDriveType 함수 호출 후 EAX 레지스터 값이 3으로 바뀌는 것을 알 수 있다. 즉 현재 Drive Type이 3인 하드디스크 드라이브를 사용중이라는 것을 알 수 있다. 그 후에 INC ESI 3번과 DEC EAX 2번을 통해 ESI 레지스터 값을 3 증가시키고 EAX 레지스터 값을 2 감소시킨다. 그 후에 CMP를 통해 두개를 비교하여 같다면 JE Operation을 통해 oprand에 있는 주소값으로 jump를 한다. JE 명령어의 동작 방식은 CMP같은 비교를 거친 후 같다면 Zero flag가 1이 되는 데 zero flag가 1(비교하는 두 값이 같음)이면 jump를 한다. 즉 여기서는 ESI 레지스터 값과 EAX 레지스터 값이 같다면 원래 보았던 message가 아닌 문제를 해결했을 때의 message를 볼 수 있게 된다.


Solution


- 여러가지 방식을 생각해보다가 3가지 방법을 알게 되었다.


1. 프로그램 코드 수정-1

- 현재 짜여있는 프로그램의 어셈블리 코드를 수정하는 방법 중 첫번째 방법이다.

- 비교를 통해 같다면 JE로 jump를 하는 방법을 JE가 아닌 그냥 JMP를 통해 비교하는 값이 다르더라도 무조건 jump하게 만들었다.



- JE만 JMP로 수정하여 비교와 상관없이 원하는 위치로 jump를 해 문제를 해결할 수 있었다.



2. 프로그램 코드 수정-2

- 위 방법과 마찬가지로 코드를 수정하는 방법이다.

- JE를 수정하지 않고 그 전에 ESI와 EAX의 값을 같게 만들어 JE를 통해 원하는 위치로 넘어갈 수 있다.



- 비교를 하기 전 비교할 레지스터 2개(EAX, ESI)의 값을 갖게 만들어주었다.

- MOV를 통해 ESI의 값을 EAX에 넣어주어 비교할 때 같은 값을 가져 zero flag가 1이 되도록 만들었다.

- 여기서 주의할 점은 MOV a,b의 명령은 INC나 DEC 명령의 2배 사이즈를 갖기 때문에 원래 CMP가 있던 바로 위에서 수정을 하게 되면 CMP 명령을 덮어쓰기 때문에 2배의 여유를 둔 후 명령어를 수정해야한다.


3. Flag 수정

- 프로그램 코드를 따로 수정하지 않고 임의로 Register의 값이나 Flag값을 변경시키는 방법이다.



- 비교를 한후 JE 명령어에서 멈춘 후 오른쪽 Register창에서 zero flag를 확인해보면 0으로 되어있다.

- 이 값을 클릭하면 1로 바뀌게 된다. zero flag 값을 1로 바꾸어 마치 CMP의 결과가 같다는 결과로 보이게 만들어 JE를 통해 문제를 해결할 수 있다.



- 위에서 3가지 방법으로 설명했지만 아마 다른 방법들도 많을 것 같다.



References



코드를 변경한 프로그램을 저장하고싶다면 오른쪽클릭->edit->copy all modifications to executable을 눌러 수정한 코드를 가지는 실행파일을 저장할 수 있다.


Comments