- CPU 기본 구조
<한빛 미디어 정보 보안 개론과 실습 >
연산장치(ALU : Arithmetic and Logic Unit) : CPU의 핵심 부분 중 하나로 산술과 논리 연산을 수행하는 연산 회로 집합
제어장치(Control Unit) : 입력, 출력, 기억, 연산 장치를 제어하고 감시, 주기억 장치에 저장된 명령을 차례로 해독하여 연산 장치로 보내 처리되도록 지시
레지스터(Register) : 처리중인 데이터나 처리 결과를 임시 보관하는 CPU 내의 기억 장치
- 레지스터(Register)
어셈블리 언어로 프로그래밍을 하기 위해서는 CPU 내부에 있는 레지스터에 대해서 잘 알고 있어야 한다. 레지스터는 CPU가 접근할 수 있는 메모리 중에서 가장 빠르게 동작하는 메모리로 여러가지 연산들이 처리 하는 동안 임시적으로 데이터를 보관하는데 사용된다.
메인 메모리(RAM)는 바이트 단위의 번지 혹은 주소를 이용해서 접근할 위치를 구분하지만 레지스터의 경우는 번지의 개념이 없고 모두 고유한 이름이 부여되어 있다.
- 레지스터의 종류
세그먼트 레지스터(Segment Register) 현재 32, 64비트 컴퓨터에 사용되지 않는다.
범용 레지스터(General-Purpose Registers) 일반적인 레지스터
명령어 포인터 레지스터(Instruction Point Register, IP) 다음 실행할 코드의 주소를 담는 레지스터
포인터 레지스터(Pointer Register) 스택 영역을 표시하기 위한 레지스터
인덱스 레지스터(Index Register) 문자열의 시작 주소나 기타 다른 데이터들을 저장하기 위해 사용되는 레지스터
- 세그먼트 레지스터(Segment Registers)
CS(Code Segment Register)
DOS의 프로그램 코드 세그먼트의 시작 번지 저장, 이 번지에 명령어 포인터(IP) 레지스터 내의 옵션값을 더하면 실행을 위한 명령어의 번지가 된다. 실행될 기계 명령어가 저장된 메모리 주소 지정.
DS(Data Segment Register)
프로그램의 데이터 세그먼트 레지스터의 시작 번지를 기억, 프로그램에서 정의된 데이터, 상수, 작업 영역의 메모리 주소 지정.
SS(Stack Segment Register)
번지와 데이터를 임시로 저장할 목적으로 쓰이는 스택을 메모리에 구현, 스택 포인터 레지스터의 오프셋 값을 더하면 스택 내의 현재 워드를 가리키는 번지. 프로그램이 임시로 저장할 필요가 있거나 사용자의 피호출 서브 루팅이 사용할 데이터와 주소 포함.
ES(Extra Segment Register)
지정하기 위해 본 레지스터를 사용할 때 DI 레지스터와 연관
FS, GS
286이후에 추가된 레지스터로서 보조 세그먼트 레지스터
- 범용 레지스터(General-Purpose Registers) 32bits
EAX(Accumulator, 누산기)
Accumulator : 모든 연산 명령에 사용되는 레지스터 , 주로 산술 연산에 사용( 함수의 결과 값 저장 )
EBX(Base Register, 베이스 레지스터)
임의의 번지 지정에 사용되는 어드레스 레지스터
offset, 특정 주소 저장
ECX(Count Register, 카운트 레지스터)
스트링 조작 명령이나 반복 루프의 계수기로 사용
반복적으로 실행되는 특정 명령에 사용
EDX(Data Register, 데이터 레지스터)
산술연산, EAX와 함께 자주 사용, 일반 자료 저장
- 포인터 레지스터(Pointer Registers)
EBP(Base Pointer)
함수의 파라미터나 변수의 위치를 얻어오는데 간접적으로 사용 ( 스택 메모리를 가리킴 )
호출된 프로시져를 위한 스택 프레임 내의 고정 Reference pointer를 나타냄
저장된 이전의 EBP 값을 SFP(Stack Function Flame Pointer)라고 함
SS 레지스터와 함께 사용되어 스택 내의 변수 값을 읽는 데 사용
ESP(Stack Pointer)
스택의 맨 꼭대기를 가리키는데 사용, 그러나 프로그램 안에서 수시로 변경되기 때문에 특정 기준 시점을 잡아 ESP 값을 EBP에 저장하여 EBP를 기준으로 변수나 파라미터에 접근, SS 레지스터와 함께 사용됨
EIP(Instruction Pointer)
현재 수행중인 코드를 가리킴, 다음 명령어의 offset을 저장하며 CS 레지스터와 합쳐져 다음에 수행될 명령의 주소 형성
- 플레그 레지스터(Flag Registers)
플래그 레지스터는 CPU 연산 시 발생하는 각 상황에 대한 것들로서 총 32비트로 이루어져 있으며, 이중 16비트만 사용
CF(Carry Flag) TF(Trap Flag) PF(Parity Flag) AF(Auxiliary Flag) IF(Interrupt Flag)
- 명령어 포인터 레지스터(Instruction Pointer Registers, IP )
SP(Stack Pointer) -> ESP스택내의 현재 워드를 참조할 오프셋 값을 기억. 80386 이후의 프로세서는 확장 스택 포인터(ESP)
BP(Base Pointer) -> EBP스택에 들어오고 나가는 데이터나 번지를 참조하는데 사용. 80386 이후의 프로세서는 확장 스택 포인터(ESP)
- 인덱스 레지스터(Index Registers)
인덱스 레지스터는 주로 문자열의 시작 주소를 담아서 표현하는데 사용
SI(Source Index)
스트링 조작에 사용, DS 레지스터와 연관 번지의 간접지정에 사용,
특히 스트링 명령에 있어서는 메모리 부터 레지스터로 데이터를 전송하기 위한 전송 측 번지의 지정
DI(Destination Index)
스트링 조작에 사용, ES 레지스터와 연관 번지의 간접번지에 사용,
특히 스트링 명령에 있어서는 레지스터로 부터 메모리에 데이터를 전송하기 위한 수신 측 번지를 지정할 때 사용
- 메모리 구조
스택 : LIFO( Last In , First Out ) Top이라고 불리는 스택의 끝부분에서 데이터의 삽입과 삭제가 발생
EBP : 베이스 포인터 - 스택의 가장 윗부분 ( 높은 주소 ,데이터가 쌓이는 부분부터 )
ESP : 스택 포인터 - 스택의 가장 아랫부분 ( 낮은 주소)
힙 : 프로그램의 실행 중 필요한 기억 장소를 할당하기 위해 운영체제에 예약되어 있는 기억 장소 영역.
데이터 세그먼트 : 초기화된 외부 변수나 static 변수 등이 저장되는 영역
BSS 세그먼트 : 초기화되지 않은 데이터 세그먼트, 0이나 NULL 포인터로 초기화
텍스트 세그먼트 : 실행코드
EIP : 코드 포인터 - 실행하는 프로그램의 포인터
물리주소 | 메모리 세그먼트 | 저장데이터 | 실제데이터 |
0x000000 ..... ..... | Text(Code) | 실행코드(보통 읽을 수 있는 부분이 있으나, 변조될 경우 Segment Fault 발생) | #include <stdio.h> int main() { printf("%s\n", string); return retVal } |
..... | Data | 전역, const, static 변수, 초기화된 변수 | int retVal = 0 static int output = 1; |
..... | BSS | 초기화되지 않은 변수 | int outVal; |
..... | Heap | 동적메모리(동적으로 할당된 데이터가 저장) | ptr = (char *)malloc(sizeof(string)); |
..... | | A V | | 힙과 스택의 여분 공간 | 변수가 늘어날 경우 힙과 스택의 시작점 사이에 있는 이 공간에 할당 |
..... | Stack | 지역변수(로컬 인자와 프로세스 상태가 저장) | char string[] = "hello"; char *ptr; |
..... | argc | 환경변수와 명령어 창의 데이터(인자)가 저장 | |
..... | ENV/argv pointers | ||
..... ..... 0xFFFFFF | ENV/argv strings |
'Security > 리버싱' 카테고리의 다른 글
level 1 문제 해결 ( /bin/ExecuteMe 해석 ) (0) | 2017.11.27 |
---|---|
level 1 문제 해결 (0) | 2017.11.27 |
GDB 사용법 (1) | 2017.11.27 |
리버싱 실습환경 구성 (0) | 2017.11.27 |
어셈블리언어 (0) | 2017.11.27 |