general register 범용 레지스터
reg size: 4 byte
종류: EAX, EBX, ECX, EDX, EBP, ESI, EDI, ESP, EIP
EAX, EBX, ECX, EDX → 산술 명령어에서 상수나 변수값이 저장되는 용도
EAX는 결과값을 저장하거나 오퍼랜드(피연산자)를 축적
ECX는 while, for 반복문을 사용할 때 ECX loop count -1 감소
ESI, EDI, EBP, ESP은 메모리 주소를 저장하는 포인터로 사용
EBP는 ESP 값을 저장
ESP는 스택 메모리 주소를 저장
EIP는 CPU가 처리할 명령어 주소
EAX: 4byte
AX: 2byte
AH(high): 1byte
AL(low): 1byte
flag register 플래그 레지스터
명령어의 실행 여부를 결정함
명령 수행에 따라 true(1) or false(0)로 세팅되어 32개가 있음
- ZF zero flag: 연산 명령 후 결과값이 0이 되면 ZF가 1(true)로 세팅됨
- ex) mov eax, 1 → mov ebx, 1 → sub eax, ebx → r = 0 ⇒ ZF =1
- OF overflow flag: 부호가 있는 수 signed integer의 오버플로가 발생했을 때 1로 세팅됨. MSB(최상위 비트)가 변경되었을 때 1로 세팅됨
- CF carry flag: 부호가 없는 unsigned integer의 오버플로가 발생했을 때 1로 세팅됨
Stack 스택
스택의 역할
- 함수 내의 로컬 변수가 임시 저장됨
- 함수 호출 시 매개변수 parameter 전달
- 복귀 주소 저장
스택의 특징
LIFO, 스택에서 esp는 움직이고 ebp(esp 값 저장)는 움직이지 않는다
Stack Frame 스택 프레임
스택 프레임을 이해하면 디버깅에 큰 도움이 될 것
스택 프레임: esp가 아닌 ebp를 이용하여 스택 내 변수 파라미터 복귀 주소에 접근하는 기법
ex) 어셈블리 코드
PUSH EBP: 함수 시작 스택으로 EBP 백업
MOV EBP, ESP: ESP값을 EBP에 넣음 (esp 백업)
.
. (함수 로직). 여기서 esp가 변경되어도 괜찮다
.
MOV ESP, EBP: ESP 복원
POP EBP: EBP 복원
RETURN: 함수 종료
위 코드를 보면 esp값이 아무리 바뀌어도 ebp를 기준으로 안전하게 해당 변수나 파라미터, 복귀 주소에 접근 가능하다. 다만, 스택에 값이 저장되는 것이 보안에 취약할 수 있다.
'reversing' 카테고리의 다른 글
레지스터, 프로세스 메모리 구조, 섹션, 스택, 힙 (0) | 2024.10.27 |
---|---|
악성코드 종류와 분석 (1) | 2024.10.19 |
static vs. dynamic analysis (0) | 2024.10.13 |
Binary (0) | 2024.10.13 |
리버싱 개념, 크랙과 패치, 바이트 오더링 (0) | 2024.09.28 |