반응형
SMALL

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 함수 호출 시 뒤에서부터 값들을 스택에서 하나씩 불러온다. 그렇게 스택에서 불러온 값들을 아래에 있는 로직으로 전달해서 최종 값을 산출하게 되는 것이다. 여기서 중요한 것은 스택에 대한 이해다.

 

 

 

 

반응형
LIST

'악성코드분석' 카테고리의 다른 글

레나튜토리얼 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
블로그 이미지

만년필석사

,