首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏Ms08067安全实验室

    【学员笔记分享】汇编之EFLAGS寄存器中标志位

    8086CPU的flag寄存器(16位)各标志位如下(这是32位EFLAG的低十六位图,但是32位与16位是一样的,只不过32位多了16位且高16位没有使用到):

    2.5K31发布于 2020-07-14
  • 来自专栏前沿安全技术

    计时瞬态执行:针对英特尔处理器的新型侧信道攻击

    瞬态执行中 EFLAGS 的变化可能会使一些 Jcc 指令在它之后稍微变慢。 如下图所示,通过将秘密数据编码到 EFLAGS 寄存器,可以测量 Jcc 指令上下文的执行时间来解码数据,而无需在瞬态攻击的第 1 阶段将 EFLAGS 寄存器重置为其初始状态。 EFLAGS 指令是可以改变EFLAGS 寄存器的指令。 Jcc 指令是可以受 EFLAGS 寄存器影响的指令。 可用的指令集在下表中列出。 B.Jcc延迟如果在更改 EFLAGS 寄存器后不立即执行 Jcc 指令,则可以减少 EFLAGS 寄存器的影响。 10 个周期足以减少 EFLAGS 寄存器的影响。 通过 LAHF 和 SAHF,或 PUSHF 和 POPF 指令重写 EFLAGS,可以减少 EFLAGS 寄存器的影响。图片此次攻击的根本原因仍未完全了解。

    1.3K50编辑于 2023-05-03
  • 来自专栏Linux内核及编程语言底层相关技术研究

    操作系统 Interrupt 执行的具体步骤

    Pushes the current contents of the EFLAGS, CS, and EIP registers (in that order) on the stack. 2. If the call is through an interrupt gate, clears the IF flag in the EFLAGS register. 5. If the call is through an interrupt gate, clears the IF flag in the EFLAGS register. 7. Restores the EFLAGS register. 3. Increments the stack pointer appropriately. 4. Restores the EFLAGS register. 4.

    85500发布于 2019-10-10
  • 来自专栏二进制漏洞研究

    CVE-2018-8897:POP SS 指令异常

    调试异常不会因为开启EFLAGS.IF标志位而被停止 如果MOV SS 或 POP SS指令后面跟类似SYSCALL, SYSENTER, INT 3等指令,则控制权限将转移到CPL < 3,此时调试异常则会在 =0 [RUN] MOV SS; INT3 Got SIGTRAP with RIP=400d7d, EFLAGS.RF=0 [RUN] MOV SS; INT 3 Got SIGTRAP with RIP=400d8f, EFLAGS.RF=0 [RUN] MOV SS; CS CS INT3 Got SIGTRAP with RIP=400da2, EFLAGS.RF=0 [RUN] MOV SS; CSx14 INT3 Got SIGTRAP with RIP=400dc1, EFLAGS.RF=0 [RUN] MOV SS; INT 4 Got SIGSEGV with RIP=400de7 [RUN] MOV SS; ICEBP Got SIGTRAP with RIP=400e1f, EFLAGS.RF=0 [RUN] MOV SS; CLI Got SIGSEGV with RIP

    75610发布于 2019-05-21
  • 来自专栏FreeBuf

    英特尔CPU曝安全漏洞,攻击者大量窃取数据

    据BleepingComputer 4月24日消息,近日在 Arxiv.org 上发表的一篇技术论文揭示了一种针对多代英特尔CPU的攻击手法——利用新的侧信道攻击,让数据通过 EFLAGS 寄存器泄露。 这一与众不同的侧信道攻击由清华大学、马里兰大学和中国教育部计算机实验室 (BUPT) 的研究人员共同发现,它不像许多其他侧信道攻击那样依赖缓存系统,而是利用瞬态执行中 EFLAGS 寄存器变化的缺陷,影响 EFLAGS 寄存器是一个 CPU 寄存器,保存着与处理器状态相关的各种标志,而 JCC 指令是一个 CPU 指令,能允许根据 EFLAGS 寄存器的内容进行条件分支。 攻击分两个阶段进行,第一阶段触发瞬时执行并通过EFLAGS寄存器对内部数据进行编码,第二阶段测量KCC指令解码数据的执行时间。 但研究人员仍然提出了一些重要的缓解措施,例如更改 JCC 指令的执行,使对抗性执行在任何情况下都无法测量,或者在瞬态执行后重写 EFLAGS 以减少其对 JCC 指令的影响。

    53020编辑于 2023-05-12
  • 来自专栏计算机学习

    xv6(21) 内联汇编

    若改变了寄存器 ebx 就可以申明 "bx",bl,ebx 都行,都代表的是一个寄存器,其他的寄存器同样如此申明 若改变了 eflags 寄存器,可以申明 "cc" 若改变了内存,可以申明 "memory 期间改变了内存和 eflags 寄存器,所以内联汇编的最后一部分申明 "cc" 和 "memory"。 寄存器 { uint eflags; asm volatile("pushfl; popl %0" : "=r" (eflags)); return eflags; } pushfl 压入 eflags,popl弹出栈顶数据(eflags)到 %0 引用的通用寄存器 r。 然后该寄存器的值再传给 eflags(变量)。

    64800编辑于 2023-12-10
  • 来自专栏嵌入式ARM和Linux

    Linux内核36-内核同步之禁止中断

    正如在讲解”IRQ和中断”时所说的那样,cli和sti汇编指令,分别用来清除和设置eflags寄存器中的IF标志。 当内核代码进入临界代码段时,通过清除eflags寄存器中的IF标志实现禁止中断,从而保护临界代码段。但是,当内核离开临界代码段的时候,内核是否该恢复之前的IF标志呢?还是不做任何处理? 保存和恢复eflags内容,可以分别通过local_irq_save()和local_irq_restore()实现。 local_irq_save拷贝eflags内容到一个局部变量中,然后调用cli指令清除IF标志。 退出临界代码段的时候,local_irq_restore再把局部变量中的内容拷贝到eflags寄存器中。

    2K21编辑于 2022-08-15
  • 来自专栏韩曙亮的移动开发专栏

    【Android 逆向】使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 完整代码示例 ) ★★★

    写寄存器:eflags ; 机器码 :00 00 00000026: add byte ptr [eax], al ;. 写寄存器:eflags ; 机器码 :00 00 00000028: add byte ptr [eax], al ;. 写寄存器:eflags ; 机器码 :00 00 0000002A: add byte ptr [eax], al ;. 写寄存器:eflags ; 机器码 :00 00 0000002C: add byte ptr [eax], al ;. 写寄存器:eflags ; 机器码 :85 C0 0000003A: je 0x3e ; 读寄存器:eflags ; 机器码

    1.4K10编辑于 2023-03-29
  • 来自专栏这里只有VxWorks

    Boot之sysInit()

    (1) */ movl %cr0, %edx; andl $0x7ffafff1, %edx; movl %edx, %cr0; /* initialize EFLAGS address */ pushl %edx /* for emulation for call */ pushl $0 /* push EFLAGS

    28410编辑于 2022-01-24
  • 来自专栏Postgresql源码分析

    Postgresql源码(106)Generic Plan与Custom Plan的区别(以分区表为例)

    然后在执行器启动阶段: #0 ExecInitAppend (node=0x17435a8, estate=0x173b3b0, eflags=16) at nodeAppend.c:111 #1 0x00000000007566d8 in ExecInitNode (node=0x17435a8, estate=0x173b3b0, eflags=16) at execProcnode.c:182 #2 0x000000000074c12c in InitPlan (queryDesc=0x1737b48, eflags=16) at execMain.c:938 #3 0x000000000074b112 in standard_ExecutorStart (queryDesc=0x1737b48, eflags=16) at execMain.c:265 #4 0x000000000074ae78 in ExecutorStart (queryDesc=0x1737b48, eflags=0) at execMain.c:144 #5 0x00000000006a69fc in ExplainOnePlan

    51630编辑于 2023-10-13
  • 来自专栏计算机学习

    xv6(4) 中断理论部分

    而这里的恢复是指弹出栈中保存的 $eflags$ 值到 $EFLAGS$ 寄存器,这在后面中断流程再详述。 所以开关中断就是修改 $EFLAGS$ 的 $IF$ 位,有这么几种方式修改 $EFLAGS$ 寄存器值: $sti$ 指令将 $EFLAGS$ $IF$ 位置 1,$cli$ 指令将 $EFLAGS$ $ 压栈,还有中断时 $EFLAGS$ 也会压栈,压入栈中后我们就可以修改栈里面的 $EFLAGS$ 的值,待到后续 $popf$ 或者 $iret$ 中断退出将修改后的 $EFLAGS$ 弹出后,就相当于修改了 $EFLAGS$ 的值。 通过中断门进入中断时会将 $EFLAGS$ 的 $IF$ 位清 0.

    77500编辑于 2023-12-05
  • 来自专栏全栈程序员必看

    系统调用(int 0x80)详解

    对于x86系统,因为所有的寄存器都只有一个物理寄存器(ARM就不一要样了),因为内核态与用户态共享所有寄存器(段、通用、栈寄存器),比如SS、ESP、eflags、CS、EIP这五个寄存器。 SS、ESP、eflags、CS、EIP这五个寄存器的内容是怎么进入内核栈的呢? 是程序从用户态进入了内核态时,即在执行_system_call函数中的指令之前,硬件已经自动把SS、ESP、eflags、CS、EIP五个寄存器压入了内核栈,然后,根据函数的需要,再保存相关通用、段之类寄存器 当在中断处理函数(陷阱门)中执行时,是可被中断(中断门)的,因为eflags标志中的TF被设置为允许中断的。因而有可能在时钟中断函数(do_timer)中,本进程的时间片可能被修改为0。 pop %fs pop %es pop %ds iret //此指令会将内核栈中的数据弹出到这5个寄存器SS、ESP、eflags

    2K40编辑于 2022-09-30
  • 来自专栏秃头哥编程

    Linux syscall过程分析(万字长文)

    最后硬件将 ss / sp / eflags / cs / ip / error code 依次压到内核栈。 |X86_EFLAGS_AC|X86_EFLAGS_TF, PT_EFLAGS(%esp) jnz .Lsysenter_fix_flags .Lsysenter_flags_fixed: | X86_EFLAGS_TF | X86_EFLAGS_VM)) == 0; #endif } 由于没有保存 eip,我们需要计算系统调用完毕后返回到用户态的地址:current->mm->context.vdso |X86_EFLAGS_DF|X86_EFLAGS_IF| X86_EFLAGS_IOPL|X86_EFLAGS_AC|X86_EFLAGS_NT); } 可以看到 MSR_STAR 最后硬件将 ss / sp / eflags / cs / ip / error code 依次压到内核栈。

    15.9K2121发布于 2019-08-23
  • 来自专栏Linux内核那些事

    GDB原理之ptrace实现原理

    当把 eflags 寄存器的 Trap Flag 设置为1后,CPU 每执行一条指令便会产生一个异常,然后会触发 Linux 的异常处理,Linux 便会发送一个 SIGTRAP 信号给被调试的进程。 eflags 寄存器的各个标志如下图: ? 从上图可知,eflags 寄存器的第8位就是单步调试模式的标志。 child, EFL_OFFSET, tmp); 而 get_stack_long(proccess, offset) 函数用于获取进程栈 offset 处的值,而 EFL_OFFSET 偏移量就是 eflags 所以上面两行代码的意思就是: 获取进程的 eflags 寄存器的值,并且设置 Trap Flag 标志。 把新的值设置到进程的 eflags 寄存器中。 设置完 eflags 寄存器的值后,就调用 wake_up_process() 函数把被调试的进程唤醒,让其进入运行状态。单步调试过程如下图: ?

    5.1K20发布于 2020-11-05
  • 来自专栏LINUX阅码场

    Xen的敏感指令陷入-《Xen虚拟化技术》学习

    3.PUSHF,POPF POPF(pop stack into EFLAGS register)和PUSHF(push EFLAGS register onto the stack)是一对相反的指令。 PUSHF是将EFLAGS的寄存器的低16位压栈,并将栈指针减2。 POPF是从栈顶弹出一个字到EFLAGS的寄存器中,并将栈指针加2。对应的32位指令为:PUSHFD和POPFD。 ? 其中,LAR指令是从指定的段描述符中加载访问权限到另一个寄存器,并设置EFLAGS寄存器中的ZF标志位;LSL指令从指定的段描述符中加载段界限到另一个寄存器中,并设置ZF标志位;VERR/VERW指令是在当前的特权级下验证指定的段是否可读

    1.9K10发布于 2019-10-08
  • 来自专栏有趣的django

    一、保护模式

    // #include "stdafx.h" #include <Windows.h> int eflags = 0; void _declspec(naked)test() { __asm { pushfd; pop eax; mov [eflags],eax; push fs; push 0x30; pop fs; int 3; pop fs; iretd ; } } int _tmain(int argc, _TCHAR* argv[]) { eflags = 0; printf("%x\r\n",test); //00401000 system ("pause"); __asm { int 32; } printf("%x\r\n",eflags); system("pause"); return 0; }  中断门影响的 Eflags位 陷进门会把 VM TF NT 三个位 置0 efl = 246 1.7.任务段 1.TSS 图片 2.TSS描述符 图片 3.操作系统默认的tr为28 图片  4.查看TSS

    1.6K20编辑于 2022-09-21
  • 来自专栏LINUX阅码场

    Linux内核之旅/张凯捷——系统调用分析(2)

    如果EFLAGS寄存器的VM标志被置位,则清除该标志。 开始执行指定的Ring0代码。 pt_regs->sp (stashed in bp) */ pushfl /* pt_regs->flags (except IF = 0) */ orl $X86_EFLAGS_IF orig_ax */ SAVE_ALL pt_regs_ax=$-ENOSYS /* save rest, stack already switched */ testl $X86_EFLAGS_NT |X86_EFLAGS_AC|X86_EFLAGS_TF, PT_EFLAGS(%esp) jnz .Lsysenter_fix_flags .Lsysenter_flags_fixed:

    2.4K20发布于 2019-10-08
  • 来自专栏Eureka的技术时光轴

    用单步异常检测OllyDbg的巧妙方法

    是80386以上的INTEL CPU中EFLAGS寄存器,其中的TF标志位表示单步中断。当TF为1时,CPU执行完一条指令后会产生单步异常,进入异常处理程序后TF自动置0。 EndDialog,hWnd,0 .elseif uMsg == WM_COMMAND mov eax,wParam .if eax == ID_OK xor eax,eax ;EAX清零 pushfd ;把EFLAGS 压栈 or dword ptr [esp],100h ;因为TF在EFLAGS的第9位 popfd ;EFLAGS出栈,用这种方法把TF置1 inc eax ;从这里开始“单步跟踪” inc

    1.6K30发布于 2019-07-24
  • 来自专栏Postgresql源码分析

    Postgresql源码(97)returns setof函数分析(oracle管道函数pipelined)

    tuple store 初始化总结: 1 初始化的过程就是在构造Tuplestorestate,主要动作: 给Tuplestorestate新的内存上下文ExecutorState 记录不能随机访问:eflags randomAccess, bool interXact, int maxKBytes) { // 输入false不允许随机访问、false、8192 Tuplestorestate *state; int eflags ; // eflags = EXEC_FLAG_REWIND eflags = randomAccess ? , interXact, maxKBytes); // 返回的Tuplestorestate状态: // state = {status = TSS_INMEM, eflags = 2, backward BufFileCreateTemp(state->interXact); CurrentResourceOwner = oldowner; state->backward = (state->eflags

    1.2K40编辑于 2023-01-16
  • 来自专栏shysh95

    中断描述符表

    中断门描述符结构如下: 中断门包含中断处理程序所在的段选择子和段内偏移地址,当通过此方式进入中断后,标志寄存器eflags中的IF位自动置0,表示把中断关闭,避免中断嵌套。 陷阱门描述符结构如下: 通过陷阱门进入中断,标志寄存器eflags的IF位不会自动置0,陷阱门只允许存在于IDT中。 调用门描述符结构如下: 调用门是用户进程用来进入0特权级的方式,其DPL为3。 旧栈环境下SS和ESP的值 标志寄存器EFLAGS的值 备份CS和EIP的值 ERROR_CODE中断错误码 特权级不发生变化时,不需要压入旧栈环境下SS和ESP的值。

    1.1K40发布于 2021-09-24
领券