목차
범용 레지스터
- 범용 레지스터는 총 8개로 각 범용 레지스터의 크기는 당연히 32bit다.
① EAX : 피연산자 및 결과 데이터를 위한 누적 장치
② EBX : 메모리 구조를 저장
③ ECX : while, for 같은 반복 명령어를 사용할 때 반복 카운터로 사용한다.
④ EDX : 데이터를 저장하고 부호확장 명령, 큰 수 연산에 사용된다.
위의 4개의 레지스터는 주로 산술연산 명령어에서 상수/변수 값을 저장하는 용도로 사용된다.
⑤ ESP : 스택의 끝 지점을 가리킴
⑥ EBP : 스택의 시작 지점을 가리킴
⑦ ESI : 데이터를 조작하거나 복사할 때 복사할 데이터의 주소를 저장한다.
⑧ EDI : 데이터를 복사할 때 목적지의 주소가 저장된다.
세그먼트 레지스터
- 종류는 총 6개고 크기는 16bit다.
- 세그먼트 : 프로그램에 정의된 특정 영역으로 데이터, 코드, 스택 영역을 포함한다.
- 세그먼트 레지스터는 세그먼트에 대한 주소를 제공한다.
① CS : 코드 영역 시작 주소
② SS : 스택 영역 시작 주소
③ DS : 데이터 영역 시작 주소
④ ES : 추가 레지스터
⑤ FS : 여분의 레지스터
⑥ GS : 여분의 레지스터
플래그 레지스터(EFLAGS)
- 크기 : 32bit
- 플래그 레지스터는 크게 상태 플래그와 제어 플래그로 나눌 수 있다.
1) 상태 플래그
① CF : 부호 없는 수의 연산 시 오버플로우가 발생하면 플래그 값 1
② PF : 1의 개수가 짝수면 플래그 값 1
③ OF : 부호 있는 산술 연산 결과가 너무 크거나 작을 때 플래그 값 1
④ AF : 산술 연산이 8비트 연산에서 비트 3 -> 비트 4로 캐리가 발생 시 플래그 값 1
⑤ SF : 산술/논리연산의 결과가 음수면 플래그 값 1
⑥ ZF : 연산 결과가 0이면 플래그 값 1
2) 제어 플래그
① DF : 문자열 조작시 해당 플래그 값이 1이면 높은 주소에서 낮은 방향으로 처리
② TF : 플래그 값이 1이면 CPU가 명령을 실행할 때마다 인터럽트 발생
③ IF : 플래그 값이 1이면 인터럽트 요구를 받아들임
스택 구조
스택은 메모리의 한 영역이다. 함수를 호출할 때 생성되는 지역 변수, 매개 변수가 스택에 저장되고 함수 호출이 끝나면 스택에 저장된 변수들은 사라진다. 스택의 가장 큰 특징은 메모리 주소가 높은 주소부터 낮은 주소 방향으로 할당되는 것이다.
스택 프레임
- 스택 프레임은 서브 루틴(함수)이 가지는 스택 영역을 말한다.
- 함수 호출이 발생하면 스택 프레임이 생성된다. -> 생성된 스택 프레임에는 EBP의 초기 값이 저장되고 현재의 ESP를 EBP에 다시 저장한다. -> 함수에서 사용되는 변수들이 저장된다. -> 함수의 연산이 다 진행되면 EBP에 저장했던 초기 ESP값을 다시 복원하고 EBP의 값도 함수를 시작하기 전의 EBP 값으로 복원한 다음에 함수가 종료된다.
'Study > 리버싱' 카테고리의 다른 글
[3] UPX 패킹과 언패킹 (0) | 2020.11.01 |
---|---|
[3] IAT와 EAT 로딩 과정 (0) | 2020.10.26 |
[3] ㄷㄹㅎ 4,5 (0) | 2020.10.25 |
[2] 2주차 과제 (0) | 2020.09.20 |
[1] 32bit와 64bit의 함수 호출 규약 (1) | 2020.09.14 |