어셈블리어란??
기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다.
일대일 대응이란? 어셈블리어 명령어 하나가 기계어 명령어 하나와 대응된다는 의미이다.
기계어를 사람이 편하게 프로그래밍할 수 있도록 문자로 기호화해서 나타낸 언어로 기호 언어라고도 한다.
어셈블리어는 하드웨어에 직접 접근 할 수 있는 언어이므로, 주로 하드웨어소통을 위해 쓰인다. 빠른 처리를 요구할 경우 어셈블리어로 작성을 하기도 한다.
기본적인 어셈블리 변환
[Hello World c소스]
[Hello World 어셈블리어]
대표적인 어셈블리 명령어
• INC(Increase) - 피연산자에 1을 더한다.
• DEC(Decrease) - 피연산자에 1을 뺀다.
• ADD(add) - Destination에 Source의 값을 더해서 Destination에 저장한다.
ex) ADD eax(Destination), 100(Source) : eax레지스터에 100을 더하고 eax레지스터에 저장
• SUB(Subtract) - Destination에 Source의 값을 빼서 Destination에 저장한다.
ex) SUB eax(Destination), 100(Source) : eax레지스터에 100을 빼고 eax레지스터에 저장
• MOV(Move) - Source에서 Destination으로 데이터를 복사한다.
ex) MOV reg(Destination), mem(Source) : mem레지스터를 reg레지스터에 복사한다.
• PUSH(Push on stack) - 스택에 값을 삽입한다
• POP(pop from stack) - 스택의 탑 부분에서 하나의 값을 Destination에 저장하고 스택의
위치를 바로 전의 데이터를 가리키도록 한다.
• LEA(Load Effective Address) - 간단히 주소를 알아내서 복사하는 명령이다.
Source피연산자의 유효 주소를 계산하여 Destination피연산자에 복사한다.
ex) LEA reg(Destination), mem(Source) : mem레지스터의 유효 주소를 reg레지스터에 복사한다.
• MOVS(Move String) - Source에서 Destination으로 데이터를 복사한다.
• CMP(Compare) - 두 피연산자를 비교하는 작업을 한다. 두 값이 같다면 결과는 0이되고
제로 플래그(ZF)가 1로 설정된다. 두 값이 다르다면 플래그(ZF)는 0으로 설정된다.
ex) CMP eax, 50 : eax레지스터와 값 50을 비교한다.
• JMP(Jump) - 피연산자의 위치로 실행 흐름이 변경된다. 피연산자가 가리키는 코드로 뛰어
넘어서 실행 된다.
• TEST – 묵시적 AND연산을 수행한다. 오퍼랜드에 영향을 주지 않고, 플래그만 설정시켜준다. 보통 함수의 성공여부를 판단하기 위해 많이 사용된다.
• PTR – 사이즈를 지정해준다.
• CALL – 함수 호출에 사용한다. 함수 호출 후 되돌아 올 주소 값을 자동으로 저장한다.
데이터 이동 |
MOV, LEA, MOVS |
논리, 연산 |
ADD, SUB, INC, DEC, CMP, TEST |
흐름제어 |
JMP, CALL |
스택 조작 |
PUSH, POP |
조건 분기의 종류와 특징
명령어 |
명령어 의미 |
부등호 |
플래그 조건 |
JA |
Jump if (unsigned) above |
> |
CF = 0 and ZF = 0 |
JAE |
Jump if (unsigned) above or equal |
>= |
CF =0 and 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 = 0 |
JE |
Jump if equal |
== |
ZF = 1 |
JECXZ |
Jump if ECX is 0 |
|
ECX = 0 |
JG |
Jump if (signed) greater |
> |
ZF = 0 and SF == OF |
JZ |
Jump if zero |
== |
ZF = 1 |
어셈블리의 자료형
종류 |
특징 |
Byte |
8bit 정수
(1Byte의 데이터를 저장할 수 있는 타입) |
Word |
16bit 정수
(2Byte의 데이터를 저장할 수 있는 타입) |
Dword |
32bit 정수
(4Byte의 데이터를 저장할 수 있는 타입) |
Qword |
64bit 정수
(8Byte의 데이터를 저장할 수 있는 타입) |
※ 32bit 환경에서는 Dword까지 사용 가능하며, 64bit 환경에서는 Qword까지 사용 가능하다.
'Reversing' 카테고리의 다른 글
리버싱 기초 지식 : 함수호출규약(Calling Convention) (0) | 2015.01.27 |
---|---|
리버싱 기초 지식 : 레지스터(Register) (0) | 2015.01.27 |
리버싱(Reversing) 이란?? (0) | 2015.01.27 |