본문 바로가기

Reversing

리버싱 기초 지식 : 어셈블리어(Assembly)

어셈블리어란??

기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다.

일대일 대응이란? 어셈블리어 명령어 하나가 기계어 명령어 하나와 대응된다는 의미이다.

기계어를 사람이 편하게 프로그래밍할 수 있도록 문자로 기호화해서 나타낸 언어로 기호 언어라고도 한다.

어셈블리어는 하드웨어에 직접 접근 할 수 있는 언어이므로, 주로 하드웨어소통을 위해 쓰인다. 빠른 처리를 요구할 경우 어셈블리어로 작성을 하기도 한다.

 

기본적인 어셈블리 변환

[Hello World c소스]

 

[Hello World 어셈블리어]

 

대표적인 어셈블리 명령어

INC(Increase) - 피연산자에 1을 더한다.

DEC(Decrease) - 피연산자에 1을 뺀다.

ADD(add) - DestinationSource의 값을 더해서 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까지 사용 가능하다