- 컴퓨터 언어
- CPU와 레지스터
- 메모리 구조
컴퓨터 언어
사람과 컴퓨터가 대화하기 위해 프로그래밍 언어를 사용하나 컴퓨터는 실제 소스 코드를 이해하지 못하기 때문에 내부적으로 컴파일을거쳐 CPU가 이해할 수 있는 기계어로 대화한다.

int sum(int a, int b) {
return a + b;
}
int minus(int a, int b) {
return a - b;
}
int main() {
int x = 1;
int y = 2;
printf("sum: %d\n", sum(x, y));
printf("minus: %d\n", minus(x, y));
}
*간단한 덧셈, 뺄셈 프로그램 소스코드
이 소스는 컴파일 과정을 거친 후 아래와같이 기계어로 번역된다.

프로그램이 실행되는 EntryPoint로 call 함수를 통해서 sum, minus 함수를 불러오는 것을 볼 수 있다.
CPU와 레지스터
CPU
CPU는 인간으로 따지면 뇌에 해당하는 부분이다. CPU는 연산 장치, 제어 장치, 레지스터로 구성된다.
- 연산 장치(ALU): 수칙연산, 논리연상 등의 수학적 연산을 담당한다.
- 제어 장치(CU): 메모리에서 기계어 코드를 읽고 해석한 뒤 실행하는 역할을 담당한다.
- 레지스터: 연산을 위해 CPU가 사용하는데이터 저장소로, 주로 메모리의 특정 주소 또는 특정 값을 저장한다.
레지스터
명령어를 실행하기 위해 필요한 데이터와 상태, 명령어를 저장하는 공간이다. CPU 내부에 존재하며, 기억 장치 중 가장 빠르며 용량이 작다. 레지스터는 범용 레지스터, 명령어 포인터, 세그먼트 레지스터, 플래그 레지스터 등이 있다. 다음과 같은 그림의 구조로 이루어져있다.

| 레지스터 | 역할 |
| EAX | 산술 계산 및 리턴 값전달에 사용되며, 가장 자주 사용된다. |
| EBX | 범용적으로 사용 가능한 추가적인 레지스터이다. |
| ECX | 일반적으로 반복문이나 문자열 복사 시카운트에 사용된다. |
| EDX | EAX와 비슷하게 주로 연산에 사용된다. |
| ESI | 주로 문자열 메모리 값을 복사할 때 원본 주소를 가리킨다. |
| EDI | 주로 문자열 메모리 값을 복사할 때 목표 주소를 가리킨다. |
| EBP | 스택 프레임시작 주소가 저장된다. |
| ESP | 스택프레임의 끝 지점이 저장된다. |
| EIP | 다음에 실행할 명령어의 주소가 저장된다. |
| 세그먼트 레지스터 | 각 세그먼트의 오프셋이 저장된다. |
| 플래그 레지스터 | 연산 결과에 따라 다양한 상태 값을 표시한다. |
메모리 구조
모든 프로그램은 실행하기 전에 메모리에 로드되어야 하며, 취약점이 발생하는곳도 메모리이며 취약점에 대한 공격이 이루어지는 곳도 메모리이다.윈도우의 메모리 구조는 32bit의 경우 기본적으로 프로세스별로 4GB로 구성된다. 이 큰 용량을 활용하기 위해 윈도우 운영체제는 가상 메모리를 사용한다. 유저영역 2GB, 커널 영역 2GB로 총 4GB의 독립된 메모리 공간을 가지고 있으며, 실제로 커널영역 2GB는 모든 프로세스가 공유한다. 메모리는 크게 스택, 힙, PE, DLL, 공유영역이 존재하며 다음과 같이 표현할 수 있다.이 때, 스택의 경우는 높은 주소에서 낮은 주소로, 힙 메모리는 낮은 주소에서높은 주소로 할당된다.




































