공부해요/리버싱_핵심원리

49. IA-32 Instruction

yenas0 2025. 1. 12. 07:35
반응형

IA-32 Instruction

Instruction이란 CPU가 알아들을 수 있는 기계어 이다. 명령어 라는거..

IA-32 Instruction는 IA-32 계열의 CPU에서 사용되는 명령어를 말하는 것임

여기에서 두번째 칸에 보이는 E8 CC27000이나 55이런거가 모두 IA-32 Instruction이다

 

프로그래밍 언어로 작성된 코드는 컴퓨터가 알아들을 수 있게 compile/Link과정을 거쳐서 위에 형식으로 변환해야된다.

 

 

용어정리

용어 설명
Macine Language 기계어, CPU가 해석할 수 있는 Binary코드
Instruction 하나의 기계 명령어 단위
OpCode Operation Code, Instruction 내의 실제 명령어
Assembly 어셈블리 프로그래밍 언어
Assemble 어셈블리 코드를 기계어로 변환하는 작업
Assembler Assemble 작업을 수행하는 프로그램
Disassemble 기계어를 다시 어셈블리 언어로 변환하는 작업
Disassembler Disassemble 작업을 수행하는 프로그램
Disassembly Disassemble과정을 거쳐서 생성된 어셈블리 언어
Compile C/C++ 등의 언어를 기계어로 변환하는 작업
Link Obj 파일들을 실행 가능한 파일 형태로 연결하는 작업

 

사람이 기계어 이해하려고 16진수로 바꾸고 디스어셈블리로 바꿈

 

Decompiler

기본적으로 Disassembler와 같은 개념이지만 Disassembler는 무조건 디스어셈블리로 변환하지만Decompiler는 원본 소스코드 형태로 변환시켜 줌(언어에 맞는 디컴파일러 사용해야 함) 

PE파일을 디컴파일해서 보면 원본 코드와 비슷하게 해석이 된다. IDA Pro랑 Hex-Rays Decompiler플러그인으로 할 수 있는데 유료임

 

IA-32 Instruction 포맷

Opcode항목은 필수고 나머지는 옵션이다.

 

Instruction Prefixes - 옵션
- 특정한 opcode가 나올 시 사용되어 opcode의 의미를 보조
- 1바이트
Opcode - 필수
- 실제적인 명령어
- 1~3바이트
- 대부분은 1바이트, 가끔 2바이트고 3바이트의 경우 MMX관련 명령어
- 대부분 피연산자(operand)를 가짐
ModR/M - 옵션
- Opcode를 도와 Operand를 설명하는 수단으로 사용된다.(피연산자의 개수나 종류, 레지스터인지.. address인지, 상수인지...)
- 1바이트
SIB - 옵션
- ModR/M 보조
- 1바이트
Displacement - 옵션
- opcode의 피연산자가 memory addresss인 경우 변위를 나타낼 때 사용됨
- 1, 2, 4바이트로 크기 다양
Immediate - 옵션
- opcode의 피연산자가 상수인 경우에 상수를 immediate로 칭함

 

 

http://www.intel.com/products/processor/manuals/

 

Intel® 64 and IA-32 Architectures Software Developer Manuals

These manuals describe the architecture and programming environment of the Intel® 64 and IA-32 architectures.

www.intel.com

위에는 인텔에서 제공한 매뉴얼임

다운받아서 보면 됨

 

Instruction 해석 실습

컴구때 이미 배웠던 내용이라 간단하게만 정리..

이 내용은 컴구 책 봐도 될듯

https://product.kyobobook.co.kr/detail/S000060622658

 

컴퓨터 구조 및 설계 RISC-V | David A. Patterson - 교보문고

컴퓨터 구조 및 설계 RISC-V | 현대의 최신 컴퓨터 기술은 복합적이어서 컴퓨터 전문가라면 전공 분야와 상관없이 하드웨어와 소프트웨어를 모두 잘 이해해야 합니다. 다양한 수준에서 일어나는

product.kyobobook.co.kr

물론 얘는 risc-v 이긴함..

 

IA-32 Instruction 해석해보기

1. Prefix 해석

-Prefix는 명령어의 동작 방식을 수정하는 선택적 바이트

- IA-32 명령어에 따라 최대 4개의 Prefix 올 수 있음

예제에서..

66 prefix는 operand 크기를 32비트에서 16비트로 바꿈

예시 : 6681FE 3412 에서 66은 16비트 operand 크기로 변환함

 

2. opcode 해석

- one-byte opcode map 참고해서 opcode의 의미를 찾음(위에서 다운받은거 pdf 파일에 있음

예제보면 opcode 81은 Group 명령어로 ModR/M의 Reg필드의 값을 참고해서 세부 동작을 결정한다.

 

3. ModR/M 해석

ModR/M이 FE임 11111110

Mod -> 11 -> 레지스터 간 명령어

Reg -> 111 -> CMP 명령어의 대상

R/M -> 110 -> 피연산자 ES 또는 SI

예시로 C2(11000001)이다

mod=11

reg=000->EAX

rm =001 ->ECX

 

4. SIB

바이트 메모리 주소 계산을 위한 추가 정보를 제공함

[scale][index][base]구조

예제에서 SIB는 01 (ECX + EAX)

Scale은 1배수, Index는 ECX, Base는 EAX

예시로 SIB가 28(00101000)이다 하면

Scale= 00 ->1배수

index =100 ->EAX

Base = 101 -> EBP

 

5. Displacement(상대주소)

예제에서 1FFA(00001FFA)

상대 주소는 현재 명령어 이후 1FFA만큼 떨어진 메모리를 참조한다는 뜻

 

6. Immediate (명령어에 쓰는 상수)

1234임

3412로 되어있으니까 리틀로 본거

 

 

예제 1번: 6681FE 3412

1. Prefix(66)

: operand 크기를 16비트로

2. opcode(81)

Group 1 명령어, ModR/M 값 필요

3. ModR/M(FE)

mod=11(레지스터 간 동작

Reg=111(CMP)

R/M = 110(SI 레지스터)

4. Immediate(3412)

비교할 상수값이 1234임

 

따라서 최종 명령어는 CMP SI, 1234

 

예제 2번: 8D8428 B1354000

1. opcode(8D)

LEA Gv, M 명령어 의미

2.  ModR/M(84)

Mod=10(base+Index+displacement)

Reg=000(EAX)

R/M=100(SIB 사용)

3. SIB(28)

Scale=00(1배수)

Index=EAX

Base=EBP

4. Displacement(B1354000)

32비트 Displacement 값 = 0x4035B1

 

따라서 최종 명령어는 LEA EAX, [EAX+EBP+4031B1]

반응형

'공부해요 > 리버싱_핵심원리' 카테고리의 다른 글

51. Static 안티 디버깅  (0) 2025.01.22
50. 안티 디버깅  (0) 2025.01.12
48. SEH  (0) 2025.01.08
47. PEB  (1) 2025.01.02
46. TEB  (1) 2025.01.02