tmxklab

[리버싱] 어셈블리어 설명 및 종류 본문

Security/02 Reversing

[리버싱] 어셈블리어 설명 및 종류

tmxk4221 2020. 2. 3. 21:36

1. 어셈블리어란?

기계어와 일대일 대응되는 컴퓨터 프로그래밍 저급언어

기계어는 CPU가 직접 해독하고 실행할 수 있는 비트 단위로 쓰여 사람이 이해하기에는 어렵기에 어셈블리어를 통해 기계어를 사람이 쉽게 이해할 수 있도록 표현을 바꿔놓은 것 이다.

 

ex) 

기계어 어셈블리어
55 PUSH EBP
8B EC MOV EBP, ESP

 


2. 어셈블리어 문법

1) Windows(Intel 문법)

- 오퍼렌드 위치 : mov dest, src
- 메모리 오퍼랜드 : mov eax, [ebx]

 

2) Linux(AT&T 문법)

- 오퍼랜드 위치 : mov src, dest
- 메모리 오퍼랜드 : mov (%ebx), %eax


3. 어셈블리어 명령어 종류

1) 데이터 타입

* 부호 없는 정수

BYTE 1byte 
WORD 2bytes
DWORD 4bytes
QWORD 8bytes

* 부호 있는 정수

SBYTE 1byte 
SWORD 2bytes
SDWORD 4bytes
SQWORD 8bytes

 

2) 어셈블리 명령어

PUSH

① 형식 : PUSH [OPERAND]
② 의미 : 스택에 값을 저장, PUSH 이후에는 스택이 4bytes커지므로 ESP는 4bytes감소 

ex) PUSH EBP // EBP의 값을 스택에 PUSH

 

POP

① 형식 : POP [OPERAND]
② 의미 : 스택 맨 위에 저장된 값을 가져옴, POP 이후에는 스택이 4bytes줄어드므로 ESP는 4bytes증가

ex) POP EBP // 스택 맨 위의 값 즉, ESP가 가리키는 값을 꺼내어 EBP에 저장

 

MOV(Move)

① 형식 : MOV [dest], [src]
② 의미 : src의 값을 dest에 넣어 주는 역할

ex) MOV EAX, 1 // 1을 EAX에 저장

 

LEA(Load Effective Address to Register)

① 형식 : LEA [dest], [src]
② 의미 : src의 주소를 dest에 넣어 주는 역할

ex) LEA EAX, [EBP+4] // EBP+4의 주소를 EAX에 저장

 

INC(Increment)

① 형식 : INC [OPERAND]
② 의미 : 값을 1씩 증가

ex) INC EAX // EAX 1 증가

 

DEC(Decrement)

① 형식 : DEC [OPERAND]
② 의미 : 값을 1씩 감소

ex) DEC EAX // EAX 1 감소

 

ADD(Add)

① 형식 : ADD [OPERAND]
② 의미 : 두 오퍼랜드의 덧셈 연산 수행 후 dest에 저장

ex) ADD EAX, 12 // EAX = EAX + 12

 

SUB(Subtract)

① 형식 : PUSH [OPERAND]
② 의미 : 두 오퍼랜드의 뺄셈 연산 수행 후 dest에 저장

ex) SUB EAX, 12 // EAX = EAX - 12

 

CMP(Compare)

① 형식 : CMP [dest], [src]
② 의미 : dset값과 src값을 비교하여 실행 결과에 따라 플래그 레지스터의 ZF(Zero Flag)에 값이 세팅됨

ex) CMP EAX, ECX // EAX == ECX인 경우 ZF=1, EAX != ECX인 경우 ZF=0

 

JMP(Unconditional Jump)

① 형식 : JMP [Address]
② 의미 : 보통 CMP명령 수행 후 분기할 때 사용되며 해당 주소로 점프(분기)

JE(Jump Equal)

비교 결과가 같으면 점프(ZF=1)

JNE(Jump Not Equal)

비교 결과가 같지 않으면 점프(ZF=0)

JGE(Jump Greater or Equal)

비교 결과가 크거나 같으면 점프(SF=OF)

JLE(Jump Less or Equal)

비교 결과가 작거나 같으면 점프(ZF=1 or SF!=OF)

JZ(Jump Zero)

0이면 점프(ZF=1)

CALL

① 형식 : CALL [Address]
② 의미 : 함수를 호출하는 역할, 복귀할 주소(즉, Return Address인 EIP)를 PUSH후 주소 값으로 점프(분기)
(CALL은 다음 두 가지 동작으로 처리됨)
- PUSH EIP                   // CALL 다음 명령줄의 주소 값을 Stack에 저장
- JMP [접근할 함수 주소] // 접근할 함수로 점프(분기)

 ex) CALL EAX // EAX에 저장된 주소로 이동

 

RET(Return)

① 형식 : RET
② 의미 : CALL로 호출된 함수 종료 후 CALL 수행 시 스택에 저장했던 복귀 주소로 돌아옴
(RET은 다음 두 가지 동작으로 처리됨)
- POP EIP  // ESP가 가르키는 값을 EIP에 저장 후 ESP가 가르키는 공간을 제거
- JMP EIP  // EIP의 값을 가르키는 주소로 점프(분기) 

 

LEAVE

① 형식 : LEAVE src의 값을 dest에 넣어 주는 역할
② 의미 : 사용했던 스택 프레임을 정리하고 이전에 실행했던 함수의 베이스 주소를 EBP에 다시 채움
(LEAVE은 다음 두 가지 동작으로 처리됨)
- MOV ESP, EBP  // EBP의 주소 값을 ESP로 복사함
- POP EBP  // ESP가 가리키는 값을 꺼내어 EBP에 넣어줌

 

NOP

① 형식 : NOP
② 의미 : 아무런 동작을 하지 않는 코드이며 기계어로 "0X90"이다.

 

XOR

① 형식 : XOR [dest], [src]
② 의미 : dest와 src를 XOR연산 후 결과를 dest에 저장

 

OR

① 형식 : OR [dest], [src]
② 의미 : dest와 src를 OR연산 후 결과를 dest에 저장

 

AND

① 형식 : AND [dest], [src]
② 의미 : dest와 src를 AND연산 후 결과를 dest에 저장

 

SHR(Shift Right)

① 형식 : SHR [dest], [src]
② 의미 : dest를 src의 크기만큼 오른쪽으로 쉬프트 연산, 벗어난 비트는 CF플래그 레지스터에 저장

 

SHL(Shift Left)

① 형식 : SHL [dest], [src]
② 의미 : dest를 src의 크기만큼 왼쪽으로 쉬프트 연산, 벗어난 비트는 CF플래그 레지스터에 저장

 

 

 

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

EAT(Export Address Table)  (0) 2021.08.06
IAT(Import Address Table)  (0) 2021.08.04
RVA to RAW  (0) 2021.08.04
Window API 관련  (0) 2021.04.18
ARM Assembly 정리 (기초)  (0) 2020.12.18
Comments