reversing

범용 레지스터, 플래그 레지스터, 스택 프레임

hauni 2024. 9. 28. 01:30

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개가 있음

  1. ZF zero flag: 연산 명령 후 결과값이 0이 되면 ZF가 1(true)로 세팅됨
  2. ex) mov eax, 1 → mov ebx, 1 → sub eax, ebx → r = 0 ⇒ ZF =1
  3. OF overflow flag: 부호가 있는 수 signed integer의 오버플로가 발생했을 때 1로 세팅됨. MSB(최상위 비트)가 변경되었을 때 1로 세팅됨
  4. CF carry flag: 부호가 없는 unsigned integer의 오버플로가 발생했을 때 1로 세팅됨

Stack 스택

스택의 역할

  1. 함수 내의 로컬 변수가 임시 저장됨
  2. 함수 호출 시 매개변수 parameter 전달
  3. 복귀 주소 저장

스택의 특징

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를 기준으로 안전하게 해당 변수나 파라미터, 복귀 주소에 접근 가능하다. 다만, 스택에 값이 저장되는 것이 보안에 취약할 수 있다.