[정보 보안] 리버싱

[Reversing] 기초 이론_Assembly(어셈블리)

ITsubin 2022. 8. 20. 19:22

Assembly(어셈블리)

> 어셈블리 언어는 언어들  낮은 레벨의 저급 언어로,

   컴퓨터에 가장 가까운 언어. ( Reversing에서 사용되는 언어는 어셈블리 언어 )

> CPU 마다 고유한 어셈블리 언어를 갖고 있다.

> 어셈블리 언어는 CPU 사용하는 바이너리 코드 기계어를 사람이 보기 쉬운 형태로 문자화 시킨

> 프로그래밍 언어들은 컴파일러를 통해 기계어로 각자의 언어들을

   CPU 해석해서 실행할 있게 기계어로 변환된다.

> 기계어를 CPU 맞게 어셈블리 언어로 변환하여 Reversing 사용된다.


> 인텔 IA32 어셈블리 명령 포맷(가장 대중화)

> 먼저 IA32 명령어 형태는 opcode(옵코드) operand(오퍼랜드) 구성

OPCODE  Operand1(목적지),  Operand2(출발지)
MOV  EAX  EBX

> MOV 출발지의 데이터를 목적지에 이동할 사용되며,

   위의 MOV EAX, EBX 해석하게 되면 EBX 데이터를 EAX 이동 사용된다.

 

> 목적지 오퍼랜드에 있는 데이터 종류는 메모리주소, 레지스터

> 출발지 오퍼랜드의 데이터 종류는 메모리주소, 레지스터, 상수 등이 된다.

> MOV 명령어는 출발지와 목적지 오퍼랜드의 데이터 크기는 동일

> 출발지와 목적지에 데이터 타입이 메모리주소가 군데 오게 구성하지 못한다.

> 어셈블리에서는 메모리주소 -> 메모리주소로 데이터 이동은 불가능하며, 레지스터를 거쳐야 가능


MOVZX

> Move with Zero Extension (부호 없는 데이터 이동) (word)

> 컴파일러는 Unsign 형을 자동으로 MOVZX 명령어로 구성한다.

> 데이터 크기가 맞지 않을 데이터 이외 공간은 0으로 채운다.


MOVSX

> Move with Sign Extension (부호 있는 데이터 이동)  (음수인경우 1) (byte)

> 컴파일러는 Sign 형을 자동으로 MOVSX 명령어로 구성한다.

> 데이터 크기가 맞지 않을 데이터 이외 공간은 1 채워준다.


MOVS

> Move data from String to String

> ESI 저장된 주소에 있는 데이터(문자열) EDI 저장된 주소로 이동

> MOVS 오퍼랜드를 생략 가능.

   (미리 MOVS EDI, ESI 정의가 되어 있기에 오퍼랜드 생략이 가능)

> 방향 플래그(DF) 1이면 ESI EDI 감소, 0이면 증가

 

+ 오퍼랜드란?

> 연산을 수행 하는데 필요한 데이터 혹은 데이터 주소


MOVS의 세분화

 

MOVSB

> 한 번에 1Bytes 사이즈만큼 읽어들인다. (Byte)

 

MOVSW

> 한 번에 2Bytes 사이즈만큼 읽어들인다. (1 Word, Word)

 

MOVSD

> 한 번에 4Bytes 사이즈만큼 읽어들인다. (2 Word, Dword)

 

MOVSQ

> 한 번에 8Bytes 사이즈만큼 읽어들인다. (4 Word, Qword)