SSDD
[Reversing] - 어셈블리어 본문
어셈블리어 (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 |