어셈블리어

1. 어셈블리어란 무엇인가

  1. 어셈블리어(assembly language)는 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어
  2. 프로그래밍 언어의 하나로 기계어의 한 단계 위의 언어이며, 기계어와 단 둘 뿐인 저급 언어
  3. 기계어는 실제로 컴퓨터의 CPU가 읽어서 실행할 수 있는 0과 1로 이루어진 명령어의 조합 / 이러한 명령어에 대해 사람이 알아보기 쉬운 니모닉 기호를 정해 좀 더 쉽게 컴퓨터의 행동을 제어할 수 있도록 한 것이 어셈블리어 언어
    • 기계어는 컴퓨터의 관점에서만 바로 읽을 수 있으며, 이를 인간이 볼 수 있도록 보완한 언어가 어셈블리어
    • 기계어는 CPU가 채택한 ISA에 따라 다르기 때문에, 어셈블리어의 명령어 역시 통일된 규격이 없음
    • 문법 아키텍처에 따라서도 다르며, 어셈블러 종류에 따라서도 문법과 매크로가 달라짐
      • 이 문서에서는 x86/x64 어셈블리어를 다룰 예정
    2. 어셈블리어 특징
    • 컴퓨터 구조에 따라 사용하는 기계어가 달라, 이에 대응하는 어셈블리어도 각각 다르게 적용
      • 컴퓨터 CPU마다 지원하는 오퍼레이션의 타입과 개수는 제각각
      • 레지스터의 크기와 개수, 저장된 데이터 형의 표현도 전부 다름
    • 어셈블리어 장점
      • 가독성이 좋아짐
      • 프로그래머가 주석을 달 수 있어 프로그래밍이 수월해짐
      • 바이너리 파일 크기가 작고 프로그램 작동 속도가 빠름
      • 컴파일러에 비해 만들기 쉬움
      • 기계어에 대응되는 어셈블리어 명령어 이외에도 메모리 위치나 정렬 등을 할 수 있는 지시어 사용 가능
      • 매크로 기능을 이용하여 매크로 호출 가능
      • 명령어 수가 적음
    • 어셈블리어 단점
      • 고급 언어에 비해 생산성이 떨어짐
      • 언어를 이해하는 시간을 짧지만 완벽하게 익히기에 걸리는 시간이 천차만별

3. 어셈블리어 명령어

1) ADD / SUB

  • ADD ( 더하기 연산 )
ADD eax 100 => eax = eax + 100
  • SUB ( 빼기 연산 )
 SUB eax 100 => eax = eax - 100

2) MOV

  • MOV ( 데이터를 복사하는 명령어 )
    • 같은 사이즈의 데이터끼리만 복사
    • 메모리서 메모리로 복사 불가능
MOV ebp 20 => ebp == 20

3) PUSH

  • 스택에 데이터를 삽입하는 명령어
PUSH 0x10 => 스택에 0x10 저장 후 ESP 4감소

4) POP

  • 스택에 데이터를 꺼내와 지정한 레지스터에 삽입하는 명령어
POP 0x10 => esp 0x10 저장 후 ESP 4증가

5) XOR, AND, OR

  • 비트 논리 연산자
    • AND의 경우 두 비트가 모두 1일 경우
    • OR의 경우 두 비트 중 하나가 1일 경우
    • XOR의 경우 두 비트 모두 0일 경우
    1로 연산

6) CMP

  • 비교 연산 명령어
  • 두 값을 빼서 비교하며 jmp/mov와 같이 사용

7) JMP

  • 다른 주소로 이동하는 명령어
  • JMP는 조건없이 이동하지만
  • 조건을 만족할 때 이동하는 명령어도 존재
    • JE : ZF = 1 (두 값이 같을 경우)
    • JZ : ZF = 1 (0의 값을 가질 경우)
    • 등 여러 조건에 따라 분기하는 명령어 존재

8) CALL, RET

  • CALL : 함수 호출 명령어로 현재 주소를 EIP에 저장 후 함수 호출 주소로 이동
  • RET : 호출한 함수 바로 다음 지점으로 이동 ( POP EIP )

'Security > Reversing' 카테고리의 다른 글

PE File Format Advance  (1) 2023.07.08
Calling Convention (함수 호출 규약)  (0) 2023.07.06
스택프레임  (0) 2023.07.05
PE파일  (1) 2023.07.03
CPU 레지스터  (0) 2023.07.02