본문 바로가기

리버싱

[리버싱] 어셈블리어 명령어





데이터 형식


메모리에 접근했을 때 얼만큼 읽어들일지 결정


- 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