상세 컨텐츠

본문 제목

0x03 - 레나튜토리얼 01

Reversing

by 조땡땡이 2020. 8. 9. 22:54

본문

 

tutorial01의 reverseMe.exe를 실행시키면 아래의 문구가 출력된다. 라이센스 기간이 지났으니 새 라이센스를 구매하라는 내용인 거 같다..!

reverseMe 메시지 창

 

reverseMe를 분석하기 전에 당장 필요한 Ollydbg 명령어를 살펴보자.

재시작: Ctrl + F2
한스텝 진행(over): F8
한스텝 진행(into): F7
주소 이동: Ctrl + g
브레이크포인트: F2
계속 실행: F9

 

우선 이정도만 알아두는걸로... ㅎㅎ 이제 분석을 시작해보자

 

처음으로 보이는 코드는 CreateFileA라는 함수의 코드이다.

해당 함수 설명이 궁금하면 https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea 링크를 클릭하여 확인해보자.

해당 코드의 내용을 살펴보면 Mode 가 OPEN_EXISTING이고 FIleName이 "Keyfile.dat"이다.

즉. "Keyfile.dat"파일이 있는 경우에 파일을 열어라 라는 뜻이다. 하지만 우리는 "Keyfile.dat"파일이 없지비!!!

이후 어떻게 되는지 살펴봐야지비!

CreateFileA 함수 실행

 

어떻게 되는지 확인해보니 EAX 레지스터의 값이 FFFFFFFF(-1) 이 된다.

CMP는 두 피연산자의 값이 같은지 검사하는데 두 값이 같다면 ZF=1이 되고, 다르다면 ZF=0이 된다.

그러므로 현재 ZF의 값은 1이다.

이후에, JNZ(Jump if not zero)분기문이 나오는데 이 분기문은 ZF가 0이면 점프 한다는 뜻이다.

현재 ZF의 값은 1이므로 점프를 안하게 되면서 쭉쭉 아래의 코드로 내려가면서 우리가 처음에 봤던 "Evaluation period out of date. Purchase new license" 메시지 박스가 출력되면서 프로그램은 종료된다.

 

 

프로세스를 종료시키지 않기 위해서 JNZ분기문을 더블 클릭하여 JN 분기문으로 변경 시켜준다.

그럼 Ollydbg에서는 JE 분기문으로 바뀌는데 같은 의미이니 너무 걱정 말고 F8키를 눌러서 쭉쭉 실행시켜 주자.

JNZ -> JZ 분기문 변경


실행시키다 보니 이번에는 키파일을 사용할 수 없다는 메시지 창이 출력되면서 프로세스가 종료된다. 또 뭔가를 해야하나보다...ㅎ

 

reverseMe 두번째 메시지 창

 

자, 코드를 살펴보면 아까 JNZ 분기문을 JZ분기문으로 변경하여 점프한 이후 ReadFile 함수가 실행되는 것을 확인할 수 있다.

역시나 궁금하다면 https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-readfile링크를 참조하여보자. 나도 시간날때 찬찬히 읽어봐야지 ㅎㅎ

여튼 이렇게 함수가 실행된 후 저기 보이는 004010B2주소를 확인해보면 004010F7로 점프를 하는 명령이 들어 있다. 

이제 Ctrl + g 를 이용하여 004010F7로 한 번 가보자

ReadFile 함수 실행

 

자 004010F7로 와봤다..! 그랬더니 해당 주소가 아까 출력된 메시지창이 실행된 후 프로세스가 종료되는 코드인 것을 확인할 수 있다. 자 다시 Ctrl + g를 통해 004010B2로 다시 가자

두번째 메시지 창 출력 코드

 

자 이번에는 JMP문을 NOP으로 바꿔주자. NOP은 아무 행위도 하지 않는 것을 의미하기 때문에 아까 그 주소로 점프하지 않는다면 곧 라이센스 우회를 할 수 있을 것이다. 004010B0주소의 JNZ를 아까와 같이 JZ로 바꿔서 점프 시킬 수 있는 방법도 있지만 NOP으로 바꾼 이유는 JMP문에서 브레이크를 걸어버렸기 때문에 다시 프로그램을 실행시키고 싶지 않았다. ^^ 제 귀차니즘을 헤아려주세요... ㅎ

 

이쯤되니 슬 귀찮기때문에 Ollydbg 주소 창에서 오른쪽 마우스 > Search for > All referenced text strings 를 눌러 우리가 최종적으로 출력해야하는 메시지 창이 뭔지 확인해봅시다. 딱 보니 저 004020DE 주소에 있는 저거네요! 저 주소로 가서 확인해보면 00401205부터 시작됩니다! 저 주소로 갈 수 있도록 빨리 노력해봅시다.

성공 메시지창 확인

 

자  저 빨간색 창 보이시죠..? 저 주소가 위에 우리가 확인한 "You really did it! Congratz !!!" 메시지 창을 출력하기 위한 주소로 가기 위한 분기문 입니다.! 해당 주소로 가기 위해 JL 분기문이 두개나 더 있더라고요! 그래서 다 NOP으로 변경해줬습니다! 하나하나 보여주고 싶지만.. 텍스트도 너무 길어지고 우리들의 시간은 중요하니까요... 헿

 

실행시켜보면.... 자!!!!!!!!! 드뎌 성공했습니다!!!

 

저만.. 감격스럽쥬?!ㅠ 사실 진행하는 건 어렵지 않았지만.. 이걸 블로그 글로 담아냈다는게 저는 감격스럽습니다!!

제 귀차니즘으로 인해 블로그 포스팅이 많이 늦어졌는데 앞으로는 더 많이 늦어지는 일 없이 글을 올려보도록 하겠슴다!

제가 글로 이런 내용들을 잘 못풀어내서 굉장히 쉽게 넣고자... 해봤지만.. 이해 안가는 부분이 있다면.. 문의 주세요..

 

관련글 더보기