본문 바로가기
reversing

IA-32 Instruction 포맷

by 코끼리_땃쥐 2022. 9. 27.
반응형

IA-32 Instruction은 다음과 같이총 6개의 항목으로 구성되어있습니다.

여기서 Opcode 항목은 반드시 존재해야 하며, 나머지 항목은 옵션입니다.

 

Instruction Prefixes

Instruction Prefixes는 옵션 항목으로, 뒤에 특정한 Opcode가 나올 때 사용되어 Opcode의 의미를 보조하는 역할을 합니다.

Prefix 항목은 1바이트 크기를 가집니다.

 

 

Opcode

Opcode(Operation Code)는 필수 항목이며 실제적인 명령어를 나타냅니다.

Opcode는 1~3 바이트 크기를 가집니다. 일반적인 응용프로그램 디버깅에서는 주로 1바이트 크기의 Opcode가 대부분이고, 가끔 2바이트 크기의 Opcode들이 있습니다. 3바이트 크기의 Opcode는 주로 MMX(MultiMedia eXtension) 관련 명령어라서 접할 기회가 거의 없습니다. Opcode는 보통 Operand(피연산자)를 가지는 경우가 많습니다. Operand의 종류는 Register, Memor Address, Constans(상수)입니다. 이러한 Opcode의 Operand를 결정하기 위해 (보조 수단 으로_ 보통 ModR/M과 SIB가 뒤따라 오는 경우가 있습니다.

OpCode는 그 종류가 매우 많기 때문에 일반적으로 intel Manual의 Opcode Map을 보면서 해석을 해야 합니다.

 

ModR/M

ModR/M은 옵션 항목으로, 주로 Opcode를 도와서 Operand를 설명(Operand의 개수, 종류[Register, Address, Constans])하는 수단으로 사용됩니다.

ModR/M은 1바이트 크기를 가지며 다음과 같이 비트단위로 분리되어 사용됩니다.

 

SIB

SIB(Scale-Index-Base)는 옵션 항목으로, ModR/M을 보조할 때 사용됩니다.

Opcode의 Operand가 Memory Address 인경우 ModR/M과 함게 사용됩니다.

SIB는 1바이트 크기를 가지며 ModR/M과 같이 비트 단위로 분리되어 사용됩니다.

Displacement

Displacement는 옵션 항목으로, Opcode의 Operand가 Memory Address인 경우 Displacement(변위)를 나타낼때 사용됩니다.

Displacement의 크기는 1, 2, 4 바이트로 다양합니다.

 

Immediate

Immediate는 옵션 항목으로, Opcode의 Operand가 Constant(상수)인 경우에 그 Constant를 Immdiate라고 말합니다.

Immediate의 크기는 1, 2, 4바이트로 다양합니다.

 

 

반응형

'reversing' 카테고리의 다른 글

안티 디버깅 Static  (2) 2022.10.04
NtQueryInformationProcess  (0) 2022.09.29
TEB  (0) 2022.09.16
TLS CALLBACK  (0) 2022.08.31
CreateRemoteThread() API 호출 흐름  (0) 2022.08.29

댓글