범용 레지스터
EAX (Extended Accumulator Register)
Accumulator for operands and results data
입출력 및 대부분의 산술 연산 및 특정 명령의 리턴 값을 저장하고 리턴하는 데 사용
EBX (Extended Base Register)
Pointer to data in the DS segment
세그먼트의 포인터 저장 및 메모리 주소 저장을 위한 레지스터
ECX (Extended Counter Register)
Counter for string and loop operations
반복 작업(루프)의 횟수를 제어하는 카운터로 사용되며, 루프마다 ECX가 1씩 감소. 비트 이동 연산 시 이동할 비트 수를 지정하는 데도 사용
EDX (Extended Data Register)
I/O pointer
입출력 연산에 사용되며 EAX와 함께 큰 수의 연산을 수행
포인터 레지스터
ESP (Extended Stack Pointer Register)
Stack pointer (in the SS segment)
스택 영역의 최하위 주소 저장
EBP (Extended Base Pointer Register)
Pointer to data on the stack (in the SS segment)
스택 세그먼트에서 호출된 함수의 시작 주소 값 저장
ESI (Extended Source Index Register)
Source pointer for string operations
메모리 Source 영역에서 데이터를 연속적으로 복사할 때 사용
EDI (Extended Destination Index Register)
Destination pointer for string operations
메모리 영역에서 데이터를 연속적으로 복사할 때 Destination 영역 주소로 사용
명령 포인터 레지스터
EIP (Extended Instruction Pointer)
현재 실행 중인 코드 세그먼트의 현재 명령을 가리킴
세그먼트 레지스터
CS (Code Segment Register)
Code Segment
16비트 / 실행될 기계 명령을 포함하며 코드 세그먼트 시작 주소를 가리킴
SS (Stack Segment Register)
Stack Segment
16비트 / 스택 세그먼트의 시작 주소를 가리킴 프로그램 실행 중 필요한 데이터나 연산 결과를 임시로 저장하거나 삭제하는 데 사용
DS (Data Segment Register)
Data Segment
16비트 / 프로그램에 정의된 데이터, 상수, 작업 영역을 포함하며 데이터 세그먼트의 시작 주소를 가리킴 데이터 참조 시 오프셋을 DS 레지스터의 주소 값에 더해 데이터 세그먼트 내 데이터에 접근
ES (Extra Segment Register)
Extra(data) Segment
16비트 / 추가 데이터 세그먼트의 주소를 가리킴 문자열 데이터 처리 시 EDI 레지스터와 함께 사용
FS
Data Segment
보조 세그먼트 레지스터 / 16비트 / 추가 데이터 세그먼트의 주소를 가리킴
애플리케이션 디버깅에 자주 등장 SEH,TEB, PEB 등의 주소를 계산할 때 사용
GS
Data Segment
보조 세그먼트 레지스터 / 16비트 / 추가 데이터 세그먼트의 주소를 가리킴
컨트롤 레지스터 및 상태 플래그
EFLAGS
Flag Register
플래그 레지스터 / 32비트(4바이트) 크기 / 연산 결과 및 시스템 상태와 관련된 여러 가지 플래그 값 저장, 컴퓨터의 다양한 상태를 나타내는 비트를 포함하며 각 비트는 1과 0의 값을 가지며 True와 Fasle/ On과 Off, Set과 Clear를 의미
★ CF (Carry Flag)
(비트 0) / 부호 없는 수(unsigned integer)의 오버플로가 발생시 1로 세팅, 산술 연산 결과로 자리올림이나 자리내림이 발생할 때 1로 세팅
★ ZF (Zero Flag)
(비트 6) / 연산 명령 후 결과 값이 0이 되면 1로 세팅, 0 이외는 0으로 세팅
★ OF (Overflow Flag)
(비트 11) / 부호 있는 수(signed integer)의 오버플로가 발생하거나 MSB(Most Significant Bit)가 변경되었을 때 1로 세팅
PF (Parity Flag)
(비트 2) / 산술 연산 결과가 짝수이면 1로 세팅
AF (Adjust Flag)
(비트 4) / 8비트 피연산자를 상요한 산술 연산에서 비트 3을 비트 4로 자리올림 시 1로 세팅
SF (Sign Flag)
(비트 7) / 산술 및 논리 연산 결과가 음수면 1로 세팅
제어플래그 (Control Flag)
DF ( Direction Flag)
(비트 10) / 스트링 명령을 제어하며 DF가 1이면 스트링 명령은 자동 감소(스트링을 높은 주소에서 낮은 주소로), 0이면 스트링 명령은 자동 증가(스트링을 낮은 주소에서 높은 주소로 처리)
※스트링 명령 : MOVS, CMPS, SCAS, LODS, STOS
시스템 플래그 (System Flag)
TF (Trap Falg)
(비트 8) / 추적 플래그로 디버깅 시, 싱글 스텝 모드 'Single Step Mode' 활성화할 때 1로 세팅, 비활성 시 0으로 세팅
IF (Interrupt enable Flag)
(비트 9) / 프로세서의 인터럽트 처리 여부를 제어하며 1로 세팅되어 있으면 시스템의 인터럽트를 처리, 0으로 세팅되어 있으면 시스템 인터럽트 무시
IOPL (I/O Privilege Level)
(비트 12,13) / 현재 실행하는 프로그램이나 태스크의 특권 레벨을 지시,
NT (Nested Task flag)
(비트 14) / 인터럽트하거나 호출된 태스크 제어, 현재 Task를 이전에 실행된 Task와 연결했으면 1로 세팅, 아니면 0으로 세팅
RF (Resum Flag)
(비트 16) / 프로세서 디버그 예외 반응 제어, 1로 세팅되어 있으면 디버그 오류를 무시하고 다음 명령어를 수행
VM (Virtual 8086 Mode Flag)
(비트 17) / V86 모드 활성시 1로 세팅, 사용하지 않고 보호 모드로 리턴하면 0으로 세팅
AC (Alignment Check)
(비트 18) / 메모리 참조시 정렬 기능을 활성화하면 1로 세팅, 아니면 0으로 세팅
VIF (Virtual interrupt Flag) / VIP (Virtual Interrupt Pending)
(비트 19 / 비트 20) / 가상 모드 확장과 관련하여 사용하며 VIF는 가상 이미지의 인터럽트 요구를 받아들이면 1로 세팅, VIP는 인터럽트가 지연시 1로 세팅
ID (IDentification)
(비트 21) / CPUID 명령의 지원 유무 결정
참고자료
이승원, 「리버싱 핵심원리」, 인사이트, 2019 양대일, 「시스템 해킹과 보안 3판」, 한빛아카데미, 2018 |
'시스템 > 리버싱' 카테고리의 다른 글
어셈블리 전송 명령어 (0) | 2025.06.23 |
---|---|
어셈블리 산술 연산 명령어 (0) | 2025.06.22 |
dreamhack Quiz:x86 Assembly 2 (0) | 2022.08.25 |
dreamhack Quiz:x86 Assembly 1 (0) | 2022.08.24 |