ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 4 IA-32 Register 기본 설명
    리버싱 엔지니어링/리버싱 핵심 원리 2022. 2. 6. 03:18

    IA-32 Register : 인텔의 32비트 마이크로 프로세스에서 사용하는 명령 집합 아키텍처

    4.1 CPU 레지스터

    레지스터(Register) : CPU 내부에 존재하는 다목적 저장 공간. CPU와 한 몸 이기 때문에 고속으로 데이터 처리 가능

    • 어셈블리 명령어의 대부분은 레지스터를 조작하고 그 내용을 검사하는 것들이기 때문에 레지스터에 대해서 알아야 함.

    4.2 Bagic program execution registers

    : IA-32 Register 종류 중 하나. 디버깅 초급 단계에서 알아두면 좋음.

     

    4.2.1 범용 레지스터 (General-Purpose Registers)

    : 범용적으로 사용되는 레지스터(막 쓰는 레지스터)

    • 각각의 범용 레지스터들의 크기 : 32비트(4바이트)
    • 상수/주소 등을 저장하기 위해 사용

    레지스터의 구성

    • 예시 ) EAX 기준
      • EAX : (0~31) 32비트
      • AX : (0~15) EAX의 하위 16비트
      • AH : (8~15) AX의 상위 8비트
      • AL : (0~7) AX의 하위 8비트
    • 상황에 맞게 레지스터를 8비트, 16비트, 32비트 나누어 사용

    상수/변수 값의 저장 용도로 쓰이는 레지스터

    • EAX : 산술 연산에 주로 사용 되고 함수 리턴 값을 저장하는데에 사용됨.
    • EBX : 데이터 주소를 가리키는 포인터로 사용.
    • ECX : 반복문 명령어에서 반복 카운트로 사용. 루프를 톨 때마다 ECX를 1씩 감소시킴.
    • EDX : 산술 연산 및 I/O 명령에서 사용.

    메모리 주소를 저장하는 용도로 쓰이는 레지스터 (포인터로 사용)

    • EBP : 함수가 호출되었을 때 그 순간의 ESP를 저장하고 있다가, 함수가 리턴하기 직전에 다시 ESP에 값을 되돌려주어 스택이 깨지지 않도록 (Stack Frame 기법)
    • ESI, EDI : 특정 명령어(LODS, STOS, REP MOVS 등)과 함께 주로 메모리 복사에 사용됨.
    • ESP : 스택 메모리 주소를 가리킴

     

    4.2.2 세그먼트 레지스터(Segment Registers)

    : 메모리를 조각내어 각 조각마다 시작 주소, 범위, 접근 권한 등을 부여해서 메모리를 보호하는 기법

    • 각각 레지스터의 크기 : 16비트(2바이트)

    레지스터 구성

    • CS : 코드 세그먼트
    • SS : 스택 세그먼트
    • DS: 데이터 세그먼트
    • ES, FS, GS : 추가적인 데이터 세그먼트
      • FS는 애플리케이션 디버깅에도 등장. 고급 디버깅 주제.

     

    4.2.3 프로그램 상태와 컨트롤 레지스터(Program Status and Control Register)

    • 레지스터 크기 : 32비트(4바이트)

    • 각 비트마다 의미를 가지고 있음
      • 0,1의 값을 가지는데 On/Off 혹은 True/false를 의미

    애플리케이션 디버깅에 필요한 flag

    • Zero Flag(ZF) : 연산 명령 후 결과 값이 0이 되면 1(True)로 세팅
    • Overflow Flag(OF) : 부호 있는 수(signed integer)의 오버플로가 발생했을 때 1로 세팅.
    • Carry Flag(CF) : 부호 없는 수(unsigned integer)의 오버플로가 발생했을 때 1로 세팅.

     

    4.2.4 (Instruction Pointer)

    • 레지스터 크기 : 32비트(4바이트
    • CPU는 EIP에 저장된 메모리 주소의 명령어를 처리하고 자동으로 그 명렁어 길이만큼 EIP를 증가시키며 명령어를 처리해 나감.
    • EIP 값은 직접 변경 불가
      • 특정 명령어(JMP, Jcc, CALL, RET)를 사용하거나 인터럽트, 예외를 발생시켜야 함.

    '리버싱 엔지니어링 > 리버싱 핵심 원리' 카테고리의 다른 글

    5 스택  (0) 2022.02.06
    2 Hello World! 리버싱(2) - 문자열 패치  (0) 2022.02.06
    3 리틀 엔디언 표기법  (0) 2022.02.06
    2 Hello World! 리버싱(1)  (0) 2022.02.05
    1 리버싱 엔지니어링  (0) 2022.01.07

    댓글

Designed by Tistory.