HOME
home
CV News
home

Assembly

속성
REVERSE ENGINEERING
날짜
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