본문 바로가기

DreamHack: System Hacking/F Stage 2

(8)
Quiz: x86 Assembly 2 문제: 다음 어셈블리 코드를 실행했을 때 출력되는 결과로 올바른 것은? [Code] main: push rbp mov rbp, rsp mov esi, 0xf mov rdi, 0x400500 call 0x400497 mov eax, 0x0 pop rbp ret write_n: push rbp mov rbp, rsp mov QWORD PTR [rbp-0x8],rdi mov DWORD PTR [rbp-0xc],esi xor rdx, rdx mov edx, DWORD PTR [rbp-0xc] mov rsi,QWORD PTR [rbp-0x8] mov rdi, 0x1 mov rax, 0x1 syscall pop rbp ret ================================== [Memory] 0x4005..
Quiz: x86 Assembly 1 문제: end로 점프하면 프로그램이 종료된다고 가정하자. 프로그램이 종료됐을 때, 0x400000 부터 0x400019까지의 데이터를 대응되는 아스키 문자로 변환하면 어느 문자열이 나오는가? [Register] rcx = 0 rdx = 0 rsi = 0x400000 ======================= [Memory] 0x400000 | 0x67 0x55 0x5c 0x53 0x5f 0x5d 0x55 0x10 0x400008 | 0x44 0x5f 0x10 0x51 0x43 0x43 0x55 0x5d 0x400010 | 0x52 0x5c 0x49 0x10 0x47 0x5f 0x42 0x5c 0x400018 | 0x54 0x11 0x00 0x00 0x00 0x00 0x00 0x00 ============..
Background: x86 Assembly Essential Part(2) 스택, 프로시저, 시스템 콜 스택🧱(push, pop) - push val : val을 스택 최상단에 쌓음 연산 rsp -= 8 [rsp] = val - pop reg : 스택 최상단의 값을 꺼내서 reg에 대입 연산 rsp += 8 reg = [rsp-8] 주의할 점⚠️ 1) 스택은 확장될 때 주소값이 낮아지고, 축소될 때 주소값이 높아진다는 걸 유념하자(스택은 아래로 자란다) 2) push와 pop 명령어는 현재 rsp가 가리키는 곳을 기준으로 이루어진다는 것을 유념하자 3) pop 명령어는 스택 최상단의 값을 꺼낸 뒤, 대입까지 한다는 걸 잊지 말자 프로시저📜(call, leave, ret) 프로시저를 부르는 행위를 호출(Call)이라고 부르며, 프로시저에서 돌아오는 것을 반환(Return)이라고 부른다. x64어셈블리언어에는..
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): "프로그램 실행과..