IT’s Portfolio

리버싱을 공부하기 전, 기초 개념 및 기초 명령어 정리 본문

Security Study/Reversing

리버싱을 공부하기 전, 기초 개념 및 기초 명령어 정리

f1r3_r41n 2019. 10. 20. 09:39
728x90
반응형

CPU Register

- 메모리부터 명령어를 가져와 어떤 명령어인지 해석 후 실행

- General Register, Segment Register, Flag Register, Instruction Register 등

 

General Register

Extended : 확장된

 

EAX : Extended Accumulator Register

- 곱셈과 나눗셈 명령에서 자동 사용. 함수의 리턴값이 저장됨.

 

EBX(Extended Base Register)

- ESI나 EDI와 결합하여 인덱스에 사용.

 

ECX : Extended Counter Register

- 반복 명령어 사용 시 반복 카운터로 사용. ECX에 반복할 횟수를 지정해두고 반복작업을 수행.

 

EDX : Extended Data Register

- EAX와 같이 쓰이며 부호 확장 명령 등에 쓰임.

 

ESI : Extended Source Index

- 데이터 복사나 조작 시 Source Data의 주소가 저장. ESI Register가 가리키는 주소의 데이터를 EDI Register가 가리키는 주소로 복사하는 용도로 많이 사용.

 

EDI : Extended Destination Index

- 복사작업 시 Destination의 주소가 저장됨. 주로 ESI Register가 가리키는 주소의 데이터가 복사됨.

 

ESP : Extended Stack Pointer

- 하나의 스택 프레임의 끝 지점 주소가 저장됨. push, pop명령어에 따라서 ESP의 값이 4byte씩 변함.

 

EBP : Extended Base Pointer

- 하나의 스택 프레임의 시작 지점 주소가 저장됨.

 

Instruction Pointer

EIP : Extended Instruction Pointer

- 다음에 실행될 명령어가 존재하는 메모리 주소가 저장됨.

 

Segment Register

CS : Code Segment

- 실행 가능한 명령어가 존재하는 세그먼트의 오프셋이 저장됨.

 

DS : Data Segment

- 프로그램 사용 데이터가 존재하는 세그먼트의 오프셋이 저장됨.

 

SS : Stack Segment

- 스택이 존재하는 세그먼트의 오프셋이 저장됨.

 

Flag Register

세트 = 1, 해제 = 0

 

CF : Carry Flag

- 부호 없는 연산 결과가 용량보다 클 때 세트

 

ZF : Zero Flag

- 연산 결과가 0일 때 세트, 연산 결과가 0이 아닐 때는 해제

 

OF : Overflow Flag

- 부호 있는 연산 결과가 용량보다 클 때 세트

 

SF : Sign Flag

- 연산 결과가 음수가 되었을 때 세트, 연산 결과가 양수가 되었을 때 해제

 

DF : Direction Flag

- 문자열 처리에서 연속되는 문자열의 처리 방향에 따라 세트

 

32bit 16bit up 8bit down 8bit
EAX AX AH AL
EBX BX BH BL
ECX CX CH CL
EDX DX DH DL

 

32bit 16bit
ESI SI
EDI DI
EBP BP
ESP SP

 

Assembly Command

inc : increase

- 피연산자에 1을 더함. 연산결과에 따라 ZF나 OF가 세트될 수 있음.

ex) inc eax

 

dec : decrease

- 피연산자에서 1을 뺌. 연산결과에 따라 ZF나 OF가 세트될 수 있음.

ex) dec eax

 

add : add

- Destination에 Source의 값을 더해서 Destination에 저장. 연산결과에 따라 ZF나 OF, CF가 세트될 수 있음.

ex) add eax, 1 => eax 레지스터에 1을 더해서 eax 레지스터에 저장.

 

sub : subtract

- Destination에 Source의 값을 빼서 Destination에 저장. 연산결과에 따라 ZF나 OF, CF가 세트될 수 있음.

ex) sub eax, 1 => eax 레지스터에 1을 빼서 eax 레지스터에 저장.

 

mul : multiply unsigned integer

- 부호없는 al, ax, eax의 값을 피연산자와 곱함. 피연산자가 8bit이면 al과 곱해서 ax에 저장되고, 16bit면 ax와 곱하고 dx:ax에 저장됨. 연산결과에 따라 OF, ZF가 세트될 수 있음.

 

imul : integer multiplication

- 부호있는 al, ax, eax의 값을 피연산자와 곱함. 연산결과에 따라 CF, OF가 세트될 수 있음.

 

div : divide unsigned integer

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

 

mov : move

- Source에서 Destination으로 데이터 복사.

 

movs : move string

- Source에서 Destination으로 데이터 복사.

 

movsb, movsw, movsd : move string

- SI 또는 ESI 레지스터에 의해 지정된 메모리 주소의 내용을 DI 또는 EDI 레지스터에 의해 지정되는 메모리 주소로 복사.

movsb는 byte 단위로 복사, movsw는 word 단위로 복사, movsd는 dword 단위로 복사.

 

movsx : move with sign-extended

- byte나 word 크기의 피연산자를 word나 dword 크기로 확장하고 부호는 그대로 유지.

 

movzx : move with zero-extended

- byte나 word 크기의 피연산자를 word나 dword 크기로 확장하고 남은 비트는 0으로 채움.

 

int : interrupt

- 소프트웨어 인터럽트를 발생시켜 운영체제의 서브루틴을 호출.

 

and, or, xor : 논리연산자

- Destination과 Source 피연산자의 각 비트가 논리 연산.

* 레지스터를 0으로 초기화시킬 때 mov 명령어보다 xor 명령어를 많이 사용.

 

push : push on stack

- 스택에 값을 넣음. ESP의 값이 4만큼 줄어들고 이 위치에 새로운 값이 채워짐.

 

pushad : push all

- EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP Register의 값을 스택에 push.

 

pushfd : push flags

- 플래그 레지스터를 스택에 push.

 

pop : pop from stack

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

 

popad : pop all from stack

- 스택에 존재하는 값을 EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP Register로 pop.

 

popfd : pop flags from stack

- 스택에 존재하는 값을 플래그 레지스터로 pop.

 

lea : load effective address

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

 

rep : repeat string

- ECX 레지스터를 카운터로 사용해서 문자열 관련 명령을 ECX > 0 동안 반복.

 

jmp : jump unconditionally to label

- 피연산자가 가리키는 코드로 점프해서 실행.

 

call : call a procedure

- 함수를 호출할 때 사용. jmp 명령어와 다른 점은 되돌아올 리턴 어드레스(call 다음 명령)를 스택에 저장함. 함수 호출 후 원래 위치로 실행 흐름을 되돌릴 수 있음.

 

cmp : compare

- 두 피연산자를 비교. 두 피연산자의 값이 같다면 결과는 0이 되고 ZF가 1로 세트. 다르면 ZF는 0으로 세트.

 

nop : no operation

 

jmp 명령어의 조건 명령

ja : jump if above                        / CF=0 and ZF=0

jae : jump if above or equal           / CF=0

jb : jump if below                        / CF=1

jbe : jump if below or equal           / CF=1 or ZF=1

jc : jump if carry flag set                / CF=1

jcxz : jump if CX is 0                     / CX=0

je : jump if equal                          / ZF=1

jecxz : jump if ECX is 0                   / ECX=0

jg : jump if greater                        / ZF=0 and SF=0 

jge : jump if greater or equal           / SF=OF

jl : jump if less                              / SF!=OF

jle : jump if less or equal                 / ZF=1 and SF!=OF

jna : jump if not above                   / CF=1 or ZF=1

jnae : jump if not above or equal      / CF=1

jnb : jump if not below                   / CF=0

jnbe : jump if not below or equal      / CF=0 and ZF=0

jnc : jump if carry flag not set           / CF=0

jne : jump if not equal                     / ZF=0

jng : jump if not greater                   / ZF=1 or SF!=OF

jnge : jump if not greater or equal      / SF!=OF

jnl : jump if not less                         / SF=OF

jnle : jump if not less or equal            / ZF=0 and SF=OF

jno : jump if overflow flag not set       / OF=0

jnp : jump if parity flag not set           / PF=0

jns : jump if sign flag not set             / SF=0

jnz : jump if not zero                       / ZF=0

jo : jump if overflow flag is set           / OF=1

jp : jump if parity flag set                  / PF=1

jpe : jump if parity is equal                / PF=1

jpo : jump if parity is odd                  / PF=0

js : jump if sign flag is set                  / SF=1

jz : jump if zero flag is set                  / ZF=1

728x90
반응형
Comments