본문 바로가기
Pwnable

리눅스 & 어셈블리어

by ms-eo 2025. 11. 19.

어셈블리어 이해

어셈블리어란? (Assembly language)

  • 기계어와 1:1로 대응되는 저급 언어
  • CPU마다 지원하는 Operation & Register가 상이

레지스터

  • CPU에서 연산을 처리할 때 사용되는 고속의 기억장치
  • 범용 레지스터, 세그먼트 레지스터, FLAG 레지스터, RIP 레지스터

어셈블리어 명령어 구성

  • 명령은 Opcode와 Operand로 구성
  • Opcode : 명령에서 실행할 동작을 나타내는 코드 (call, jump, push, mov, lea 등)
  • Operand : 피연산자로, 연산 대상을 의미함 (rbp, rsp, rax, eax 등)

어셈블리어 명령어

  • Opcode
    • mov : mov operand1, operand2
      • Operand2의 을 Operand1에 복사
    • lea : lea operand1, operand2
      • Operand2의 주소를 Operand1에 복사
    • push : 스택에 값을 저장
    • pop : 스택에서 값을 가져옴
    • leave : mov rsp, rbp
    • pop rbp
    • ret : pop rip
    • jmp rip
    • add : add operand1, operand2
      • 첫 번째 operand와 두 번째 operand 덧셈 연산
    • sub : sub operand1, operand2
      • 첫 번째 operand와 두 번째 operand 뺄셈 연산
    • inc : inc operand
      • operand의 값을 1 증가
    • dec : dec operand
    • operand의 값을 1 감소
    • cmp : cmp operand1, operand2
      • 첫 번째 opernad에서 두 번째 operand를 뺄셈하여 비교
      • 뺄셈하여 0이 나오면 1과 2는 같은 값으로 보며, 이 때 Zero Flag는 1이 된다.
    • test : test operand1, operand2
      • 첫 번째 Opernad와 두 번째 Operand를 AND 연산 수행
    • call : 함수 호출
    • jmp : 특정 주소로 실행 흐름 변경
    • rep : rcx가 0이 될 때까지 반복

범용 레지스터

  • 논리, 산술 연산에 사용되는 operand나 주소 계산을 하기 위해 사용되는 레지스터
  • 64bit(8byte) → r로 시작함, 32bit(4byte) → e로 시작함
    • rsp : 사용중인 스택의 위치를 가리키는 레지스터
    • rbp : 스택의 Base point를 가리키는 레지스터
    • rsi : 출발지 주소를 저장하는 레지스터 (복사한 데이터 저장)
    • rdi : 목적지 주소를 저장하는 레지스터 (복사된 데이터 저장)
    • rdx : 다른 레지스터를 서포트
    • rax : 산술, 논리 연산을 수행하거나 함수의 반환값을 저장
    • rbx : 메모리 주소를 저장하기 위한 레지스터
    • rcx : 반복문에서 카운터로 사용되는 레지스터

세그먼트 레지스터

  • 16bit 크기
  • 각 세그먼트의 위치를 나타내는 레지스터
  • CS, DS, SS, ES, FS, GS 총 6개로 구성
    • CS : 코드 세그먼트의 시작 주소
    • DS : 데이터 세그먼트의 시작 주소
    • SS : 스택 세그먼트의 시작 주소
    • ES, FS, GS : 추가 세그먼트를 가리키는 시작 주소

FLAG 레지스터, RIP 레지스터

  • FLAG 레지스터는 EFLAGS로, 프로그램의 수행 상태를 비트 단위로 나타내는 레지스터
  • RIP 레지스터는 다음에 수행해야 할 명령어의 위치를 저장하고 있는 레지스터
    • CF : 마지막 산술 연산이 레지스터 크기를 초과하여 비트를 빌리거나 올림이 발생한 경우
    • PF : 최하위 비트가 0인 경우
    • AF : 산술연산에서 BCD 숫자의 캐리가 발생한 경우
    • ZF : 연산 결과가 0인 경우
    • SF : 연산 결과가 음수인 경우
    • TF : 한 번에 하나의 연산만 수행하고, 디버거에서 중단점을 설정한 곳에 TF 설정
    • IF : 인터럽트가 사용가능한 경우
    • DF : 스트림 데이터를 이동시키거나 비교할 때 왼쪽이나 오른쪽의 방향을 결정
    • OF : 산술 연산 후 상위 비트의 오버플로우를 표현

Big Endian, Little Endian

  • Big Endian : 큰 데이터가 먼저 저장되는 방식
  • Little Endian : 작은 데이터가 먼저 저장되는 방식

Linux 이해

메모리 영역

  • Code Segment, Data Segment, BSS Segment, Stack, Heap
  • Segmentation, 메모리 관리 및 보호를 위한 기술

Code Segment

  • 실행 가능한 명령어 위치
  • 읽기, 실행이 가능한 영역

Data Segement

  • 초기화 된 데이터 또는 상수 위치
  • 읽기, 쓰기가 가능한 영역

BSS Segment

  • 초기화되지 않은 데이터 위치
  • 읽기, 쓰기가 가능한 영역

Stack

  • 높은 주소부터 차례로 쌓임
  • 함수 호출과 함께 할당되는 공간으로, 지역 변수와 매개변수가 저장되는 영역
  • 읽기, 쓰기가 가능한 영역

Heap

  • 동적으로 할당되는 영역
  • 읽기, 쓰기가 가능한 영역
  • 이 부분을 오버플로우시켜 수행하는 공격을 힙 버퍼 오버플로우라고 함

system & exec 계열 함수

  • 명령어를 수행하는 함수
  • 인자로 “/bin/sh”, “/bin/bash” 등을 전달하여 Shell을 획득할 때 사용
  • exec 계열 함수 : execl, execlp, execle, execv, execvp, execvpe

 

'Pwnable' 카테고리의 다른 글

Integer Overflow  (0) 2025.11.19
Format String Bug  (0) 2025.11.19
Buffer Overflow  (0) 2025.11.19
Pwnable Tools  (0) 2025.11.19
Pwnable 방법론  (0) 2025.11.19