System Hacking - Stage 2 : Background - Computer Scinece

진주찬·2023년 3월 27일
0

System Hacking

목록 보기
1/6

Linux Memory Layout

세그먼트 : 적재되는 데이터의 용도별로 메모리의 구획을 나눈 것

1. 코드 세그먼트(=텍스트 세그먼트)

실행가능한 기계 코드가 위치하는 영역
ex) main()등의 함수코드

2. 데이터 세그먼트

컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들의 위치
※ data 세그먼트 : 쓰기 가능, 전역 변수와 같은 프로그램이 실행되면서 값이 변할 수 있는 데이터 위치
※ rodata 세그먼트 : 쓰기 불가, 전역 상수와 같은 값이 변하면 안되는 데이터 위치

3. BSS 세그먼트

컴파일 시점에 값이 정해지지 않은 전역 변수가 위치하는 메모리, 프로그램이 시작될 때 모두 0으로 값이 초기화 됨.
ex) 초기화되지 않은 전역 변수

4. 힙 세그먼트

실행중에 동적으로 할당되며, 스택 세그먼트와 반대로 자람.
ex) malloc(), calloc() 등으로 할당 받은 메모리

5. 스택 세그먼트

함수의 인자나 지역 변수와 같은 임시변수들이 실행 중에 저장, 스택 프레임(함수 호출 때 생성, 반환 때 해제)이라는 단위로 사용, 작은 크기의 스택 세그먼트를 먼저 할당 후 확장함, 스택이 확장 시 기존 주소보다 낮은 주소로 확장됨
ex) 지역 변수, 함수의 인자

Computer Architecture

: 컴퓨터가 효율적으로 작동하도록 하드웨어 및 소프트웨어 기능을 고안하고 구성하는 방법

폰 노이만 구조

1) 중앙처리장치(CPU) : 프로그램 연산을 처리하고 시스템을 관리하는 컴퓨터의 두뇌. 산술논리장치-제어장치-레지스터 로 구성

2) 기억장치 : 컴퓨터가 동작하는데 필요한 여러 데이터를 저장하기 위해 사용, 프로그램 실행과정에서 필요한 데이터를 임시로 저장하는 주기억장치(ex. RAM)과 운영체제와 같은 데이터를 장기간 보관하고 할 때 사용하는 보조기억장치(ex. HDD, SSD)로 구성

3) 버스 : 컴퓨터 부품과 부품 사이 또는 컴퓨터와 컴퓨터 사이에 신호를 전송하는 통로. 데이터가 이동하는 데이터 버스, 주소를 지정하는 주소버스, 읽기/쓰기를 제어하는 제어버스 있음.

x86-64 아키텍처

1. 범용 레지스터

주용도는 있으나, 그 외의 다양한 용도로 사용될 수 있는 레지스터

2. 세그먼트 레지스터

cs, ss, ds, es, fs, gs 총 6가지 세그먼트 레지스터 존재
각 레지스터 크기 = 16비트
cs, ds, ss 레지스터 : 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용

3. 명령어 포인터 레지스터

일련의 기계의 코드들 중에 CPU가 어느 부분의 코드를 실행할지 가리키는 역할

4. 플래그 레지스터

프로세서의 현재 상태 저장, 자신을 구성하는 여러 비트들로 CPU의 현재상태 표현

x86 Assembly

x86 Assembly : Essential Part

어셈블러 : 개발자들이 어셈블리어로 코드를 작성하면 컴퓨터가 이해할 수 있는 기계어로 코드 치환함.
역어셈블러 : 기계어 -> 어셈블리 언어로 번역

명령어

  1. 데이터 이동(Data Transfer) : mov, lea
    mov rdi, rsi : rsi의 값을 rdi에 대입
    mov QWORD PTR[rdi], rsi : rsi의 값을 rdi가 가리키는 주소에 대입
    lea rsi, [rbx+8*rcx] : [rbx+8*rcx]자체를 rsi에 대입

  2. 산술 연산(Arithmetic) : inc, dec, add, sub
    add dst, src : dst에 src의 값을 더함
    sub dst, src : dst에서 src의 값을 뺌
    inc op : op의 값을 1 증가시킴
    dec op : op의 값을 1 감소시킴

  3. 논리 연산(Logical) : and, or, xor, not
    and dst, src : dst와 src의 비트가 모두 1이면 1, 아니면 0
    or dst, src : dst와 src의 비트 중 하나라도 1이면 1, 아니면 0
    xor dst, src : dst와 src의 비트가 서로 다르면 1, 같으면 0(xor을 동일한 값으로 두 번 실행시, 원래값으로 돌아감)
    not op : op의 비트 전부 반전

  4. 비교(Comparison) : cmp, test
    cmp op1, op2 : 두 피연산자를 빼서 대소비교
    test op1, op2 : 두 피연산자에 AND 비트연산을 취함

  5. 분기(Branch) : jmp, je, jg
    jmp addr : addr로 rip을 이동시킴
    je addr : 직전에 비교한 두 피연산자가 같으면 점프
    jg addr : 직전에 비교한 두 연산자 중 전자가 더 크면 점프

  6. 스택(Stack) : push, pop
    push val : val을 스택 최상단으로 쌓음
    pop reg : 스택 최상단의 값을 꺼내서 reg에 대입

  7. 프로시져(Procedure) : 특정 기능을 수행하는 코드 조각, call, ret, leave
    call addr : addr에 위치한 프로시져 호출
    leave: 스택프레임 정리
    ret : return address로 변환

  8. 시스템 콜(System call) : 유저모드에서 커널모드의 시스템 소프트웨어에게 어떤 동작을 요청하기 위해 사용, syscall
    syscall : 요청: rax
    인자 순서: rdi → rsi → rdx → rcx → r8 → r9 → stack
    커널모드 : 운영체제가 전체 시스템을 제어하기 위해 시스템 소프트웨어에 부여하는 권한
    유저모드 : 운영체제가 사용자에게 부여하는 권한

0개의 댓글