본문 바로가기

High Level Technique/Reversing

데이터 타입, 피연산자 타입, 어셈블리 언어

어셈블리 언어를 외우려고 하지말자. 계속 분석을 하다보면 대부분 나오는 것만 나오게 된다.

처음 시작한다면, 한두번 읽고 넘어가는 것을 추천합니다. 다 외울 수 있으면 좋겠지만...ㅋㅋㅋㅋ  사람머리인지라..



- 데이터 타입


 타입

설명 

BYTE 

8비트 부호 없는 정수 

SBYTE 

8비트 부호 있는 정수 

WORD 

16비트 부호 없는 정수 

SWORD 

16비트 부호 있는 정수 

DWORD 

32비트 부호 없는 정수 

SDWORD 

32비트 부호 있는 정수 

FWORD 

48비트 정수 

QWORD 

64비트 정수 

TBYTE 

80비트 정수 






- 피연산자 (Operand) 타입


 피연산자

설명 

r8 

8비트 범용 레지스터 

r16 

16비트 범용 레지스터 

r32 

32비트 범용 레지스터 

Reg 

임의의 범용 레지스터 

Sreg 

16비트 세그먼트 레지스터 

imm 

8,16, 32 비트 즉시값 

imm8 

8비트 즉시값 

imm16

16비트 즉시값 

r/m8

8비트 범용 레지스터, 메모리 

r/m16

16비트 범용 레지스터, 메모리 

r/m32 

32비트 범용 레지스터, 메모리 

mem 

8, 16, 32비트 메모리 







- 어셈블리언어


INC (Increase)

피연산자에 1을 더한다. 결과에 따라서 ZF, OF가 세트(1) 될 수 있다.

예를들면 i++;와 같다고 생각하면 된다.



DEC (Decrease)

피연산제 1을 빼는 명령이다. 결과에 따라서 ZF, OF가 세트(1) 될 수 있다.

예를들면 i--;와 같다고 생각하면 된다.



ADD (Add)

Destination(목적지)에 Source(시작지)의 값을 더해서 Destination(목적지)에 저장하는 명령이다. 연산 결과에 따라서 ZF, OF, CF가 세트될 수 있다.

예를들어, ADD eax, 123 은 eax에 123을 더해서 eax에 저장한다는 의미가 된다.



SUB (Subtract)

Destination(목적지)에 Source(시작지)의 값을 빼서 Destination(목적지)에 저장하는 명령이다.

예를들어, SUB eax, 123 은 eax에 123을 빼서 eax에 저장한다는 의미가 된다.



MUL (Unsigned Integer Multiply)

부호 없는 al, ax, eax의 값을 피연산자와 곱한다.

피연산자가 8비트면 al과 곱해서 ax에 저장되고, 16비트이면 ax와 곱하고 dx:ax에 저장된다. 결과에 따라서 ZF, OF 플래그가 세트될 수 있다.



IMUL (Integer Multiplication)

부호 있는 al, ax, eax의 값을 피연산자와 곱한다. 결과에 따라 CF, OF가 세트될 수 있다. 단일 피연산자이고 피연산자를  al, ax, eax에 곱한다.



DIV (Unsigned Integer Divide)

8, 16, 32비트 부호 없는 정수의 나눗셈을 수행한다. 결과에 따라서 CF, OF, ZF가 세트될 수 있다.



MOV (Move)

Source에서 Destination으로 데이터를 복사한다.

예를들어, MOV A, B 라 한다면 B에서 A로 데이터를 복사한다.



MOVS (Move String)

Source에서 Destination으로 데이터를 복사한다.



AND (Logical AND)

Destination과 Source 피연산자의 각 비트가 AND 연산된다. AND 연산은 각 비트가 모두 1일때만 결과 값이 1이 된다.

연산을 통해서 OF, CF가 0으로 세트되고 결과에 따라서 ZF가 1로 세트될 수 있다.



OR (Inclusive OR)

Destination과 Source 피연산자의 각 비트가 OR 연산된다. OR 연산은 각 비트가 모두 0이면 결과가 0이고, 모두 0이 아니면 결과는 1이다.

연산을 통해서 OF, CF가 0으로 세트되고 결과에 따라서 ZF가 1로 세트될 수 있다.



XOR (Exclusive OR)

Destination과 Source 피연산자의 각 비트가 XOR 연산된다. XOR 연산은 각 비트가 서로 다른 값일 때만 결과가 1이다. 같은 값이라면 결과는 0이된다.

연산을 통해서 OF, CF가 0으로 세트되고 결과에 따라서 ZF가 1로 세트 될 수 있다.

보통 레지스터 값을 0으로 만들기위해 사용된다. XOR EAX, EAX를 한다면 EAX는 0이 된다.



TEST (Test)

두 피연산자 사이에 논리적인 AND 연산을 수행하여 플래그 레지스터에 영향을 주지만 결과값은 저장하지 않는다.

OF, CF는 항상 0으로 세트되고 TEST 연산 결과값이 0이면 ZF가 1로세트, 0이 아니면 ZF가 0으로 세트된다.



PUSH (Push on Stack)

스택에 값을 넣는다. ESP이 값이 4만큼 줄어들고 이 위치에 새로운 값이 채워진다.



POP (Pop from Stack)

ESP 레지스터가 가리키고 있는 위치의 스택 공간에서 4byte만큼을 Destination 피연산자에 복사하고 ESP 레지스터의 값에 4를 더한다.



LEA (Load Effective Address)

Source 피연산자의 유효 주소를 계산하여 Destination 피연산자에 복사한다.

예를들어, mov eax, dword ptr ds:[esi]라고 하자. esi의 값이 0x401100이라면 eax에 0x401100 번지가 기리키는 값 AAAAA라는 값을 넣는다.



JMP (Jump Unconditionally to Lable)

피연산자의 위치로 실행 흐름이 변경된다. 피연산자가 가리키는 코드로 점프 뛰어서 실행한다.

short 점프는 -127 ~ 127 바이트 범위 안에서 사용되고 near 점프는 같은 세그먼트 내부에서 사용된다. far 점프는 현재 세그먼트를 벗어날 때 사용되며 JMP 명령어는 되돌아올 리턴 어드레스 값을 저장하지 않는다.



CALL (Call a Procedure)

함수 호출시 사용된다. JMP와 다르게 되돌아올 리턴 어드레스(CALL 다음 명령)를 스택에 저장한다는 것이다.



CMP (Compare)

두 피연산자를 비교하는 작업을 한다. Destination 피연산자에서 Source 피연산자를 묵시적으로 빼서 값을 비교한다.

두 값이 같다면 결과는 0이 되고 ZF가 1로 세트된다. 다르다면 ZF는 0으로 세트된다.



NOP (No operation)

아무일도 하지 않는 명령어다.










- 조건 점프 명령


 명령어

의미

if 앞 JUMP 생략

명령어가 수행되기 위한

플래그 레지스터와 범용 레지스터의 상태 

JA

if unsigned above (크다)

CF=0 and ZF=0 

JAE

if unsigned above or equal (크거나 같다

CF=0 

JB 

if unsigned below (작다)

CF=1

JBE 

if unsigned below or equal (작거나 같다)

CF=1 or ZF=1 

JC 

if carry flag set 

CF=1

JCXZ  

if CX is 0 

CX=0 

JE

if equal 

ZF=1 

JECXZ 

if ECX is 0 

ECX=0 

JG 

if signed greater 

ZF=0 and SF=0 

JGE 

if singed greater or equal

SF=OF 

JL 

if signed less 

SF!=OF 

JLE 

if signed less or equal 

ZF=1 and OF!=OF

JNA 

if unsigned not above 

CF=1 or ZF=1 

JNAE 

if unsigned not above or equal 

CF=1 

JNB

if unsigned not below 

CF=0 

JNBE 

if unsigned not below or equal 

CF=0 and ZF=0 

JNC 

if carry flag not set 

CF=0 

JNE 

if not equal 

ZF=0 

JNG

if signed not greater 

ZF=1 of SF!=OF 

JNGE 

if signed not greater or equal 

SF!=OF 

JNL 

if signed not less 

SF=OF

JNLE 

if signed not less or equal 

ZF=0 and SF=OF 

JNO 

if overflow flag not set 

OF=0 

JNP 

if parity flag not set 

PF=0 

JNS 

if sign flage not set 

SF=0 

JNZ 

if not zero 

ZF=0 

JO 

if overflow flag is set 

OF=1 

JP

if parity flage set 

PF=1 

JPE 

if parity is equal 

PF=1 

JPO 

if parity is odd 

PF=0 

JS 

if sign flag is set 

SF=1 

JZ  

is zero 

ZF=1 


'High Level Technique > Reversing' 카테고리의 다른 글

Back To User Mode  (0) 2015.05.18
UPX Unpacking  (0) 2015.05.18
CPU 레지스터  (0) 2015.05.15
OllyDBG 다운로드 및 설정방법  (0) 2015.05.13
VMWARE 및 Windows 설치하기  (0) 2015.05.12