본문 바로가기

DreamHack: System Hacking

(45)
Background: x86 Assembly Essential Part(1) 어셈블리 명령어 어셈블리어 기본 구조 어셈블리어는 명령어와 피연산자로 이루어져 있다. 주로 어셈블리어의 형식은 [명령어] [피연산자]이다. 주요 명령어는 다음과 같다 데이터 이동(Data Transfer) mov, lea 산술 연산(Arithmetic) inc, dec, add, sub 논리 연산(Logical) and, or, xor, not 비교(Comparison) cmp, test 분기(Branch) jmp, je, jg 스택(Stack) push, pop 프로시져(Procedure) call, ret, leave 시스템 콜(System call) syscall 피연산자에는 상수, 레지스터, 또는 메모리가 올 수 있다. 메모리 피연산자는 []로 둘러싸인 것으로 표현되며, "TYPE" PTR [주소] 와 같이 표현..
Quiz: Linux Memory Layout 코드: #include int a = 0xa; const char b[] = "d_str"; int c; int foo(int arg) { int d = 0xd; return 0; } int main() { int *e = malloc(sizeof(*e)); return 0; } 문제 및 풀이: 1. a가 위치하는 세그먼트는 어디인가? 풀이: a는 초기화된 전역 변수이므로, 데이터 세그먼트에 위치한다. 2. "d_str"가 위치하는 세그먼트는 어디인가? 풀이: "d_str"은 전역 상수이므로 read-only data에 해당한다. 3. e는 어느 세그먼트의 데이터를 가리키는가? 풀이: e는 동적으로 할당받은 힙 세그먼트의 주소를 가리킨다 4. c가 위치하는 세그먼트는 어디인가? 풀이: c는 초기화되지 않..
Background: Linux Memory Layout 세그먼트(Segment) 리눅스에서는 프로세스의 메모리를 아래의 그림과 같이 크게 5가지의 세그먼트(Segment)로 구분한다. 이 중 '코드, 데이터, BSS' 세그먼트는 크기가 정해져있으며, 힙 세그먼트와 스택 세그먼트의 크기는 유동적이고 서로 다른 방향으로 자란다 코드 세그먼트 실행 가능한 기계 코드가 위치하는 영역 데이터 세그먼트 컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들이 위치하는 영역. 데이터 세그먼트는 다시 쓰기가 가능한 data 세그먼트와 쓰기가 불가능한 rodata(read-only-data) 세그먼트로 나뉜다. data 세그먼트: 전역 변수와 같이 프로그램이 실행되면서 값이 변할 수 있는 데이터들이 위치한다. rodata(read-only-data) 세그먼트: 프로그램이 실행..
Quiz: Computer Architecture Quiz 1, 2, 3, 4: rax = 0x0123456789abcdef 일 때, al ah, eax, ax 값은? 풀이: rax는 64비트 크기로, eax는 rax의 하위 32비트를 가리키며, ax는 rax의 하위 16비트이다. ax의 하위 분류에 속하는 ah와 al 중 ah는 ax의 상위 8비트, al은 ax의 하위 8비트이다. 따라서, al == 0xef ah == 0xcd ax == 0xcdef eax == 0x89abcdef 이다. Quiz 5: rax에서 rbx를 뺐을 때, ZF가 설정되었다. rax와 rbx의 대소를 비교하시오. 풀이: ZF(Zero Flag)는 연산의 결과가 0일 때 설정된다. 따라서 rax==rbx이다
Background: Computer Architecture 1. 컴퓨터 구조(폰 노이만 구조) 컴퓨터에는 '연산, 제어, 저장'이라는 세 가지 핵심 기능이 필요하다. 중앙처리장치(CPU)🧠: 연산과 제어를 위해 사용되는 컴퓨터 장치. CPU의 장치 구성은 크게 세 가지로 구성 되어있다. 1) 산술논리장치(ALU): 산술/논리 연산을 처리한다. 2) 제어장치(Control Unit): CPU를 제어한다. 3) 레지스터(Register): CPU에 필요한 데이터를 저장한다. 기억장치💾: 컴퓨터가 동작하는 데 필요한 여러 데이터를 저장하기 위해 사용된다. 기억장치는 크게 주기억장치와 보조기억장치로 나뉜다. 1) 주기억장치(RAM): "프로그램 실행과정"에서 필요한 데이터들을 "임시로 저장"하기 위해 사용된다. 2. 보조기억장치(HDD or SSD): "프로그램 실행과..