본문 바로가기
about Security/시스템 해킹

[드림핵] x86 Assembly

by saniii 2022. 3. 26.

어셈블러(Assembler) : 0과 1로 이루어진 기계어를 사람이 좀 더 쉽게 이해할 수 있도록 통역해주는, 일종의 번역기

역어셈블러(Disassembler) : 기계어로 구성된 소프트웨어를 넣으면 어셈블리 코드로 변역해준다. 

 

 

#  어셈블리 언어 (Assembly Language)

기계어와 치환되는 언어

- 기계어의 종류에 따라 어셈블리 언어도 다르다. 다양한 ISA가 존재하므로 그만큼의 어셈블리 언어 종류가 있다. 

 

> x64 어셈블리 언어 

- 명령어(Opcode, Operation Code)와 피연산자(Operand)으로 구성된다. 

ex) mov  eax,  3  >> mov:대입 / eax에 3을

 

- 명령어 Opcode

데이터 이동, 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

* 이외에도 더 많은 명령어들이 존재한다. 

그리구 이건 MIPS지만.... 2020.10.09 - [about COMPUTER/컴퓨터 시스템] - # 02. MIPS의 ISA

 

- 피연산자 Operand

  • 상수 (immediate value)
  • 레지스터 (register)
  • 메모리 (memory)

   - 크기 종류 

  • BYTE : 1byte
  • WORD : 2byte    *호환성을 위해 WORD자료형을 2byte로 유지 
  • DWORD : 4byte
  • QWORD : 8byte

        ex) DWORD PTR [0x8048000] : 0x8048000의 데이터를 4바이트만큼 참조

               WORD PTR [rax] : rax가 가르키는 주소에서 데이터를 2바이트만큼 참조 

 

 

> 명령어 

 

+ 데이터 이동 : 어떤 값을 레지스터나 메모리에 옮긴다 

  • mov dst, src : src에 들어있는 을 dst에 대입
  • lea dst, src : src의 유효 주소(Effective Address, EA)를 dst에 저장

+ 산술 연산 

  • add dst, src : dst에 src의 값을 +
  • sub dst, src: dst에서 src의 값을 -
  • inc op: op의 값을 1 증가
  • dec op: op의 값을 1 감소

 

+ 논리 연산 : 비트연산 지시 

  • 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의 비트 전부 반전

 

+ 비교 연산 : 두 피연산자의 값을 비교하고 플래그 설정 

  • cmp op1, op2: op1과 op2를 비교
  • test op1, op2: op1과 op2를 비교

 

+ 분기 연산 : rip을 이동시켜 실행 흐름을 바꾼다.

  • jmp addr: addr로 rip를 이동 
  • je addr: 직전에 비교한 두 피연산자가 같으면 점프 (jump if equal) 
  • jg addr: 직전에 비교한 두 연산자 중 전자가 더 크면 점프 (jump if greater)

 

+ 스택 

  • push val : val을 스택 최상단에 쌓음
  • pop reg : 스택 최상단의 값을 꺼내서 reg에 대입

 

+ 프로시저 : 특정 기능을 수행하는 코드 조각

- 반복되는 연산을 대체하여 코드의 크기를 줄이고 

- 코드 조각에 이름을 붙여 코드의 가독성이 높아진다. 

  • call addr : addr에 위치한 프로시져 호출
  • leave스택프레임 정리
  • ret : return address로 반환

* call을 통해 코드부분을 호출할 때 원하는 코드 부분을 실행하고 난 뒤에는 원래 실행 흐름(순서)로 돌아와야하므로 call명령어 다음 명령어의 주소를 스택에 저장해놓고 rip를 call을 통해 호출할 코드부분으로 옮긴다. 

** 스택 프레임 : 함수별로 사용할 스택의 영역을 명확히 구분해주는 것

- 스택은 함수별로 임시 값들을 저장하는 영역으로 아무런 구분없이 사용하게 되면 서로 다른 두 함수가 같은 메모리 영역을 사용할 수 있어 스택 프레임을 사용하여 영역을 구분해야한다. 

 

 

+ 시스템콜 : 유저 모드에서 커널 모드의 시스템 소프트웨어에게 어떤 동작을 요청하기 위해 사용 

출처 : dreamhack

  • 커널 모드
    • 운영체제가 전체 시스템을 제어하기 위해 시스템 소프트웨어에 부여하는 권한  
  • 유저 모드
  • 시스템 콜

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[ 참조 ]

본 페이지는 드림핵(dreamhack.io)의 시스템 해킹 로드맵, STAGE2를 정리한 글입니다. 

 

'about Security > 시스템 해킹' 카테고리의 다른 글

[드림핵] Linux Memory Layout  (0) 2022.03.26
[드림핵] Computer Architecture  (0) 2022.03.26

댓글