일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
- 파이썬
- Rust
- Database
- 오라클DB
- 데이터베이스
- 파이썬 챌린지
- 데이터 통신
- 자바 개념
- Python challenge
- 러스트 예제
- 알고리즘
- Reversing
- 러스트 프로그래밍 공식 가이드
- rust example
- Operating System
- 백준
- 러스트
- ubuntu
- Python
- 자바 기초
- java
- data communication
- 우분투
- 자바
- 오라클
- 파이썬 알고리즘
- 백준 러스트
- OS
- 운영체제
- 파이썬 첼린지
- Today
- Total
IT’s Portfolio
리버싱을 공부하기 전, 기초 개념 및 기초 명령어 정리 본문
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