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 |