본문 바로가기

Computer/0x06 리버스엔지니어링

리버스엔지니어링 3화 keygenme 문제풀이

리버스엔지니어링 3화 keygenme 문제풀이




버싱을 공부하다보면, 학습용으로 크랙미(crackme)를 접하게 됩니다.

이번 시간에는 간단한 키젠프로그램 리버싱을 해보도록 하겠습니다.


해당 프로그램을 실행 시키면 아래와 같이 키입력란이 나오고 

아무값이나 입력을 하면 잘못된 시리얼 이라고 에러메세지가 출력 됩니다.


리버싱을 통해 프로그램 로직을 분석하여 우회해 보도록 하겠습니다.




(문제: 에러메세지가 출력 나오지 않게 아무값이 입력해도 프로그램이 정상작동 하도록 하시오)







Ollydbg 로 해당 프로그램을 불러오면 00401000 에서 PUSH 0 으로시작 됩니다.

여기서 F8로 진행 하다보면 위와 같이 0040100D CALL Key4.00401025 에서 프로그램이 실행 됩니다.





여기서 해당 프로그램을 닫기를 누르면 RETN 으로 값을 리턴하고 종료 됩니다.

이제부터 해당 에러메시지가 부분을 우회해서 프로그램이 성공 할 수 있게 수정 해보도록 하겠습니다.

다시 Olldbg를 처음부터 실행해서 쭈~욱 프로그램 동작 메커니즘을 살펴보면 조건문을 보게 됩니다.




00401341 JNZ SHORT Key4. 00401358  부분은 점프문으로서 

00401358 부분으로 Jump을 시도하는데요. 그부분을 보면 주석 부분에 우리가 프로그램 키입력란에 잘못된 값을 

넣었을떄 나오는 에러메세지가 출력된다는 것을 알수 있습니다.


"You Have Entered A Wrong Serial,Please Try Again"

라고 되어있죠 ㅎㅎ


딱 걸렸습니다.

여기서 다시한번 지난시간에 배운 어셈블리어 구문을 짚고 넘어 가겠습니다.






점프문은 '플래그'를 봅니다. 

JNZ(Jump if Not Zero = jump if Not Equal)

명령어는, Zero Flag(ZF)가 0일때 점프하게 됩니다.


그런데 플래그가 '0'이므로 점프를 해서 에러메세지를 출력 하기 때문에

'1'로 변경 해 줍니다. 즉, 점프 명령을 수행하지 않겠다는 것입니다.






00401331 에서 JE SHORT Key4.00401358 부분을 더블클릭하면

수정 할 수 있는데요

JNZ를 JZ로 바꾸어서 점프 명령을 무시 할 수 있습니다.






다 변경이 되었으면 저장 해야 합니다.

위와 같이 Copy all 을 눌러 줍니다.




창이 여러개 뜨는데요 'D' 라고 되어있는 부분에서(왼쪽 상단참조) Save file 을 눌러서 저장 해주고 

프로그램을 실행 시켜봅니다.





아무값이나 입력하자 '성공'했다는 메세지가 나옵니다.

간단하죠? ㅎㅎ