본문으로 바로가기

[keygen] abexcm1 writeup, 풀이

category Reversing/Keygen 2018. 9. 11. 19:21

Abexcm1


abexcm1.exe가 어떤 기능, 행위를 하는지 알아보기 위해 실행시켜 보자.

아래와 같이 실행된다.







"Make me think your HD is a CD-Rom"

문제는 HD를 CD-Rom으로 인식하도록 요구하고 있다.


만일 어떠한 루틴으로인해 HD를 CD-Rom로 인식시키면 성공 MessegeBox가 출력될 것으로 예상된다.

하지만 현재는 아무런것도 하지 않았기 때문에 Error의 MessegeBox가 출력되었다.


가장 먼저 진행할 것은 패킹 여부와 어떤 언어로 abexcm1.exe가 작성되었는지 확인해야한다.

PEiD를 사용하면 위 두 정보를 모두 뽑을 수 있다.





Nothing found[Overlay] * 를 찾아 볼 수 있다.

이와 같은 경우는 우리가 분석할 프로그램에 대한 정보를 제대로 뽑아오지 못한 것이다.

이러한 경우는 PE Header를 보고 정보를 얻어내야 한다. PE Header를 위해 PE View를 사용한다.


패킹 정보를 위해 IAT(Import Address table)을 살펴보자.

만일 IAT에 많은 함수들이 깨져 있으면 패킹된 프로그램일 확률이 높다.

아래 사진을 보면 IAT가 그래도 있으므로, 패킹되어 있지 않다고 간주할 수 있다.





패킹되지 않았으므로 미리 어떤 API가 사용되었지 미리 확인할 수 있다. 이러한 API를 미리 확인하는 것도, 디버깅하기 전에 많은 도움을 받을 수 있다. 


마지막으로 우리가 디버깅 할 번지를 찾아야한다.

물론 트레이싱 하면서 찾을 순 잇지만 PE Header를 통해 쉽고 빠르고, 정확하게 찾을 수 있다.


Imagebase와 BaseOfCode를 통해 알 수 있다.

위의 정보는 PE Header의 Optional Header를 통해 알 수 있다.





우리가 분석할 주소의 시작 번지는 Image Base + Base of Code의 번지이다.


0x00400000 + 0x00001000 = 0x00401000 번지이다.


이제 우리가 지금까지 얻은 정보를 바탕으로 분석을 진행해보자.

디버거는 ollydbg를 사용하였다.



ollydbg를 사용해서 abexcm1.exe를 올리면 아래와 같이 0x7xxxxxxx번지가 나온다.

7번대 주소번지는 dll일 가능성이 매우 높다. 

위의 상태창을 보면 module ntdll을 미루어 보아 dll 영역임을 알 수 있다.





F9를 눌러 ntdll 다음 영역으로 넘어 갈 수 있다.

우리가 예측한것과 같이, 0x00401000번지로 잡히는 볼 수 있다.

상태창을 보면 module abexcm1로 잡힌 것을 알 수 있다.





0x00401000 ~ 0x0040100E번지  까지는 MessegeBoxA api를 호출하는 부분이다. 

0x0040100E번지에서 실행을 하면 우리가 맨 처음 abexcm1.exe를 실행했을때 나오는 MessageBox를 만날 수 있다.





우리가 주목해서 보아야 할 부분은 0x00401024~0x00401026번지이다.

0x00401024 - cmp eax, esi 

위 명령어를 통해서 zero flag가 설정될 것이다.


0x00401026 - je short abexcm1 0040103D

je명령어는 만일 zero flag가 1이라면 0x0040103D 번지로 jump를 하는 명령어이다..





위 화면 상황은 cmp eax, esi를 진행한 상황이다.

eax=1, esi=3이기 때문에 zero flag가 0으로 set 된다.

je 명령을 만족시키지 못하기 때문에 0x00401028~0x00401036번지가 실행된다.





하지만 0x00401036번지를 실행하면 처음 abexcm1.exe를 실행했을때 나오는 실패 Messagebox가 나온다.


잘 살펴보면 0x0040103D~0x00401048번지는 "ok, I really think that your HD is a CD-ROM :p" Messagebox를 출력한다는 것을 알 수 있다.


따라서 우리는 patch를 통해 분기를 조작해야한다.

zero flag에 의해서 분기가 이루어지니 zero flag를 1로 set하여 0x0040103D로 점프할 수 있다.

zero flag를 더블 클릭하면 0->1, 1->0으로 조작이 가능하다.




다음과 같이 Zero flag가 0에서 1로 patch를 진행하면 빨간 선으로 점프할 위치를 ollydbg가 알려준다.





우리가 실행시키고 싶은 위치로 도착하였으므로 MessageBoxA를 호출하는 call 부분으로 이동한 다음 실행하면 아래와 같은 MessageBox를 얻을 수 있다.





성공!!!!