tmxklab
[리버싱] 어셈블리어 설명 및 종류 본문
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 |