GetPC技术

GetPC(Get Program Counter 获得程序计数器),在x86下可以理解为GetEip,在很多情况下,由于我们不能确定自己程序所在的位置,程序中的各种跳转、调用以及变量的访问就无法知道确切的地址,因此需要使用GetPC技术获得当前地址。

Call GetPC Type A

  • 优点:
    不会产生冗余指令
  • 缺点:
    有很多0x00产生,在很多输入情况下都不能直接使用,需要编码

    Call GetPC Type B

    跳转到的4118d5是FF,和后面的C3拼接成了FF C3(INC EBX)
  • 优点:
    不会产生0x00,大多数情况下可直接使用,无需编码
  • 缺点:
    会产生一条冗余指令”INC EBX“,某些情况下可能产生影响

    4.2 GetPC技术B-FSTENV方式

    X87 浮点单元(FPU)在普通X86架构中提供了一个隔离的执行环境。它包含一个单独的专用寄存器集合,当一个进程正在使用FPU寄存器执行浮点运算时,这些寄存器需要由操作系统在上下文切换时保存。

    我们利用FPU的这个特点,通过获取其 fpu_instruction_pointer这个成员的内容,进而得到上一条FPU指令所在的位置。
    汇编指令FNSTENV这条指令可以将FPU的状态值保存到内存中

12-21 00:18