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/
위에는 인텔에서 제공한 매뉴얼임
다운받아서 보면 됨
Instruction 해석 실습
컴구때 이미 배웠던 내용이라 간단하게만 정리..
이 내용은 컴구 책 봐도 될듯
https://product.kyobobook.co.kr/detail/S000060622658
물론 얘는 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 |