본문 바로가기

드림핵

[드림핵 System Hacking Fundamental] Stage 1,2

→3월 14부터 시작해서 4월 2일까지 드림핵 System Hacking 로드맵을 통해 Stage1, 2, 3, 5를 학습했다.

(Stage 4보다 5가 진입장벽이 낮아 5를 먼저 진행했다. 4는 이후에 공부할 예정이다.)

여기까지 공부한 내용을 간략하게 정리하려고 한다.

 

 


 

 

Stage1. System Hacking Introduction

Stage1은 정말 소개하는 내용으로 별 내용은 없었다.

기본적인 코드를 이해할 수 있는 수준만 되면 해당 로드맵을 따라갈 수 있다고 하면서 C와 python 코드를 제시했다.

제시된 코드를 각각 풀어보고 넘어갔다.


Stage2. Background - Computer Science

Stage2 는 컴퓨터 사이언스 배경지식을 다루었는데, 지나고 보니 이 부분 내용이 분량이 꽤나 많은 편이었음을 알게 되었다. 그리고 아주아주 중요한 내용을 다루고 있어서 뒷부분을 공부하다가도 다시 여기로 돌아와서 참고하는 경우가 많았다.

 

Stage2-1. Background: Computer Architecture

  • 폰 노이만 구조: CPU, 메모리, 버스로 구성됨
  • 명령어 집합 구조(Instruction Set Archtecture, ISA)
    • CPU가 처리할 수 있는 명령어 집합
    • CPU가 제작될 때 특정 ISA를 기반으로 만들어짐
    • 현재 가장 점유율이 높은 ISA는 x86-64아키텍처(x64아키텍처 혹은 amd64라고도 함)
  • x86-64아키텍처의 레지스터
    • 범용 레지스터(8bytes): rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp + r8, r9, ..., r15\
    • 세그먼트 레지스터(4bytes): cs, ss, ds, es, fs, gs
    • 명령어 포인터 레지스터(8bytes): rip
    • 플래그 레지스터(8bytes, 각 플래그는 1bit): CF, ZF, SF, OF
  • 레지스터 호환
    • 8bytes인 R*X 의 하위 4bytes는 E*X
    • E*X의 상위 2bytes는 *H, 하위 2bytes는 *L
    • ex) RAX, EAX, AH, AL 

 

Stage2-2. Background: Linux Memory Layout

  • Memory
    • CPU는 메모리에 있는 데이터를 읽어와 연산
    • CPU의 연산 결과를 다시 메모리에 저장
    • 메모리를 악의적으로 조작하면 CPU가 잘못된 동작을 하게 할 수 있음→Memory Corruption 취약점
  • 세그먼트
    • 적재되는 메모리의 용도별로 메모리 구획을 나눔
    • 총 5가지
    • 세그먼트마다 CPU의 권한(read, write, execute)이 다름
    • 코드 세그먼트: main() 등의 함수 코드가 저장되는 영역
    • 데이터 세그먼트: 초기화된 전역 변수, 전역 상수가 위치하는 영역
    • BSS 세그먼트: 초기화되지 않은 전역 변수 등이 위치하는 영역
    • 스택 세그먼트: 지역변수, 함수의 인자, 반환 주소 등이 저장되는 영역
    • 힙 세그먼트: malloc(), calloc() 등으로 동적할당한 메모리 공간이 위치하는 영역

 

Stage2-3. x64 Assembly🤖: Essential

  • 어셈블리어는 기계어로 코딩하는 것보다 쉽게 코드를 짜기 위해 고안됨
  • 어셈블러(Assembler): 어셈블리어를 기계어로 변환
  • 디스어셈블러(Disassembler): 기계어를 어셈블리어로 변환(소프트웨어를 분석하기 위해 개발)
  • x64 어셈블리어의 문법 구조
    • opcode + operand1 + operand2
  • x64 어셈블리어의 주요 명령어
    • 데이터 이동: mov, lea
    • 산술 연산: inc, dec, add, sub
    • 논리 연산: and, or, xor, not
    • 비교: cmp, test
    • 분기: jmp, je, jg
    • 스택: push, pop
    • 프로시져: call, ret, leave
    • 시스템 콜: syscall
    • 명령어에 대한 설명
 

8086 instructions

CLD No operands Clear Direction flag. SI and DI will be incremented by chain instructions: CMPSB, CMPSW, LODSB, LODSW, MOVSB, MOVSW, STOSB, STOSW. Algorithm: DF = 0   JNP label Short Jump if No Parity (odd). Only 8 low bits of result are checked. Set by C

dsearls.org

 

  • x64 어셈블리어의 피연산자
    • 피연산자의 종류: 상수, 레지스터, 메모리
    • 메모리 피연산자 표현법: TYPE PTR [주소값 또는 레지스터]
    • TYPE의 종류: BYTE(1byte), WORD(2bytes), DWORD(4bytes), QWORD(8bytes)