Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

SSDD

[Reversing] - 어셈블리어 본문

Reversing

[Reversing] - 어셈블리어

sadic 2024. 5. 20. 01:25

 

어셈블리어 (Assembly language) 란?

  • 기계어와 1:1 대응이 되는 프로그래밍 저급언어

 

어셈블리어 문법 (Intel 문법과 AT&T 문법)

  • 서로 호환되지 않으며 각 문법의 차이점을 이해해야 합니다.
  • 여기서는 Intel 문법에 대해서만 다뤄보겠습니다.

Intel - 숫자와 레지스터 모두 그대로 표기

ex) 1, 2, 3, 4, 5

ex) EAX, EBX, EBP 


명령어 형식

Opcode (명령어) Operand1 (피 연산자1) Operand2 (피 연산자2 )
ADD EAX EBX

 

EBX의 값을 EAX에 더한다.

 


 

어셈블리 자료형 

BYTE 1byte char
WORD 2byte short
DWORD 4byte int
QWORD 8byte double

 

어셈블리 명령어

주로 사용되는 명령어들만 정리

 

  • 데이터 이동 : mov, lea
  • 산술 논리 연산  : add, sub, inc, dec, and, or, xor, mul, imul, div, idiv
  • 비교 : cmp
  • 분기 : jmp, je, jne
  • 스택 : push, pop
  • 프로시저 : call, ret, leave
  • 스트링 : rep

데이터 이동 

  • mov : 값을 넣는 명령어
  • lea : 주소를 넣는 명령어
명령어 예제  설명
mov mov eax, ebx ebx의 값을 eax에 대입
lea lea eax, ebx ebx를  eax 주소에 대입 


산술 논리 연산

  • add : 덧셈
  • sub : 뺄셈
  • inc : 값 1 증가 (++)
  • dec : 값 1 감소 (--)
  • and : 비트가 모두 1이면 1, 아니면 0
  • or : 비트 중 하나라도 1이면 1, 아니면 0
  • xor : 비트가 서로 다르면 1, 같으면 0
  • mul : 부호가 없는 곱셈 
  • imul : 부호가 있는 곱셈
  • div : 부호가 없는 나눗셈
  • idiv : 부호가 있는 나눗셈
명령어 예제 설명
add add eax, ebx eax = eax + ebx
sub sub eax, ebx eax = eax - ebx
inc inc eax eax의 값을 1 증가 
dec dec eax eax의 값을 1 감소

 

명령어  예제 설명
and and eax, ebx eax와 ebx의 비트가 모두 1이면 1, 아니면 0
or or eax, ebx eax와 ebx의 비트 중 하나라도 1이면 1, 아니면 0
xor xor eax, ebx eax와 ebx의 비트가 서로 다르면 1, 아니면 0

 

명령어 예제 설명
mul mul eax, ebx eax = eax * ebx
imul imul eax, ebx eax = eax * ebx
div div eax, ebx eax = eax / ebx
idiv idiv eax, ebx eax = eax / ebx

 

 


비교

  • cmp : 두 오퍼랜드 값을 비교
  • 연산 결과는 플래그 레지스터에 저장
명령어 예제 설명
cmp cmp eax, ebx eax와 ebx를 비교

분기

  • jmp : 해당 주소로 점프 
  • je : 비교 결과(ZF)가 같으면 점프
  • jne : 비교 결과(ZF) 가 같지 않으면 점프 
  • 보통 cmp 명령 이후 분기할 때 사용
명령어 예제 설명
jmp jmp test1 test1로 점프
je je test1 비교 결과가 같으면 test1로 점프
jne jne test1 비교 결과가 다르면 test1로 점프 

스택

  • push : 스택에 값을 넣는 것
  • pop : 스택에서 값을 빼는 것 
  • push가 될 때마다 스택 포인터가 하나씩 증가 
  • pop이 될 때마다 스택 포인터가 하나씩 감소
명령어 예제 설명
push push eax 스택에 eax 값을 넣는다 
pop pop eax 스택에서 eax 값을 뺀다

프로시저

  • call : 함수 호출
  • ret : 호출되었던 함수 종료 후 호출자의 실행 흐름으로 돌아감 
  • leave : 스택 프레임을 정리
명령어 예제 설명
call call func func 함수 호출
ret ret 함수에서 복귀
leave leave 현재 함수의 스택 프레임 해제

스트링

  • rep : ecx 레지스터에 저장된 값만큼 해당 명령어를 반복 실행 
  • movs, scac, stos 등의 명령어와 함께 사용 
명령어 예제 설명
rep rep 다음 오는 문자열 조작 명령어를 ecx 횟수만큼 반복 실행

 

'Reversing' 카테고리의 다른 글

[Reversing] - 04.exe  (0) 2024.05.28
[Reversing] - 03.exe  (0) 2024.05.26
[Reversing] - 02.exe  (0) 2024.05.24
[Reversing] - 01.exe  (0) 2024.05.21
[Reversing] - X86-64 CPU 레지스터  (0) 2024.05.19