맨위로

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

Challenges : Basic 15 


Author : uBc - bRiANbuSY

Korean : 

Name이 CodeEngn일때 Serial을 구하시오 

English : 

Find the Serial when the Name is CodeEngn 

문제를 보니 14번 문제와 같이 시리얼 생성 관련 알고리즘을 파악하는 문제같습니다. 이 문제 또한 이름 값에 따라서 시리얼값이 변한다는것을 알수있습니다. 

프로그램을 실행 시켜보면 아래와 같은 모습을 띄고 있습니다. 

<그림 1. 프로그램 실행>

특별히 살펴볼 것은 없으니 코드를 분석하도록 하겠습니다. 먼저 분석전에 코드가 패킹되어 있는지를 확인하기 위해 PEiD 를 통해서 정보를 얻어보겠습니다.

<그림 2. PEiD>

PEiD 를 통한 확인결과 별다른 패킹은 되어있지 않은것을 확인할수 있습니다. 

이제 분석전에 알아볼 정보들은 거의 다 살펴보았으니 이제 분석을 해보도록 하겠습니다. 빠른 분석을 위해서 정보 수집을 하겠습니다. 먼저 이 프로그램에 텍스트들 부터 살펴보도록 하겠습니다.

Search For -> All Referenced Text Strings 를 이용해서 살펴보니 아래와 같이 프로그램 인증 관련 메시지들을 볼수있습니다.

<그림 3. Text strings referenced>

성공시 출력하는 메시지와 실패시 출력하는 메시지가 비슷한 주소에 위치해 있는것을 보아 주위에 분기점이 있을것이라 생각됩니다. 자세히 알아보기위해 일단 이동해보도록 하겠습니다.

메시지가 있는 주소로 이동해보니 예상과 같이 분기점이 존재하는것을 확인할수 있습니다. 

<그림 4. 분기점 발견>

분기점 위에는 시리얼 값을 비교하는 듯한 CMP 문 또한 확인가능합니다. 코드를 살펴보니 EAX 값과 DS 값(45B844 주소의 4Byte 값)을 비교해서 다르면 00458854 (Try Again) 으로 점프하고 같으면 성공 메시지를 출력하는 것을 알수있습니다.

이제 우리는 비교하는 2개의 값을 알았으니 분기점 (00458837) 에 BP를 설정하고 두개중 어떤것이 시리얼값이 저장된 것인지 확인하면 쉽게 시리얼값을 얻을수 있을것입니다. 

BP 설정후 아래와 같이 CodeEngn 과 임의의 값을 입력한후 Check it 을 해주면 분기전에 멈추는것을 확인할수 있습니다.

<그림 5. BP 설정후 실행>

일단 EAX 값을 먼저 확인하면 아래와 같이 EAX 에 0000000A 가 저장되있는것을 확인할수 있습니다. 즉 사용자 입력값 10의 16진수인 A가 저장된것을 보니 EAX 에는 사용자입력값이 저장된다는것을 알수있습니다. 

<그림 6. 레지스터 값 확인>

이제 시리얼이 45B844 주소에 위치해있다는것을 확인했으니 Follow in Dump 를 이용해서 주소로 이동해보겠습니다. 이동해보면 아래의 그림처럼 저장되어있는 값을 확인할수 있습니다.

<그림 7. 0045B844>

00006160 즉 6160 을 10진수로 변환한 24928 이 시리얼 값이라는것을 알수있습니다. 확인을 위해 프로그램에 입력해보면 아래와 같이 인증에 성공한 모습을 확인할수 있습니다.

<그림 8. 인증 성공>


Posted by STIH

댓글을 달아 주세요