如何将嵌套的if-sentence从IA32反向设计为C?

时间:2015-10-23 16:47:28

标签: assembly x86 reverse-engineering

如何将嵌套的if-sentence从IA32反向设计为C?

我知道if-sentence结构将采用以下形式,一旦成功逆向工程:

int test(int x, int y) { 
    int val =_______; 
    if(_______){
        if(_______) 
            val=_______;
        else 
            val=_______;
    } else if (_______) 
        val=_______;
    return val; 
}

IA32看起来像这样:

 1   movl 8(%ebp), %eax
 2   movl 12(%ebp), %edx
 3   cmpl $-3, %eax
 4   jge .L2
 5   cmpl %edx, %eax
 6   jle .L3
 7   imull %edx, %eax
 8   jmp .L4
 9 .L3:
10   leal (%edx,%eax), %eax
11   jmp     .L4
12 .L2:
13   cmpl    $2, %eax
14   jg      .L5
15   xorl    %edx, %eax
16   jmp     .L4
17 .L5
18   subl    %edx, %eax
19 .L4:

因此,我反复将C移动到适合大会的一般转换形式,并非常感谢你的帮助。

感谢。

修改  1.第11行缺少jmp目标  2.我尝试做的是将外部if-expression与下面的标准if-in-c-to-goto形式相匹配。

    if (!test-expr)
        goto false;
    then-statement
    goto done;
false:
    else-statement
done:

然后我继续将内部if-expression转换为以下'替换if-in-c-to-goto形式'。

    if (test-expr)
        goto true;
    else-statement
    goto done;
true:
    then-statement
done:

完成所有这些后,我最终得到了:

    int value = ______;
    if(______)
        goto labelX;
    if(!_____)
        goto labelY;
.labelX
    if(______)
        goto labelG;
    value = ______;
    goto labelR;
.labelG
   val = ______;
.done

1 个答案:

答案 0 :(得分:0)

从装配开始更容易。请注意,它并不严格遵循C代码,因为默认值未预先初始化。

我假设您知道前两行将x加载到eaxy加载到edx,并且返回值将在eax处功能的结束。

第一次比较是cmpl $-3, %eaxjge .L2,这意味着我们有if (x >= -3)。在.L2,我们cmpl $2, %eaxjg .L5我们看到subl %edx, %eax以便if (x > 2) val = x - y;xorl %edx, %eax。对于else分支,我们val = x ^ y;当然是int test(int x, int y) { int val =_______; if(x >= -3){ if(x > 2) val=x - y; else val=x ^ y; } else if (_______) val=_______; return val; } 。好的,让我们回顾一下我们的立场:

cmpl %edx, %eax

我们在第5行的第一个条件跳转中留下了未被捕获的分支,我们在jle .L3leal (%edx,%eax), %eax.L3 if (x <= y) val = x + y;。这样leaval在这里被用作花哨的加法)。我们留下第7行imull %edx, %eax的最终案例:val = x * yint test(int x, int y) { int val = x * y; if(x >= -3){ if(x > 2) val=x - y; else val=x ^ y; } else if (x <= y) val=x + y; return val; } 。因此,完整的代码是:

$ node --use-strict

由于您可以任意反转条件,因此有多种正确的解决方案。