必须满足哪个条件才能执行此 if 分支

逆向工程 拆卸 部件 调试器 风袋
2021-06-12 07:39:52

现在我正在玩一个我在OpenSecurityTraining 上找到的小培训应用程序

所以,我分析了这段代码,我想我很理解这一点。我唯一不明白的是cmpjeat 行0x004010e30x004010e7这似乎是一些if条件。但是,我无法弄清楚应该满足哪个条件才能执行跳转指令。

我的解决方法是在执行eipcmp行时进行操作但是,我的问题是必须设置什么条件才能接受je指令?

004010e0 55              push    ebp
004010e1 8bec            mov     ebp,esp
004010e3 837d0803        cmp     dword ptr [ebp+8],3
004010e7 7412            je      mystery!main+0x1b (004010fb)
004010e9 6834404200      push    offset mystery!__rtc_tzz <PERF> (mystery+0x24034) (00424034)
004010ee e81c040000      call    mystery!printf (0040150f)
004010f3 83c404          add     esp,4
004010f6 83c8ff          or      eax,0FFFFFFFFh
004010f9 eb0b            jmp     mystery!main+0x26 (00401106)
004010fb e80affffff      call    mystery!mystery_function+0xffffffff`ffffffea (0040100a)
00401100 eb02            jmp     mystery!main+0x24 (00401104)
00401102 eb02            jmp     mystery!main+0x26 (00401106)
00401104 33c0            xor     eax,eax
00401106 5d              pop     ebp
00401107 c3              ret
2个回答

扩展基指针,顾名思义,通常用作帧指针。这意味着它用于访问函数参数和局部变量。如果您考虑堆栈的工作原理,您可以得出以下结论:

  • 局部变量将位于基指针的负偏移量上
  • 帧指针中的地址将是前一个函数的帧指针的位置
  • EBP +4 偏移处的地址将是返回地址
  • 大于 4 的偏移量是函数参数

话虽如此,ebp+8 通常是第一个函数参数。在这种情况下,比较指令将第一个函数参数的值与 3 进行比较。如果它们相等(je指令是jump if equal),则将执行条件跳转。

dword ptr [val]正是它所说的:指向 value 的 32 位指针至于如何cmpje以及所有其他指令的工作,我推荐的阅读英特尔手册