튜기's blogggg

리버싱과 레지스터

by St1tch

출처 Luuzun IT Security | luuzun
원문 http://luuzun.blog.me/50189313319

    1. 리버싱이란?

리버싱이란 파일을 소스코드 상태로 되돌리는 것을 말한다. 바이너리(2진수 기계어)로 된 파일을 기계어와 1:1로 대응되는 어셈블리어로 복원하는 것을 말하며, 컴파일과 반대되는 과정이다.

리버싱의 목적은 다음과 같다.

 

▶완성된 프로그램을 거꾸로 분석하여 설계도를 축출한다.

▶완성된 시스템을 역추적한다.

▶소프트웨어를 유지 보수한다.

▶프로그램의 동작을 변경한다.

▶복제프로그램 개발한다.

▶향상된 프로그램을 개발한다.

▶악성코드를 분석한다.



    2. 바이너리 디버거

리버싱에 주로 사용되는 툴들은 다음과 같다.

▶OllyDBG (올리 디버거)

http://ollydbg.de

 

▶IDA Pro

http://hex-rays.com/idapro/idadown.htm

 

▶WinDBG

http://www.microsoft.com/whdc/devtools/debugging/default.mspx

 

 

 

    3. 레지스터

주어진 작업을 빠르게 처리하기 위해, CPU에는 메모리보다 크기는 작지만 속도는 빠른 레지스터가 존재한다. 이러한 레지스터들은 각각 32bit의 용량을 가지며(32bit 운영체제 기준), 각자의 역할을 빠르게 수행한다.

 

※레지스터에 저장된 값은 반드시 메모리에 별도로 저장해야 한다. 작업중에 다른 프로그램이 레지스터를 사용하면 기존의 데이터가 모두 변경되기 때문이다.

 

▶범용레지스터와 그 역할을 간단하게 정리해 보면 다음과 같다.

32Bit General - Purpose Resgisters (범용 레지스터)

EAX (Acumulater)

누산기. 산술 연산에 사용하는 임시 저장 공간

함수의 리턴값을 전달할 때 사용하는 공간

EBX (Base)

메모리의 주소값을 저장할 때 사용

ECX (Counter)

반복문이 몇 번 실행될 지 입력

5를 입력하면 실행할 때 마다 1씩 줄어들며, 5번 실행하여 0이되면 종료

EDX (Data)

산술 연산에 사용

EAX의 값이 32비트보다 커질 때 보조로 사용

EBP (BasePoint)

스택의 시작 주소를 저장

ESP (StackPoint)

스택의 마지막 주소를 저장

ESI (Source Index)

주소값을 넣고 ESI값을 EDI에 복사

EDI (Destination Index)

※스택 영역은 하나밖에 존재할 수 없다.

 

▶EFLAGS 레지스터는 상태 정보에 관련된 그룹, 제어 정보, 시스템 정보에 대한 것들을 포함한다

EFLAGS - Set : 1 / Clear : 0

AF (Adjust Flag)

연산 과정에서 자리올림, 내림이 발생하면 Set

CF (Carry Flag)

표현 범위가 32bit를 넘으면 Set (부호가 없는 연산)

OF (Overflow Flag)

표현 범위가 32bit를 넘으면 Set (부호가 있는 연산)

PF (Parity Flag)

1의 개수가 홀수 이면 Clear, 짝수 이면 Set

SF (Sign Flag)

부호를 나타냄. 양수이면 Clear, 음수이면 Set

ZF (Zero Flag)

연산결과가 0이 나오면 Set

 

※ EFLAGS의 구조를 그림으로 표현하면 다음과 같다.




▶EIP 레지스터는 다음에 실행될 명령어의 주소를 저장한다.

 

▶범용 레지스터의 구조

EAX는 32bit의 저장 공간이다.

EAX 16bit의 E와 AX가 합쳐진 형태이다.

AX는 다시 8비트의 AH와 AL로 나눌 수 있다.

 

EAX (32bit)

E (16bit)

AX (16bit)

AH

(8bit)

AL

(8bit)

 

 

 

    3. 데이터의 형식

어셈블리에서 사용하는 데이터는 크기에 따라 다음과 같이 나누어진다.

 

데이터 타입

사용 용도

BYTE

부호없는 1byte

WORD

부호없는 2byte

DWORD

부호없는 4byte

QWORD

부호없는 8byte

 

1byte 크기의 char 형은 어셈블리에서 BYTE [주소값] 의 형태로 표시한다.

마찬가지로 4byte 크기의 int형과 float형은 DWORD [주소값] 의 형태로 표시한다.


블로그의 정보

튜기's blogg(st1tch)

St1tch

활동하기