理解装配循环

逆向工程 部件
2021-06-23 11:38:06

我无法理解此代码如何知道何时停止循环。我应该弄清楚将哪些值放入 %edi。但我不知道它循环了多少次。

0x40106e      movl   $0x2b,0xffffffdc(%ebp)
0x401075      movl   $0x31,0xffffffe4(%ebp)
0x40107c      movl   $0x74,0xffffffec(%ebp)
0x401083      movl   $0x19,0xffffffe8(%ebp)
0x40108a      movl   $0x7,0xffffffd8(%ebp)
0x401091      movl   $0x14,0xffffffe0(%ebp)
0x401098      mov    $0xdead,%edi
0x40109d      mov    $0x2,%ecx
0x4010a2      mov    %ecx,%esi
0x4010a4      mov    $0x3,%ecx
0x4010a9      mov    $0x2,%ebx
0x4010ae      sub    %esi,%ebx
0x4010b0      imul   $0xc,%ebx,%ebx
0x4010b3      mov    $0x3,%edx
0x4010b8      sub    %ecx,%edx
0x4010ba      lea    0xffffffd8(%ebp),%eax
0x4010bd      lea    (%ebx,%edx,4),%ebx
0x4010c0      add    %ebx,%eax
0x4010c2      mov    (%eax),%edi
0x4010c4      loop   0x4010a9
0x4010c6      mov    %esi,%ecx
0x4010c8      loop   0x4010a2
0x4010ca      mov    $0xbeef,%edi

编辑:我现在了解循环逻辑。但是,我很难跟踪所有值的移动。我被困在这里lea 0xffffffd8(%ebp),%eax 我怎么知道 %ebp 是什么?

1个回答

代码中有2个循环:

0x40109d MOV $ 0X2,ECX%
0x4010a2 MOV%ECX,%ESI
0x4010a4 MOV $ 0x3,%ECX
0x4010a9 MOV $ 0X2,EBX%
...
第一循环
......
0x4010c4 循环0x4010a9
0x4010c6 MOV%ESI,ECX%
第二个循环
0x4010c8 环0x4010a2

  • 3在 0x4010a4 处移动到%ecx 时第一次进行了三次
  • 第二环路将去两倍2移入%ecx中在0x40109d和原子%ESI保存%ecx中之前,所述第一环路内进一步使用。

另外这里是关于LOOP操作码的 信息

0x4010ba lea 0xffffffd8(%ebp),%eax

这意味着 %eax 通过计算 %ebp+0xffffffd8 得到地址

0x4010bd lea (%ebx,%edx,4),%ebx

这就是 %ebx = %ebx + %edx * 4

0x4010c0 添加 %ebx,%eax

这里 %ebx 添加到 %eax

0x4010c2 mov (%eax),%edi

最后 %edi 得到了 %eax 指向的数据。

一个小的汇编参考。