-
-
[原创]硬编码
-
2021-5-13 06:48
3812
-
硬编码
前言
该文章主要是包含了X86硬编码的基本概念。主要用作复习使用。所谓的硬编码在我看来就是CPU用什么样的方法来读取理解我们计算机当中的0,1。即不同的CPU有他们不同的方法来理解0,1的含义。这些方法就是所谓的硬编码。比如:X86CPU和ARM的硬编码就不一样 。如下图为X86硬编码结构图:
一;前缀指令(Instruction Prefixes)
前缀指令是可选的指令,可以为0个,其主要分为四组。也就是说,前缀指令最多只有四个且每组前缀指令只能有一个。
1.1;LOCK 和 REPEAT前缀指令
指令 | 硬编码 | 注释 |
LOCK | F0 |
|
REPNE/REPNZ | F2 |
|
REP/REPZ | F3 |
|
1.2;段前缀指令
指令 | 硬编码 | 注释 |
CS | 2E |
|
SS | 36 |
|
DS | 3E |
|
ES | 26 |
|
FS | 64 |
|
GS | 65 |
|
1.3;操作数宽度前缀指令
指令 | 硬编码 | 注释 |
| 66 | 改变操作数的默认位(16bit和32bit 切换) |
|
|
|
1.4;地址宽度前缀指令
指令 | 硬编码 | 注释 |
| 67 | 改变默认寻址宽度(16bit和32bit 切换) |
|
|
|
二;定长指令和可变长指令
定长指令是指出去前缀指令之后,指令的长度是不变的,与其相反可变的就是可变长指令。其中Opcode 位最少1个字节,最多3个字节。且Opcode决定了后续是否存在ModR/M,并且ModR/M决定了后面是否存在SIM。
2.1;经典定长指令
“5”系列的定长指令(一个字节硬编码)
指令 | 硬编码 | 指令 | 硬编码 |
PUSH EAX | 0X50 | POP EAX | 0X58 |
PUSH ECX | 0X51 | POP ECX | 0X59 |
PUSH EDX | 0X52 | POP EDX | 0X5A |
PUSH EBX | 0X53 | POP EBX | 0X5B |
PUSH ESP | 0X54 | POP ESP | 0X5C |
PUSH EBP | 0X55 | POP EBP | 0X5D |
PUSH ESI | 0X56 | POP ESI | 0X5E |
PUSH EDI | 0X57 | POP EDI | 0X5F |
|
|
|
|
[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。
最后于 2021-5-17 20:46
被天象独行编辑
,原因: