Reverse Engineering 지식을 습득하기 위해서는 어셈블리와 레지스터에 대한 지식이 필요하다.
레지스터
레지스터 | 기능 |
EAX | 누산기, 산술연산 저장공간으로도 사용하며 리턴값을 저장한다. |
EBX | EAX와 마찬가지로 산술연산 저장공간으로 사용되며, 간접적인 주소를 저장한다. |
ECX | 반복 카운트 |
EDX | EAX의 보조적인 역할을 수행한다. |
ESI | 문자열의 시작주소를 저장한다. |
EDI | 문자열의 끝 주소를 저장한다. |
EBP | 스택 영역에서 사용되며 스택프레임의 기준이 되는 주소를 저장한다. |
ESP | 스택 영역에서 스택프레임의 최상단의 주소를 저장한다. |
EIP | 다음 실행할 명령어의 주소를 저장한다. |
64bit 레지스터의 경우엔 E대신 R을 붙여 사용하며(RAX,RBX 등) 레지스터의 크기는 8Byte를 가진다.
레지스터의 종류와 기능은 위 표와 같으며 각각 4Byte의 크기를 가지고 있다.
2Byte가 필요할 경우에 해당 레지스터를 나누어 사용하기도 하며(EAX → AX) 1Byte가 필요할 경우 나누어진 레지스터를 기준으로 (AL, AH)표현한다.
Eflags : AF CF OF PF SF ZF
Eflags는 상태 레지스터이며 0과 1의 값을 가진다. 0값은 clear로 표현하고, 1값은 set로 표현한다. ZF는 zero flags의 약자이며, 산술연산시 결과가 0이면 1로 (set)표현된다.
결과가 0이 아닌 값이라면 0값으로 표현된다.
명령어
[명령어 = OPCODE, 피연산자 = OPERAND (예시 : INC a)]
명령어 | 기능 |
INC | 오퍼랜드의 값을 1 증가시키는 명령어 |
DEC | 오퍼랜드의 값을 1 감소시키는 명령어 |
ADD | 두개의 오퍼랜드 값을 더하는 명령어 |
SUB | 두개의 오퍼랜드 값을 빼는 명령어 |
MOV | 첫번째 오퍼랜드값에 두번째 오퍼랜드값을 복사, 또는 대입하는 명령어 |
AND | AND 연산 명령어 |
OR | OR 연산 명령어 |
XOR | XOR 연산 명령어 |
SHL | 쉬프트 연산 명령어 (left) |
SHR | 쉬프트 연산 명령어 (right) |
PUSH | 스택과 관련 있으며 스택에 새로은 값을 넣는 명령어 |
POP | 스택의 최상단의 값을 꺼내는 명령어 |
PUSHADD | 범용 레지스터 값들을 스택에 순서대로 저장하는 명령어 (순서는 PUSHADD 그림참조) |
PUSHPOP | PUSHADD로 저장된 레지스터를 꺼내는 명령어 |
Offset | 전역변수를 가져오거나 문자열의 주소를 가져오는 명령어 |
LEA | 주소값을 가져올 때 사용하는 명령어 |
STOS | EDI가 가르키는 주소에 EAX의 값을 저장하는 명령어 |
REP | 특정 명령어를 반복시킬 때 사용되는 명령어 |
MOVS | 문자열과 관련이 있으며 ESI가 가리키는 값을 EDI가 가리키는 곳에 저장하는 명령어 |
TEST | EAX의 값의 리턴이 NULL인지 검사하는 명령어 (묵시적으로 AND연산을 수행) |
CMP | 두 값을 비교하는 명령어 ZF와 CF에 영향을 준다. |
JMP | 지정한 위치까지 점프하는 명령어 (조건점프는 JMP 표 참조) |
CALL | 함수를 호출할 때 사용하는 명령어 |
RET | 리턴 명령어이며 ESP가 가리키는 주소를 EIP에 넣는다 |
NOP | 아무런 동작도 수행하지 않으며 1byte를 차지하는 명령어 |
PUSHADD
JMP
명령어 | 명령어 의미 | 부등호 | 플래그 조건 |
JA | Jump if(unsigned) above | > | CF = 0 and ZF = 0 |
JAE | Jump if(unsigned) above or equal | > = | CF = 0 or ZF = 1 |
JB | Jump if(unsigned) below | < | CF = 1 |
JBE | Jump if(unsigned) below or equal | < = | CF = 1 or ZF = 1 |
JC | Jump if carry flag set | CF = 1 | |
JCXZ | Jump if CX is 0 | CX = 1 | |
JE | Jump if equal | = = | ZF = 1 |
JECXZ | Jump if ECX is 0 | ECX = 1 | |
JG | Jump if(unsigned) greater | > | ZF = 0 and SF == OF |
JZ | Jump if zero | = = | ZF = 1 |