리버스 엔지니어링

Posted by 알 수 없는 사용자
2015. 6. 8. 20:42 네트워크및보안&해킹/보안&해킹

1. 리버스 엔지니어링이란

장치 또는 시스템의 기술적인 원리를 이해하며,단점을 보완하고 새로운 아이디어를 추가시키는 일련의 작업,

다른말로 일반적인 소프트웨어 제작과정을 역행하는 과정이다.

주로 소프트웨어를 분석하거나 자신이 제작한 소프트웨어를 업데이트,오류제거,패치할때 또는 악성코드를 분석할때 사용된다.

하지만 이를 악용하여 해킹을 시도하는 사례가 자주발생된다.


2. 패치 or 크랙

프로그램의 파일 또는 실행중인 프로세스의 메모리내용을 변경시키는작업을 패치(patch),

그 중 악의적으로 수행되는 작업을 크랙(crack) 이라고 한다.


워크래프트III 크랙






3. 사전 지식

PE의 구조 - PE는 'Portable Excutable' 의 약자로, '휴대해서 실행할수 있다.' 라는 의미이다.

이것은 실제로 인터넷을 통해서 다운로드한 파일을 실행하면 실행되듯이 어디에서나 실행할수 있는 파일을 말하는데, 크게 .exe, .dll, .sys 파일이 있다.


PE의 구조는 구조체 형태로 'WinNT.h'에 정의되어 있고, 간단하게보면 정리해보면 아래와 같다.

 헤더

설명 

Dos Header 

-DOS운영체제를 위해 제공되는 헤더

-e_magic : '4D5A' MZ의 시그니처

-e_lfanew : PE Header 위치 저장 

PE Header 

-'File Header,Optional Header 포함

-'5045' PE 시그니처 

File Header 

-PE 파일의 물리적구조 정보

-섹션의 갯수

-Optional Header의 크기

Optional Header 

-PE 파일의 논리적구조 정보

-Entry Point : PE 파일의 시작점

-Section Alignment : 메모리상 섹션의 크기단위

-File Alignment : 파일상 섹션의 크기단위

-Image Base : PE 파일이 로드되는 주소

Section Header 

-섹션의 갯수만큼 존재

-섹션의 정보 



어셈블리언어 - 리버싱을 통해 분석할 프로그램들은 주로 C,C++,자바 같은 고급언어로 작성되어 있지만, 컴퓨터가 이해할수 있도록 컴파일 되면서 

바이너리 파일로 만들어진다. 이 바이너리 파일을 분석해야하는데, 다행이도 시중에 나와있는 툴들이 그나마 알아보기 쉬운 어셈블리언어로 번역해주기 때문에 어셈블리언어를 알고 있어야한다.


기본적인 어셈블리함수.


레지스터 조작 - MOV,XCHG


스택 조작 - POP,PUSH


수학연산 - ADD,SUB,MUL,DIV


비트연산 - AND,OR,XOR,NOT


이외 자주사용되는 명령어 - CALL(Call Routine),JA(Jump Above),JAE(Jump Above or Equal),JB,JBE,JE(Jump Equal),JNE(Jump Not Equal)....


4.분석 도구(Tool)

다양한 툴들이 있지만 그중 가장 많이 사용되는 툴인 OllyDbg에 대해서 설명하였다.


OllyDbg

- 대표적인 바이너리 파일 분석도구로, 리버싱할때 가장많이 사용된다, MS윈도우에서만 사용가능하고 무료이다.

- 주요기능

* 코드분석 : 레지스터값 추적,프로시저 인식, 루프, API 호출, 스위치, 테이블, 상수 및 문자열.

* 오브젝트파일 스캐닝 : 오브젝트 파일과 라이브러리에서의 루틴 위치

* 사용자 정의 테이블,주석,함수설명 허용.

* 개방적 구조로 많은 플러그인 이용가능.

* 멀티스레드 어플리케이션 디버깅

* 실행프로그램 접근(Attach)

- 메인화면

  



Disassembler 창 - 디버깅된 프로그램의 코드를 출력한다.

*Address : VA ( Virtual Address ) 를 출력하며 ,더블클릭할 때 선택한 코드간의 상대적인 주소값( +,- ) 를 보여준다.

*Hex dump : Opcodes를 출력한다.

*Disassembly : 16진수로된 Opcodes를 Assembler mnemonics로 출력한다.

*Comment : Olly로 분석한 결과에 대한 주석을 출력한다. 사용자가 직접 세미콜론( ; )을 입력하여 주석을 넣을수있다.

Infomation 창 - Disassembler 창에서 선택한 구문에서 사용한 주요변수에 대한 값을 출력한다.


Registers 창 - 현재 실행중인 스레드에서 사용하는 CPU레지스터 값을 출력한다. 이때 출력되는 형식을 사용자가 변경할 수 있다.


Dump 창 - 미리 정의한 파일 형식으로 메모리나 파일의 내용을 출력한다. 이때 출력되는 형식을 사용자가 변경할 수 있다.


Stack 창 - 실행중인 스레드의 스택값을 출력한다. 보통 해당 창의 스크롤은 실행을 일시중지 시킬때 ESP값을 가리킨다.


참조 : www.reversecore.com

  hackerschool.org

http://blog.naver.com/PostView.nhn?blogId=sol9501&logNo=70107914969&parentCategoryNo=&categoryNo=93&viewDate=&isShowPopularPosts=false&from=postView

http://carpedm20.blogspot.kr/2012/08/3.html

  




'네트워크및보안&해킹 > 보안&해킹' 카테고리의 다른 글

[시스템해킹]버퍼오버플로우 실습  (329) 2015.08.28
CrackMe2 문제풀이  (6) 2015.07.17
DLL Injection  (6) 2015.06.21
CrackMe 문제풀이 (리버싱 기초)  (6) 2015.06.08
버퍼오버플로우  (928) 2015.06.08