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)
'[정보 보안] 리버싱' 카테고리의 다른 글
[Reversing] 기초 이론_Assembly(어셈블리)_3 (0) | 2022.08.22 |
---|---|
[Reversing] 기초 이론_Assembly(어셈블리)_2 (0) | 2022.08.21 |
[Reversing] 기초 이론_CPU와 레지스터_3 (0) | 2022.08.19 |
[Reversing] 기초 이론_CPU와 레지스터_2 (0) | 2022.08.18 |
[Reversing] 기초 이론_CPU와 레지스터 (0) | 2022.08.10 |