맨위로

이 글은 코드엔진(http://codeengn.com/) 에서 제공하는 리버스 엔지니어링 관련 다양한 문제들을 풀어보면서 리버스 엔지니어링을 공부하는 목적으로 작성되었습니다. 이글을 작성하는 필자도 리버스 엔지니어링에 흥미를 가지고 공부하는 입장이므로 잘못된 내용이 있을수도 있습니다. 잘못된 내용이 있다면 댓글이나 방명록에 알려주세요 :)

Challenges : Basic 16 


Author : ReWrit

Korean : 

Name이 CodeEngn일때 Serial을 구하시오

English : 

Find the Serial when the Name is CodeEngn 

문제를 보니 이문제 역시 전에 14,15번 문제와 같이 시리얼 생성 알고리즘을 찾는 문제인것 같습니다. 이전문제들 처럼 네임값에 따라서 시리얼값이 변한다는것또한 똑같은것을 확인할수 있습니다. 

문제를 확인했으니 프로그램을 실행시켜 보도록 하겠습니다.

<그림 1. 실행 모습>

그림 1과 같이 전형적인 시리얼 인증 프로그램과 같은것을 확인할수 있습니다. 좀 특이한 점은 패스워드를 입력받고 null 파일을 생성한다는 점이 외에는 이전에 프로그램들과 비슷하다. 

분석을 하기전에 일단 패킹에 대한 정보를 확인한 결과 Dev-C++ 로 컴파일 되있고 별다른 패킹은 되어있지않다.

<그림 2. PEiD>

이제 본격적으로 분석에 들어가도록 하겠습니다. 먼저 핵심 루틴을 찾기위해서 사용된 문자열들을 확인해보도록 하겠다. 

<그림 3. Referenced Text Strings>

Search For -> All Referenced Text Strings 를 이용해서 확인해보면 그림3과 같이 인증에 성공했을때 나타나는 "Good Job" 이라는 문자열을 확인할수 있다. 일단 문자열을 따라 이동해본다.

따라 이동해보니 아래 그림4와 같은 화면을 볼수있다. 몇줄위를 살펴모면 004015A2 에 분기점이 있는것과 그위에 CMP 문이있다는것을 확인할수 있다.

<그림 4. Good Job !>

0040159F 문을 보면 EAX 와 EBP-3C 값을 비교하고 있는것을 확인할수 있다. EAX는 아마도 사용자 입력값일 것이니 EBP-3C에 시리얼 값이 있을것이다. 확인을 위해서 BP 설정한후 실행해보자.

아래의 그림5 와 같이 CodeEngn 과 임의의 값을 입력하니 BP에서 멈추는것을 확인할수 있습니다.

<그림 5. EAX>

확인 결과 EAX 값에는 우리가 입력한 임의의 값인 12의 16진수 값이 들어가 있는것을 알수있습니다. 이제 시리얼 값이 들어있을 EBP-3C 값을 찾아보도록 하겠습니다.

위에서 BP 점에서 EBP 값이 0022FF48 인것을 보니 이값에서 3C 값만큼 빼주면 EBP-3C 값을 확인할수 있을것입니다. 즉 0022FF0C 를 확인하면 시리얼 값을 알수있을것입니다.

주소로 이동하기위해서 EBP 의 Follow in Dump 해서 이동해보면 아래와 같이 0022FF0C 주소에 값을 확인할수 있습니다.

<그림 6. 0022FF0C>

그림 6을 보면 알수있듯이 0022FF08 에 E4C60D97 값이 저장되있는것을 확인할수있습니다. 이제 이값을 10진수로 변환한후 다시 프로그램에 입력하면 아래와 같이 인증에 성공하는 모습을 확인할수 있습니다.

<그림 7. 인증 성공>



Posted by STIH

댓글을 달아 주세요