1. 어셈블리어란?
CPU의 기계 언어와 1:1 매칭이 되는 저급 언어의 일종이다. 어셈블리어 명령 하나가 기계어와 매칭이 된다고 해서 1:1 구조라고 일컫는다. 어셈블리어는 사람이 읽기 쉽게 기계어에서 변환이 된 언어라고 볼 수 있으며 CPU에 접근할 수 있고 주로 하드웨어쪽과 소통하기 위해 쓰이는 경우가 많다.
2. 어셈블리어 명령어 기초
명령어 | 타입 | 설명 |
CALL | 호출 | 함수 호출에 사용한다. |
PUSH | PUSH | 스택에 값을 삽입, 레지스터에 값을 보관함 |
POP | POP | 스택에 TOP에서 하나의 값을 목적지 주소에 저장한 후 스택의 위치를 바로 전 데이터를 가리키게 한다. |
MOV | 값 복사 | 데이터 값을 복사한다. |
LEA | 주소 복사 | 주소를 복사하는 명령어로 Source 피연산자 유효 주소를 계산해서 Destination 피연산자에 복사한다. |
CMP | 값 비교 | 값을 비교하는 함수다. 두 값이 같으면 결과는 0이 되고 제로플래그는 1이 된다. 반대로 두 값이 다르다면 제로플래그는 0이 된다. |
JMP | 코드 점프 | 피연산자의 위치로 실행 흐름이 변경된다. 즉, 피연산자가 가리키는 위치로 이동된다. |
NOP | NOP | 아무 것도 안함(의미 없음) |
RETN | 리턴 | 리턴 값 |
INT | 인터럽트 | x86 중앙 처리 장치를 위한 어셈블리어, 인터럽트를 발생시키는 역할을 함 |
INC | +1 | 피연산자에 1을 더한다. |
DEC | -1 | 피연산자에 1을 뺀다. |
ADD | + | Destination 값에 source 값을 더해 Destination 값에 저장한다. ex) des = des+sou |
SUB | - | Destination 값에 source 값을 빼서 Destination 값에 저장한다. ex) des = des-sou |
MUL/IMUL | * | Destination 값에 source 값을 곱해서 Destination 값에 저장한다. ex) des = des*sou |
DIV/SDIV | / | Destination 값에 source 값을 나눠서 Destination 값에 저장한다. ex) des = des/sou |
AND | 1,1 -> 1 | AND 연산 |
OR | 0,0 -> 0 | OR 연산 |
XOR | 같으면 0, 다르면 1 | XOR 연산 |
XCHG | 값 교환 | 값 교환 |
[표 1-2] 어셈블리어 기초
※ 참고: 2020년 국가인적자원개발컨소시엄 침해대응 과정 교재
https://wooeong.tistory.com/entry/리버싱-기초-지식-어셈블리어Assembly
가장 많이 사용되고 기초적인 어셈블리어다. 리버싱을 할 때도 기초적인 어셈블리어를 숙지하고 있어야 분석이 되는 경우가 많다.
3. 조건 분기 종류 및 특징
명령어 | 의미 | 부등호 | 플래그 조건 |
JA | Jump if above | > | CF=0 and ZF=0 |
JAE | Jump if above or equal | >= | CF=0 and ZF=1 |
JB | Jump if below | < | CF=1 |
JBE | Jump if below or equal | <= | CF=1 or ZF=1 |
JE | Jump if equal | == | ZF=1 |
JECXZ | Jump if ECX is 0 | ECX=0 | |
JZ | Jump if Zero | == | ZF=1 |
[표 1-3] 자주 쓰이는 조건 분기문
※ 출저: https://wooeong.tistory.com/entry/리버싱-기초-지식-어셈블리어Assembly
리버싱을 할 때 가장 많이 쓰이는 조건 분기문을 추려 정리한 것이다. JZ, JE는 자주 등장하는 명령어기 때문에 잘 숙지해놓는 것이 좋다.
4. 어셈블리어의 자료형
종류 | 특징 |
Byte | 8bit 정수 |
Word | 16bit 정수 |
Dword | 32bit 정수 |
Qword | 64bit 정수 |
[표 1-4] 어셈블리어의 자료형 참고
※ 출저: https://wooeong.tistory.com/entry/리버싱-기초-지식-어셈블리어Assembly
리버싱을 하거나 악성코드 분석을 할 때 자주 보이는 것들 중 하나가 자료형들이다. 부호가 없는 표현이며 모두 기초적인 부분이니 잘 참조하면 좋다.
5. 함수 호출 및 리턴 주소 구조
[그림 1-2] 함수 호출 구조
※ 사진 출저: 보안프로젝트
먼저 push 함수를 통해 값들이 스택에 계속 쌓인다. HelloFunction 함수 호출 시 뒤에서부터 값들을 스택에서 하나씩 불러온다. 그렇게 스택에서 불러온 값들을 아래에 있는 로직으로 전달해서 최종 값을 산출하게 되는 것이다. 여기서 중요한 것은 스택에 대한 이해다.
'악성코드분석' 카테고리의 다른 글
레나튜토리얼 1번 (0) | 2021.01.12 |
---|---|
리버싱 기초 (2) (0) | 2021.01.11 |
리버싱 기초 (1) (0) | 2021.01.10 |
UPX 자동 언패킹 (0) | 2021.01.05 |
MP3 컨버터를 이용한 Exploit (0) | 2018.01.21 |