CTF-All-In-One/doc/1.5.2_x86_x64.md
2018-05-11 16:08:57 +08:00

4.3 KiB
Raw Blame History

1.5.2 x86/x86-64 汇编基础

x86

IA-32 体系结构提供了 16 个基础寄存器,可分为下面几组:

  • 通用寄存器8 个通用寄存器用于存储操作数、运算结果和指针。
  • 段寄存器:包括 6 个段选择器。
  • EFLAGS 寄存器:用于显示程序执行的状态和允许对处理器进行有限的(应用层)控制。
  • EIP 寄存器:包含一个 32 位的指针,指向下一条被执行的指令

通用寄存器

  • EAX操作数和结果数据的累加器。
  • EBX指向 DS 段中数据的指针。
  • ECX用于字符串和循环操作的计数器。
  • EDXI/O 指针。
  • ESI指向由 DS 寄存器指向的段中的数据的指针;字符串操作的源指针。
  • EDI指向由 ES 寄存器指向的段中的数据(或目标地址)的指针;字符串操作的目标指针。
  • ESP栈指针位于 SS 段)。
  • EBP指向栈上数据的指针位于 SS 段)。

段寄存器

段寄存器用于保存 16 位的段选择器。段选择器是一种特殊的指针,用于确定内存中某个段的位置。

段寄存器的使用取决于操作系统的内存管理模型。

平坦内存模型:

分段内存模型:

EFLAGS

标志位寄存器统称为 EFLAGS

  • 状态标志
    • CFbit 0进位标志用于表示无符号数运算是否产生进位或者借位如果产生了进位或借位则值为 1否则值为 0。
    • PFbit 2奇偶标志用于表示运算结果中 1 的个数的奇偶性,偶数个 1 时值为 1奇数个 1 时值为 0。
    • AFbit 4辅助进位标志在字操作时标记低位字节低 4 位)是否向高位字节(高 4 位)进位或借位。
    • ZFbit 6零标志用于表示运算结果是否为 0结果为 0 时其值置 1否则置 0。
    • SFbit 7符号标志用来标记有符号数运算结果是否小于 0小于 0 时置 1否则置 0。
    • OFbit 11溢出标志用于表示有符号运算结果是否溢出发生溢出时置 1否则置 0。
  • DFbit 10方向标志决定串操作指令执行时指针寄存器的调整方向。
  • 系统标志和 IOPL 域
    • TFbit 8跟踪标志用于程序调试置 1 时 CPU 处于单步执行状态,置 0 时处于连续工作状态。
    • IFbit 9中断允许标志决定 CPU 是否响应 CPU 外部的可屏蔽中断发出的中断请求,置 1 时可以响应中断,置 0 时不响应中断。
    • IOPLbits 12,13I/O 特权标志,用于表示当前进程的 I/O 特权级别,只有当前进程的 CPL 小于或等于 IOPL 时才能访问 I/O 地址空间,只有 CPL 为 0 时才能修改 IOPL 域。
    • NTbit 14嵌套任务标志置 1 时表示当前任务是在另一个任务中嵌套执行,置 0 时表示非嵌套。
    • RTbit 16恢复标志用于表示是否响应指令断点置 1 禁用指令断点,置 0 允许指令断点。
    • VMbit 17虚拟 8086 模式标志,用于表示进程是运行在虚拟 8086 模式还是保护模式,置 1 运行在虚拟 8086 模式,置 0 运行在保护模式。
    • ACbit 18对齐检测标志与 CR0 寄存器的 AM 标志联合使用,这两个标志位同时置 1 启用对内存引用的对齐检查,同时置 0 表示禁用对齐检查。对齐检查仅在用户态下进行0 特权级下不做检查。
    • VIFbit 19虚拟中断标志是 IF 标志的一个虚拟映像,与 VIP 标志一起使用,当控制寄存器 CR4 中的 VME 或者 PVI 标志位置 1 且 IOPL 小于 3 时,处理器只识别 VIF 标志。
    • VIPbit 20虚拟中断等待标志置 1 表示有一个等待处理的中断,置 0 表示没有等待处理的中断。
    • IDbit 21识别标志置 1 表示支持 CPUID 指令,置 0 表示不支持。

EIP 寄存器

指令指针寄存器存储了当前代码段的偏移,指向了下一条要执行的指令,系统根据该寄存器从内存中取出指令,然后再译码执行。

x64

参考资料