어셈블리 명령어
RAX와 EAX에서 R과 E의 차이
E는 32비트R은 64비트 프로그램
PUSH,POP
- 스택에 값을 넣는 것을 PUSH, 스택에 있는 값을 가져오는 것이 POP이다.
MOV
- MOV는 값을 대입한다.
LEA
- LEA는 주소를 대입한다는 뜻이다.
ADD, SUB
- ADD a,b 는 a에 b만큼 값을 더하는 명령어이다.
- SUB a,b는 a에서 b만큼 값을 빼는 명령어이다.
INC,DEC
- INC는 c언어의 i++;
- DEC은 i--;
라고 생각하면 된다.
AND, OR, XOR
- 명령어 a,b 에서 and,or,xor연산을 한다.
- XOR은 같은 값으로 XOR을 하면 0이 되기 떄문에 XOR로 같은 오퍼랜드를 전달했을떄,
이것은 변수를 0으로 초기화 하는 효과를 줄 수 있다.
NOP
- 아무것도 하지 말라는 명령어이다
CMP
- 비교하는 명령어이다.
- cmp a,b a와b를 비교하는 명령어, 점프 명령어 앞에 쓰인다.
점프 명령어
JMP
- 점프하는 명령어
JE
- 조건문이 참일때 점프
JZ
- ZERO FLAG가 1일때 점프
JNE
- 비교한 두 대상이 같지 않을 경우 점프
JLE
- 비교 결과가 작거나 0일경우 점프
레지스터
산술 연산 레지스터
EAX(Accumulation)
- 산술연산에 사용되는 레지스터이다.(상수/변수 값의 저장 용도)
- 함수의 return 값 지정한다.
EBX(Base Register)
- 간접 번지지정에 사용된다.
- 산수 / 변수를 저장한다.
ECX(Counter Register)
- 반복(Loop)에서 반복 Count 역할을 수행
REP(반복 레지스터)에 얼마나 반복할 것인지를 ECX 레지스터에 저장한다.
EDX(Data Register)
- EAX를 보조하는 역할을 수행한다.
- 4byte * 4byte를 연산하면 EAX에 담기지 않을 수 있다 → EDX(상위 bit), EAX(하위 bit)를 이용하여 8byte에 저장한다.
- 나누기를 진행할 경우 몫은 EAX 나머지는 EDX에 저장이 된다.
인덱스 레지스터
ESI(Source Index)
- 복사나 비교를 할 경우 출발지 주소를 저장하는 레지스터이다.
EDI(Destination Index)
- 복사나 비교를 할 경우 목적지 주소를 저장하는 레지스터이다.
- stos, movs를 사용할때 마다 1씩 증가한다.
포인터 레지스터
ESP(Stack Pointer)
- Stack Pointer의 가장 최근에 저장된 공간의 주소를 저장하는 레지스터이다.
- 스택이 쌓일때 마다 ESP 값이 1씩 증가한다.
EBP(Base Pointer)
- Stack Pointer의 기준점(바닥 부분)을 저장하는 레지스터이다.
- EBP 밑에는 Return값이 존재한다.
EIP(Instruction Pointer)
- 다음 명령어의 위치를 저장하는 레지스터이다.
SF (Sign Flag)
- 부호가 있는 연산에서 수행한 결과가 양수이면, 최상위 비트가 0이면 SF=0, 반대는 1
OF (Overflow Flag)
- 부호가 있는 연산에서 CF의 역할
ZF (Zero Flag)
연산의 값이 0일 경우 1로 설정된다.
CF (Carry Flag)
- 부호가 없는 연산에서 비트올림이나 비트 내림이 발생하면 CD가 1이 된다.
'리버싱 > 개념' 카테고리의 다른 글
스택프레임 (0) | 2021.11.08 |
---|---|
리버싱에 필요한 것은? (레지스터, 어셈블리어) (0) | 2021.07.13 |
리버싱에 필요한 것은? (linux) (0) | 2021.07.13 |
리버싱이란? (0) | 2021.07.10 |
PE 헤더 (0) | 2021.06.17 |