因此节点3和节点4不被节点2支配,所以违反了SESE(single entry + single exit)的well-define结构化分析规则,所以“钻石形”的cfg无法被还原!
论文的主要目的
我们从论文的标题看起,这就很有趣。
《Ahoy SAILR! There is No Need to DREAM of C: A Compiler-Aware Structuring Algorithm for Binary Decompilation》
标题中的“DREAM”指的是NDSS 2015的论文 《No More Gotos: Decompilation Using Pattern-Independent Control-Flow Structuring and Semantics-Preserving Transformations》,后续用Dream来指代。
switch(a) {
case 1:
//do-something
ret = 100;
error = "error";
break;
case 2:
//do-something
ret = 100;
error = "error";
break;
.....
}
switch(a) {
case 1:
//do-something
ret = 100;
error = "error";
goto label;
case 2:
//do-something
label:
ret = 100;
error = "error";
break;
.....
}
int fun(int a, int b)
{
int ret = 0;
if (getchar() > 0x10) {
ret = a+b;
} else {
ret = a-b;
if (getchar()>0x20) {
printf("hello");
printf("ret=xx");
return ret;
}
}
printf("hi");
printf("ret=xx");
return ret;
}
int fun(int a, int b)
{
int ret = 0;
if (getchar() > 0x10) {
ret = a+b;
} else {
ret = a-b;
if (getchar()>0x20) {
printf("hello");
goto LABEL
}
}
printf("hi");
LABEL:
printf("ret=xx");
return ret;
}
for (int i = 0; i < 0x100; i++) {
if (g_datas > 0) {
break;
}
..... // do-something
}
if (g_datas > 0) {
goto label;
}
for (int i = 0; i < 0x100; i++) {
..... // do-something
}
label: