맨위로

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

Challenges : Basic 05 


Author : Acid Bytes [CFF]

Korean : 

이 프로그램의 등록키는 무엇인가

English : 

The registration key of this program is? 

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

이름과 시리얼을 입력받아서 인증하는 프로그램 인것같군요. 본격적인 분석을 위해서 올리디버거를 통해서 열어보도록 합시다. 올리디버거를 통해 열어보니 코드가 압축되어 있다는 메시지를 출력한다. 아마도 패킹이 되었다는것을 말하는것 같습니다. 

즉, 우리가 등록키를 찾기위해서는 압축된 코드(패킹된 코드)를 풀어야 된다는것을 의미합니다. 패킹이된 코드를 풀기전에 어떤 방식으로 패킹이 되었는지에 대해서 알아야됩니다. 이를 확인하기 위해 PEiD 라는 툴을 이용해서 확인해보도록 하겠습니다. PEiD는 PE 파일에 대한 패커,컴파일러,크립터에 정보를 알려주는 툴입니다. PEiD를 통해서 열어보니 아래와 같이 UPX로 패킹되었다는것을 알려줍니다.

UPX 패킹에 대해서 간단하게 알아보면 가장 흔하고 간단한 패킹방법으로써 패킹이 쉽다는장점도있지만 그로인해 언패킹도 쉽다는 점이 특징입니다. 

  • UPX(Ultimate Packer for eXecutables)는 여러 운영체제에서 수많은 파일 포맷을 지원하는 오픈 소스 실행 파일 압축 프로그램이다. GNU 일반 공중 사용 허가서를 통해 공개된 자유 소프트웨어이다. 압축, 압축 해제의 기능을 모두 담당한다.

UPX가 패킹되있는 방식은 아래와 같으므로 우리는 POPAD 다음에 OEP로 가는 주소를 타고 들어가면 원래의 코드를 볼수있습니다.

PUSHAD -> POPAD -> JMP OEP -> 코드

그럼, 먼저 프로그램을 올리디버거를 통해서 열어서 POPAD가 위치한 곳으로 이동해보겠습니다. (올리디버거의 검색 기능을 통해서 쉽게 찾을수있습니다.)

POPAD가 위치한 곳으로 이동해보면 아래에 OEP로 가는 코드를 발견할수있습니다. 우리는 이코드에 BP(F2)를 설정하고 프로그램을 실행한다음(F9)에 한단계 더 실행(F8)하도록 해서 올바른 코드가 있는곳으로 이동해보겠습니다.

확인해보니 정상적으로 올바른 코드에 도달한것으로 보여집니다. 이제 이코드를 다시 덤프해서 언패킹된 바이너리로 만들어보도록 하겠습니다.

이 과정은 ollydbg에 ollydump 라는 플러그인을 통해서 쉽게 할수있습니다. (ollydump 플러그인이 없으신 분들은 아래의 파일을 plugin 폴더에 넣어주시면 사용할수 있습니다.)

그럼 Plugin -> ollydump -> Dump debugged Process 를 눌러서 덤프를 진행해보도록 하겠습니다. 오른쪽에 Dump 버튼 클릭만으로 쉽게 덤프를 할수 있습니다.

덤프한후 PEiD로 다시확인해보니 언팩된것을 확인할수있습니다. 

그럼이제 패스워드를 찾기위해 덤프한 파일을 올리디버거로 다시열어보겠습니다. 열어서 text strings 을 확인해보면 아래와 같이 올바른 값이 나와있는것을 볼수있습니다. 이 값들을 입력해보면 정상적으로 인증이되는것을 확인할수가 있습니다.

위의 방법처럼 직접 덤프하는 방법말고 UPX 프로그램을 통해서 언패킹하는 방법도 있습니다.

방법이 어렵지 않으므로 쉽게 사용하실수 있을것 같습니다.


Posted by STIH

댓글을 달아 주세요