데이터 형식
메모리에 접근했을 때 얼만큼 읽어들일지 결정
- BYTE : 부호없는 1 byte
- SBYTE : 부호있는 1 byte
- WORD : 부호없는 2 byte
- SWORD : 부호있는 2 byte
- DWORD : 부호없는 4 byte
- SDWORD : 부호있는 4 byte
operand (피연산자) 형식
- mem : 메모리
- label : 지정된 레이블
- imm : 즉시 값, 상수
- reg : 범용 레지스터
어셈블리어 명령어
INC (Increase)
operand 의 값을 1 증가시키는 명령어 (operand 1개)
"++" 연산자와 동일
ex ) INC reg (INC EAX), INC mem (INC [EBP-0x04])
DEC (Decrease)
operand 의 값을 1 감소시키는 명령어 (operand 1개)
"--" 연산자와 동일
ex ) DEC reg (DEC EAX), DEC mem (DEC [EBP-0x04])
ADD (Add)
첫 번째 operand 의 값과 두 번째 operand 의 값을 더해서 첫 번째 operand 에 저장 (operand 2개)
"+=" 와 동일
ex ) ADD reg, reg (ADD EAX, EBX), ADD mem, reg (ADD [EBP-0x04], EAX), ADD reg, imm (ADD EAX, 0x04)
SUB (Subtract)
첫 번째 operand 값에서 두 번째 operand 의 값을 빼서 첫 번째 operand 에 저장 (operand 2개)
"-=" 와 동일
ex ) SUB reg, reg (SUB EAX, EBX), SUB mem reg (SUB [EBP-0x04], EAX), SUB reg, imm (SUB EAX, 0x04)
MOV (Move) / MOVS (Move String)
첫 번째 operand 에 두 번째 operand 의 값을 복사 (operand 2개)
변수 초기화와 동일
ex ) MOV reg, reg (MOV EAX, EBX), MOV mem, reg (MOV [EBP-0x04], EAX), MOV reg, imm (MOV EAX, 0x04)
LEA (Load Effective Address)
Source 피연산자의 주소를 Destination 피연산자에 복사 (operand 2개)
ex ) LEA reg(Destination), mem(Source)
CALL (Call a Procedure)
함수 호출 시 사용된다. JMP 명령어와 같이 프로그램의 실행 흐름이 변경되지만 JMP 명령어와 다른 점은 되돌아올 리턴 어드레스 (CALL 다음 명령) 를 스택에 저장한다는 것이다. 되돌아올 주소를 저장하기 때문에 함수 호출 후 원래 위치로 실행 흐름을 되돌릴 수 있다.
ex ) CALL nearlabel, CALL mem (함수 주소), CALL DWORD PTR DS:[EAX+0x08]
RET (Return Address)
CALL 함수를 통해 호출된 함수에서 다시 복귀하기 위해 사용하는 명령어이다. ESP 레지스터가 가리키는 값을 EIP 레지스터에 저장한다. 복귀주소를 기억하고 그 주소로 점프하는 것이다. 문법적으로는 올바른 표현이 아니지만 의미상으로 POP EIP라고 보면 된다.
ex ) RET
AND (Logical AND)
Destination 과 Source 피연산자의 각 비트가 AND 연산되어 Destination 피연산자에 대입 (operand 2개)
AND 연산은 각 비트가 모두 1일 때만 결과 값이 1이 된다
AND 연산을 통해 OF, CF 가 0으로 세트되고 결과에 따라서 ZF가 1로 세트될 수도 있다
ex ) AND reg(Destination), mem(Source)
TEST (Test)
두 피연산자 사이에 논리적인 AND 연산을 수행하여 플래그 레지스터에 영향을 주지만 결과값은 저장하지 않는다 (operand 2개)
OF, CF는 항상 0으로 세트되고 TEST 연산 결과값이 0이면 ZF가 1로 세트, 0이 아니면 ZF 가 0으로 세트된다
ex ) TEST reg, reg
CMP (Compare)
두 피연산자를 비교한 후 값이 일치하면 뒤에 나오는 조건 실행 (operand 2개)
CMP a,b
a > b ZF = 0, CF = 1
a < b ZF = 0, CF = 0
a == b ZF = 1, CF = 0
ex ) CMP reg, mem ( CMP EAX, 200)
JMP (Jump Unconditionally to Label)
특정 위치로 이동시키는 명령 (operand 1개)
operand 에는 label, 레지스터, 메모리 값이 올 수 있다
ex ) JMP shortlabel, JMP nearlabel, JMP farlabel
CMP EAX, EDX -> 연산 결과가 0이면(두 값이 일치하면) ZF = 1
JE L1
JMP 구문 종류
unsigned jump
명령어 |
의미 |
부등호 |
플래그 조건 |
JE | jump if equal | == | ZF = 1 |
JNE | jump if not equal | != | ZF = 0 |
JZ | jump if zero | == | ZF = 1 |
JNZ | jump if not zero | != | ZF = 0 |
JA |
jump if above |
> |
CF = 0 and ZF = 0 |
JAE | jump if above or equal | >= | CF = 0 |
JNA | jump if not above | < | CF = 1 or ZF = 1 |
JNAE | jump if not above or equal | <= | CF = 1 |
JB |
jump if below |
< |
CF = 1 |
JBE |
jump if below or equal |
<= |
CF = 1 or ZF = 1 |
JNB | jump if not below | > | CF = 0 |
JNBE | jump if not below or equal | >= | CF = 0 and ZF = 0 |
JC |
jump if carry flag set |
|
CF = 1 |
JNC | jump if carry flag not set |
| CF = 0 |
JCXZ |
jump if CX is 0 |
|
CX = 0 |
JECXZ |
jump if ECX is 0 |
|
ECX = 0 |
signed jump
명령어 |
의미 |
부등호 |
플래그 조건 |
JG |
jump if greater |
> |
ZF = 0 and SF = OF |
JGE |
jump if greater or equal |
>= |
SF = OF |
JNG |
jump if not greater |
< |
ZF = 1 or SF != OF |
JNGE |
jump if not greater or equal |
<= |
SF != OF |
JL |
jump if less |
< |
SF != OF |
JLE |
jump if less or equal |
<= |
ZF = 1 or SF != OF |
JNL |
jump if not less |
> |
SF = OF |
JNLE |
jump if not less or equal |
>= |
ZF = 0 and SF = OF |
PUSH (Push on Stack)
스택에 데이터를 저장하는 명령어 (operand 1개)
ESP의 값이 4만큼 줄어들고 그 위치에 새로운 값이 채워진다
ex ) PUSH reg (PUSH EAX)
POP (Pop from Stack)
ESP 레지스터가 가리키고 있는 위치의 스택 공간에서 4 byte 만큼을 Destination 피연산자에 복사하고 ESP 레지스터의 값에 4를 더한다
ex ) POP reg (Destination)
NOP (No Operation)
아무 일도 하지 않는 명령어로 1byte를 차지해서 빈공간을 채울 때 쓰인다.
ex ) NOP
# operand 가 mem, mem은 실행되지 않기 때문에 mem의 값을 reg에 저장 후 사용해야 한다
'리버싱' 카테고리의 다른 글
과제 (0) | 2017.08.23 |
---|---|
[리버싱] 리틀엔디안 빅엔디안 (0) | 2017.08.22 |
[리버싱] 어셈블리어란 (0) | 2017.08.21 |
[리버싱] 디버거(OllyDbg) (0) | 2017.08.21 |
[리버싱] 리버싱에 대해 알아보자 (0) | 2017.08.21 |