如何将嵌套的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
答案 0 :(得分:0)
从装配开始更容易。请注意,它并不严格遵循C代码,因为默认值未预先初始化。
我假设您知道前两行将x
加载到eax
和y
加载到edx
,并且返回值将在eax
处功能的结束。
第一次比较是cmpl $-3, %eax
和jge .L2
,这意味着我们有if (x >= -3)
。在.L2
,我们cmpl $2, %eax
和jg .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 .L3
处leal (%edx,%eax), %eax
和.L3
if (x <= y) val = x + y;
。这样lea
(val
在这里被用作花哨的加法)。我们留下第7行imull %edx, %eax
的最终案例:val = x * y
即int 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
由于您可以任意反转条件,因此有多种正确的解决方案。