Reverse Engineering

Background: Computer Architecture

박연준 2023. 7. 2. 14:57

  • 서도 다른 부품들이 모여서 ‘컴퓨터’라는 하나의 기계로서 동작할 수 있는 것은 컴퓨터에 대한 기본 설계가 존재하기 때문이다.
  • 컴퓨터 과학에서는 이러한 설계를 ‘컴퓨터 구조(Computer Architecture)’라고 부른다.
  • 전체적인 컴퓨터 구조 중에서 특히 CPU가 사용하는 명령어와 관련된 설계를 명령어 집합구조(Instruction Set Architecture, ISA)라고 하는데, 가장 널리 사용되는 ISA 중 하나가 인텔의 x86-64 아키텍처이다.
💡
컴퓨터 과학을 배워야 하는 이유
리버스 엔지니어링의 기술은 컴퓨터 과학에 뿌리를 두고 있다. 따라서 숙련된 리버스 엔지니어가 되기 위해선 단순히 알려진 기술을 습득하는 것에 그치지 않고 바탕이 되는 컴퓨터 과학을 이해하기 위해 노력해야 한다.

컴퓨터 구조의 세부 분야

  • 기능 구조의 설계
    • 폰 노이만 구조
    • 하버드 구조
    • 수정된 하버드 구조
  • 명령어 집합구조
    • x86, x86-64
    • ARM
    • MIPS
    • AVR
  • 마이크로 아키텍처
    • 캐시 설계
    • 파이프라이닝
    • 슈퍼 스칼라
    • 분기 예측
    • 비순차적 명령어 처리
  • 하드웨어 및 컴퓨팅 방법론
    • 직접 메모리 접근

폰 노이만 구조

  • 초기 과학자 중 한명인 폰 노이만은 컴퓨터에 연산, 제어, 저장의 세 가지 핵심 기능이 필요하다고 생각했다.
  • 근대의 컴퓨터는 연산과 제어를 위해 중앙처리장치(Central Processing Unit, CPU)를, 저장을위해 기억장치(memory)를 사용한다.
  • 그리고 장치간에 데이터나 제어 신호를 교환할 수 있도록 버스(bus)라는 전자 통로를 사용한다.

💡
주 기억장치와 보조기억장치가 있는데 CPU안에 다른 저장장치가 왜 필요한가?
CPU는 굉장히 빠른 속도로 연산을 처리하는데, 이를 위해 데이터의 빠른 교환이 필요합니다.

예를 들어 사탕을 1초에 100개 생산하는 기계가 있다고 가정합시다. 만약 이 기계에 매초 필요한 재료를 공급하지 못한다면, 재료가 공급될 때까지 대기해야 하므로 최대의 생산효율을 달성할 수 없습니다. 마찬가지로, 완성된 사탕을 초당 100개씩 가져가지 못한다면, 결국 기계 앞에 사탕이 쌓여서 생산을 중단해야 합니다.

이와 마찬가지로 CPU도 필요한 데이터를 빠르게 공급하고, 반출할 수 있어야 장치의 효율을 제대로 발휘할 수 있습니다. 그런데 CPU의 연산속도는 주기억장치 및 보조기억장치와의 데이터 교환속도보다 압도적으로 빠르기 때문에, 이들만 사용하면 병목현상이 발생합니다. 그래서 CPU는 데이터의 교환속도를 획기적으로 단축하기 위해 레지스터와 캐시라는 저장장치를 내부에 갖고 있습니다.

명령어 집합 구조

  • 명령어 집합 구조(Instruction Set Architecture, ISA)란 CPU가 해석하는 명령어의 집합을 의미한다.
  • ISA는 IA-32, x86-64(x64), MIPS, AVR 등 다양하게 존재한다.
  • x86-64 아키텍처는 2020년 CPU 점유율에서 56%로 가장 도적이다.

x86-64 아키텍처

  • x64 아키텍처는 인텔의 64비트 CPU 아키텍처이다.
  • 인텔의 32비트 CPU 아키텍처인 IA-32를 64비트 환경에서 사용할 수 있도록 확장한 것으로, 대다수의 개인용 컴퓨터들이 인텔의 x64 CPU를 사용하고 있다.
  • x86-64는 Intel64, IA-32e, EM64T 또는 amd64라고 불린다.

x86-64 아키텍처: 레지스터

  • 레지스터는 CPU 내부의 저장장치로, CPU가 빠르게 접근하여 사용할 수 있다.
  • 산술 연산에 필요한 데이터를 저장하거나 주소를 저장하고 참조하는 등 다양한 용도로 사용된다.
  • x64 아키텍처에는 범용 레지스터(General Register), 세그먼트 레지스터(Segment Register), 명령어 포인터 레지스터(Instruction Pointer Register, IP) 그리고 플래그 레지스터(Flag Register)가 존재한다.

범용 레지스터

  • 범용 레지스터는 주용도는 있으나, 그 외 임의의 용도로도 사용될 수 있는 레지스터이다.
  • x86-64에서 각각의 범용 레지스터는 8바이트를 저장할 수 있으며, 부호 없는 정수를 기준으로 2^64 - 1까지 나타낼 수 있다.
  • 자주 쓰이는 범용 레지스터들의 주용도는 다음과 같다. 여기 서술된 레지스터 외에도 x64에는 r8,r9, … , r15까지의 범용 레지스터가 더 존재한다.
    이름주용도
    rax (accumulator register)함수의 반환 값
    rbx (base register)x64에서는 주된 용도 없음
    rcx (counter register)반복문의 반복 횟수, 각종 연산의 시행 횟수
    rdx (data register)x64에서는 주된 용도 없음
    rsi (source index)데이터를 옮길 때 원본을 가리키는 포인터
    rdi (destination index)데이터를 옮길 때 목적지를 가리키는 포인터

세그먼트 레지스터

  • x64 아키텍처에는 cs, ss, ds, es, fs, gs 총 6가지 세그먼트 레지스터가 존재하며, 각 레지스터의 크기는 16비트이다.
  • 세그먼트 레지스터는 x64로 아키텍처가 확장되면서 용도에 큰 변화가 생긴 레지스터이다.
  • 현대의 x64에서 cs, ds, ss 레지스터는 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용되고 나머지 레지스터는 운영체제 별로 용도를 결정할 수 있도록 범용적인 용도로 제작된 세그먼트 레지스터이다.

명령어 포인터 레지스터

  • 프로그램의 코드는 기계어로 작성되어 있다.
  • 이 중에서 CPU가 어느 부분의 코드를 실행할지 가리키는게 명령어 포인터 레지스터의 역할이다.
  • x64 아키텍처의 명령어 레지스터는 rip이며, 크기는 8바이트이다.

플래그 레지스터

  • 플래그 레지스터는 프로세서의 현재 상태를 저장하고 있는 레지스터이다.
  • x64 아키텍처에서는 RFLAGS라고 불리는 64비트 크기의 플래그 레지스터가 존재하며, 과거 16비트 플래그 레지스터가 확장된 것이다.
  • 플래그 레지스터는 자신을 구성하는 여러 비트들로 CPU의 현재 상태를 표현한다.
  • 플래그 레지스터의 여러 플래그 비트들 중 앞으로 주로 접하게 될 것들은 다음과 같다.
    플래그의미
    CF(Carry Flag)부호 없는 수의 연산 결과가 비트의 범위를 넘을 경우 설정 됩니다.
    ZF(Zero Flag)연산의 결과가 0일 경우 설정 됩니다.
    SF(Sign Flag)연산의 결과가 음수일 경우 설정 됩니다.
    OF(Overflow Flag)부호 있는 수의 연산 결과가 비트 범위를 넘을 경우 설정 됩니다.

레지스터 호환

  • 앞에서 x86-64 아키텍처는 IA-32의 64비트 확장 아키텍처이며, 호환이 가능하다고 했다.
  • IA-32에서 CPU의 레지스터들은 32비트 크기를 가지며, 이들의 명칭은 각각 eax, ebx, ecx, edx, esi, edi, esp, ebp였다.
  • 호환성을 위해 이 레지스터들은 x86-64에서도 그대로 사용이 가능하다.
  • 앞서 소개한 rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp가 이들의 확장된 형태이며, eax, ebx 등은 확장된 레지스터의 하위 32비트를 가르킨다.
  • 마찬가지로 16비트 아키텍처도 호환 가능하며, ax, bx, cx, dx, si, di, sp, bp가 존재한다.

'Reverse Engineering' 카테고리의 다른 글

x86 Assembly: Essential Part(2)  (0) 2023.07.02
x86 Assembly: Essential Part(1)  (0) 2023.07.02
Background: Windows Memory Layout  (0) 2023.07.02
Static Analysis vs. Dynamic Analysis  (0) 2023.07.02
Background: Binary  (0) 2023.07.02