본문 바로가기
보안과정/참고

어셈블리 언어(Assembly)

by Luuii 2017. 11. 27.

1. 리버스 엔지니어링

(1) 리버스 엔지니어링이란?

> 인조물로부터 청사진을 얻는 것에서 유래.

> 이진코드로 되어 있는 실행파일을 분석하려는 일련의 행위.

> 소프트웨어를 분석하고 동작을 해명해 나가는 것을 리버스 엔지니어링이라 부름.

> 이것은 멀웨어에 한정하지 않고 일반적인 소프트웨어를 분석하는 것을 말하기 때문에, 컴퓨터 보안과 관계가 없는 곳에서도 사용.

 

(2) 리버스 엔지니어링의 종류

보안적 관점

* 소프트웨어를 개발 후 개발 된 제품에 대해 암호화 알고리즘과 관련된 보안의 평가

* 해커들이 운영체제/애플리케이션의 취약점을 분석 후 바이러스 또는 악성코드를 제작하는데 사용

* 백신업체에서 바이러스 또는 악성코드를 부석 후 백신을 만들기 위해 사용

* 소프트웨어에서 사용된 암호화 알고리즘을 분석하기 위해 사용

 

개발적 관점

* 소프트웨어 개발 시 필요한 지식을 습득하기 위해 다른 소프트웨어를 분석하는데 사용

 

(3) 리버싱 분석 방법의 종류

정적 분석과 동적분석

* 정적 분석 : 대상 프로그램을 실행하지 않고 분석하는 방법 -> 전체적으로 넓게 분석 시 사용

* 동적 번숙 : 대상 프로그램을 실행하며 분석하는 방법 -> 일부분을 집중적으로 분석 시 사용

 

(4) 리버싱 관련 프로그램

* 바이너리 에디터            ------> Striling, BZ Editor, HxD

* 계산기                        ------> 보조프로그램 > 게산기

* 디스어셈블러(Disassembler) ---> OllyDbg/IDA/Immunity Debugger/WinDbg

* 디버거(Debugger)

 

○ 디스어셈블러

> 기계어 0과 1을 어셈블리 코드로 변환하는 툴

 

○ 디버거

> 프로그램을 실행모드에서 분석

> 디스어셈블러의 기능을 포함하고, 프로그램을 진행시켜가며 하나씩 분석하는 것.

- User mode(일반 응용프로그램용)

(Windows) OllyDbg(GUI), DIA pro(GUI)->권고, Immunity Debugger

(Linux) gdb(TUI), kgdb(GUI gdb), edb-debugger(GUI)

- Kernel Mod(하드웨어 관련 프로그램용)

(Windows) WinDbg, SoftICE

 

 

2. 어셈블리어(Assembley Language)

(1) 용어

 

CPU    <-------------->    MEMORY    <-------------->    DISK

   한글 프로세스                      한글.exe

 

* CPU(Central Processing Unit)

* MEMORY

* Register

 

(2) CPU 기본구조(80x86)

연상장치(ALU: Arithmetic and Logic Unit)

> CPU(중앙 처리 장치)의 핵심 부분 중 하나로, 산술과 논리 연산을 수행하는 연산 회로 집합으로 구성

 

제어장치(Control Unit)

> 입력, 출력, 기억, 연산 장치를 제어하고 감시, 주기억 장치에 저장된 명령을 차례로 해독하여 연산 장치로 보내 처리되도록 지시

 

레지스터(Register)

> 처리중인 데이터나 처리결과를 임시 보관하는 CPU 내의 기억장치

 

(3) Memory 기본 구조

ⓐ 스택(Stack)

> LIFO(Last-In First Out) 방식에 의해 정보를 관리. TOP이라고 불리는 스택의 끝 부분에서 데이터의 삽입과삭제가 발생

 

ⓑ 힙(Heap)

> 프로그램 실행 중 필요한 기억 장소를 할당하기 위해 운영체제에 예약되어 있는 기억 장소 영역

 

ⓒ 데이터 세그먼트(Data Segment)

> 초기화된 외부 변수나 static 변수 등이 저장되는 영역.

> 보통 텍스트 세그먼트(Text Segment)와 데이터 세그먼트(Data Segment) 영역을 합쳐 프로그램이라 함.

 

ⓓ BSS 세그먼트

> 초기화 되지 않은 데치터 세그먼트(Uninitalized data segment)라고 불리며, 프로그램이 실행 될 때 0이나 NULL포인터로 초기화, 외부 변수나 static변수 중 초기화 되지 않은 변수들이 정의 될 때 저장.

 

ⓔ 텍스트 세그먼트(Text Segment)

> CPU에 의해 실행되는 머신 코드가 있는 영역.

 

[참고] CPU/MEM 구조 && 레지스터

레지스터의 종류와 기능

범주 

 80386

레지스터

이름

비트

용도

범용

레지스터 

 EAX

 누산기

32

 주로 산술연산에 사용(함수의 결과 값 저장)

 EBX

 베이스 레지스터

32

 특정 주소 저장(주소 지정을 확대하기 위한 인덱스로 사용)

 ECX

 카운트 레지스터

32

 반복적으로 실행되는 특정 명령에 사용(루프의 반복 횟수나 좌우 방향 시크트 비트 수 기억)

 EDX

 데이터 레지스터

32

 일반 자료 저장(입출력 동작에 사용)

세그먼트

레지스터

CS

 코드 세그먼트 레지스터

16

 실행 될 기게 명령어가 저장된 메모리 주소 지정

DS

 데이터 세그먼트 레지스터

 16

 프로그램에서 정의된 데이터, 상수, 작업영역의 메모리 주소 지정

SS

 스택 세그먼트 레지스터

 16

 프로그램이 임시로 저장해야 하는 데이터나 사용자의 피호출 서브루틴이 사용할 데이터와 주소 저장

 ES,FS,GS

 엑스트라 세그먼트 레지스터

 16

 문자 연산과 추가 메모리 지정을 위해 사용되는 여분의 레지스터

 

레지스터의 종류와 용도

범주

80386

레지스터 

이름 

비트 

용도 

포인터

레지스터

 EBP

 베이스 포인터

32

 SS 레지스터와 함께 사용되어 스택 내의 변수 값을 읽는데 사용

 ESP

 스택 포인터

32

 SS 레지스터와 함께 사용되며 스택의 가장 끝 주소를 가리킴

 EIP

 명령 포인터

 (Instruction)

32

 다음 명령어의 오프셋(상대 위치 주소)를 저장하며 CS 레지스터와 합쳐져 다음에 수행될 명령의 주소 형성

 인덱스

레지스터

플래그

레지스터

 EDI

 목적지 인덱스

32

 목적지 주소에 대한 값 저장

 ESI

 출발지 인덱스

32

 출발지 주소에 대한 값 저장

 EFLAGS

 플래그 레지스터

32

 연산 결과 및 시스템 상태와 관련된 여러가지 플래그 값 저장

 

레지스터의 종류와 용도

구분

맵핑 레지스터 

 연산장치 관련 레지스터

 누산기(Accumulator)

 EAX

 데이터 레지스터(Data Register)

 EDX

 상태 레지스터(Status Register)

 EFLAGS

 제어장치 관련 레지스터

 프로그램 카운터(Program Counter)

 ECX

 명령 레지스터(Instruction Register)

 EIP

 메모리 주소 레지스터(Memory Address Register)

 EBX, EBP, ESP, EDI, ESI 등

 메모리 버퍼 레지스터(Memory Buffer Register)

 프로그램 실행과 관련한 데이터를 저장하는 레지스터로 RAM의 역할을 함.

 

 

○ 범용 레지스터

> 연산 장치가 수행한 계산 결과의 임시 저장, 산술 및 논리 연산, 주소 색인 등의 목적으로 사용될 수 있는 레지스터.

> EAX, EBX, ECX, EDX 등

> EAX, EBX, ECX, EDX는 32비트 레지스터로 앞의 E는 '확장된(Extended)'을 의미.

> 이 레지스터의 오른쪽 16비트를 AX, BX, CX, DX라 부르고 이 부분은 다시 둘로 나뉨.

Ex) AX는 왼쪽 8비트 상위(high) 부분을 AH, 오른쪽 8비트 하위(low) 부분을 AL이라 한다.

범용 레지스터

ⓐ EAX 레지스터 : 누산기, 입출력과 대부분 산술 연산에 사용

ⓑ EBX 레지스터 : DS 세그먼트에 대한 포인터를 주로 저장. ESI나 EDI와 결합하여 인덱스에 사용

ⓒ ECX 레지스터 : 루프가 반복되는 횟수를 제어하는 값. 왼쪽이나 오른쪽으로 이동되는 비트 수 등을 포함

ⓓ EDX 레지스터 : 입출력 연산에 사용, 큰 수의 곱셈과 나눗셈 연산에서 EAX와 함께 사용

 

세그먼트 레지스터

>> 프로그램에 정의 된 메머리 상의 특정 영역, 코드, 데이터, 스택 등을 포함

>> CS, DS, SS, 3개의 레지스터가 기본 ES, FS, GS 레지스터는 여분

 

ⓐ CS 레지스터

> 기계 명령을 포함. 코드세그먼트의 시작 주소를 가리킴


ⓑ DS 레지스터

> 프로그램에 정의 된 데이터, 상수, 작업영역을 포함. 데이터 세그먼트의 시작 주소를 가리킴.

> 데이터의 오프셋을 DS레지스터에 저장된 주소 값에 더해 데이터 세그먼트 내에 위치해 있는 데이터의 주소를 참조.


ⓒ SS 레지스터

> 실행과정에서 필요한 데이터나 연산 결과 등을 임시로 저장하거나 삭제 할 때 사용. 

> 스택 세그먼트의 시작 주소 기리킴.


ⓓ ES, FS, GS 레지스터

> ES 레지스터는 추가로 사용된 데이터 세그먼트의 주소를 가리킴

> FS와 GS 레지스터도 목적은 이와 비슷, 거의 사용되지 않음.

 

포인터 레지스터

>> 프로그램 실행 과정에서 사용되는 주요 메모리 주소값을 저장.

>> EBP, ESP, EIP가 있음

 

ⓐ EBP

> 스택 세그먼트에서 현재 호출 되어 사용되는 함수의 시작 주소 값 저장.

> 함수로 전달되는 지역 변수 등을 참조할 때 기준, ESP 레지스터와 함께 사용되어 스택 프레임(stack frame)을 형성.

> 실제 메모리 상의 주소를 참조할 때 SS(Stack Segment) 레지스터와 함께 사용.


ⓑ ESP

> 현재 스택 영역에서 가장 하위 주소를 저장. 

> EBP와 마찬가지로 실제 메모리상의 주소를 참조 할 때 SS(Stack Segment) 레지스터와 함께 사용.


ⓒ EIP

> 다음에 실행될 명령의 오프셋을 포함. CS(Code Segment) 레지스터와 함께 사용.

 

인덱스 레지스터

> ESI & EDI : 메모리의 한 영역(Source) 에서 다른 영역(Destination)으로 데이터를 연속적으로 복사할 때 사용.

 

메모리의 기본 구조

ⓐ 스택

> 후입선출(LIFO : Last-In, First Out) 방식에 의해 정보를 관리.

> Top 라고 불리는 스택의 끝부분에서 데이터의 삽입과 삭제가 발생.

> 가장 나중에 삽입된 정보가 가장 먼저 읽힘


ⓑ 힙

> 프로그램의 실행 중 필요한 기억 장소를 할당하기 위해 운영체제에 예약되어 있는 기억장소 영역.

> 데이터를 저장하기 위해 기억장소를 요청하면 운영체제는 힙에 존재하는 기억 장소를 프로그램에 할당.

> 기억 장치가 더 이상 필요 없으면 할당 받았던 기억 장소를 운영체제에 반납, 운영체제에서는 반납된 기억 장소를 다시 힙에 돌려줌.

> 힙에 대한 기억 장소는 포인터를 통해 동적으로 할당되거나 반환, 연결리스트, 트리, 그래프처럼 동적인 특성이 있는 데이터 구조에서 널리 사용.


ⓒ 데이터 세그먼트

> 초기화된 외부변수나 static 변수 등이 저장되는 영역.
> 보통 텍스트 세그먼트(Text segment)와 데이터 세그먼트 영역을 합쳐 프로그램이라 함.


ⓓ BBS 세그먼트

> 초기화 되지 않은 데이터 세그먼트(Uninitialized data segment)라고 불리며, 프로그램이 실행될 때 0이나 NULL 포인터로 초기화.

> 외부 변수나 static 변수 중 초기화 되지 않은 변수 등이 정의 될 때 저장


ⓔ 데이터 세그먼트

> CPU에 의해 실행되는 머신 코드가 있는 영역.

 

 

 

 

반응형

'보안과정 > 참고' 카테고리의 다른 글

nc(netcat)명령어 사용법  (0) 2017.11.28
xinetd 방식에 대하여  (0) 2017.11.28
dig/host/nslookup  (0) 2017.11.28
setreuid 명령어  (0) 2017.11.28
특수 퍼미션  (0) 2017.11.27