[시스템 해킹] 02-2. Computer Science-x86 Assembly

2024. 1. 28. 23:20시스템 해킹

x64 어셈블리 언어

 

기본구조

-동사에 해당하는 명령어 Opcode, 목적어에 해당하는 피연산자 Operand

Opcode


[피연산자 Operand]

- 상수, 레지스터, 메모리

 

메모리 피연산자

- [] 으로 둘러싸인 것, 앞에 크기 지정자 TYPE PTR이 추가될 수 있음.

TYPE; BYTE(1byte), WORD(2), DWORD(4), QWORD(8)


[Opcode]

 

Opcode : 데이터 이동

; 어떤 값을 레지스터나 메모리에 옮기도록 지시

 

Opcode : 산술 연산

; 덧셈, 뺄셈, 곱셈, 나눗셈 연산을 지시

 

Opcode : 논리 연산

; and, or, xor, neg 등의 비트 연산. 비트 단위로 연산.

 

Opcode : 비교

; 두 연산자의 값을 비교하고, 플래그 설정

## 연산의 결과를 op1에 대입X##

#cmp; 두 피연산자를 빼서 비교
1: mov rax, 0xA
2: mov rbx, 0xA
3: cmp rax, rbx ; ZF=1

#test; and 비트연산을 취함
# 0이된 rax를 op1과 op2로 삼아 수행하면 결과가 0
1: xor rax, rax
2: test rax, rax ; ZF=1

 

Opcode: 분기

; rip를 이동시켜 실행 흐름을 바꿈.

 

Opcode: 스택

push val: val을 스택 최상단에

pop reg: 스택 최상단의 값을 꺼내서 reg에 대입

 

Opcode: 프로시저

; 특정 기능을 수행하는 코드 조각. 반복되는 연산을 프로시저 호출로 대체. 코드의 가독성 높임.

프로시저를 호출할 때는 프로시저를 실행하고 나서 원래의 실행 흐름으로 돌아와야 하므로, call 다음의 명령어 주소(Return Address, 반환 주소)를 스택에 저장하고 프로시저로 rip를 이동시킵니다.

 

call addr: addr에 위치한 프로시저 호출

 

leave: 스택프레임 정리

함수별로 서로가 사용하는 스택의 영역을 명확히 구분하기 위해 스택프레임이 사용됩니다. 대부분의  Application binary interface (ABI) 에서는 함수는 호출될 때 자신의 스택프레임을 만들고, 반환할 때 이를 정리합니다.

 

ret: return address로 반환

 

Opcode: 시스템 콜

; 해킹으로부터 운영체제의 막강한 권한을 보호하기 위해 커널 모드와 유저 모드로 권한을 나눕니다.

시스템 콜은 유저보드에서 커널 모드의 시스템 소프트웨어에게 어떤 동작을 요청하기 위해 사용됨. SW 대부분은 커널의 도움이 필요. 유저모드에서 파일시스템에 접근 할 수 없어 도움이 필요하다는 요청이 시스템 콜. syscall 명령어.

 

-커널 모드; 운영체제가 전체 시스템을 제어하기 위해 시스템 소프트웨어에 부여하는 권한. 파일시스템, 입/출력, 네트워크 통신, 메모리 관리 등 모든 저수준의 작업. 시스템의 모든 부분 제어가능하기에 해커가 커널모드까지 진입하면 시스템은 거의 무방비 상태.

-유저모드; 운영체제가 사용자에게 부여하는 권한. 브라우저를 이용해 드림핵을 보거나, 유튜브를 시청하는 것 등. 리눅스에서 루트 권한으로 사용자를 추가하고, 패키지를 내려 받는 행위 등도 마찬가지. 해킹이 발생해도, 해커가 유저 모드의 권한까지 밖에 획득하지 못하기에 커널의 막강한 권한을 보호할 수 있음.