图解angr中两种CFG的区别

angr里提供两种CFG的生成,一种是CFGFast,一种是CFGEmulated。这两种究竟有什么不同呢?

本文主要是用图来说明下这个问题。可能回答的不是很完整。

CFGFast这种CFG生成的比较快,但是没有考虑上下文关系。比如函数A调用了printf函数,函数B也调用了printf函数。就会变成下图的形式。

image-20210816153240580

而CFGEmulated这种CFG则是考虑了上下文关系,上面的例子在CFGEmulated里就会变成下图的样子。

image-20210816153817715

现在来实际看看angr生成的控制流图是什么样子的。针对以下C程序,我们来画CFGEmulated和CFGFast。

#include<stdio.h>
int A(){
    printf("hello world\n");
}
int B(){
    printf("hello");
}
int C(){
    printf("world");
}
int main()
{
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    if (a == 1)
    {
        A();
    }
    else if (b == 1)
    {
        B();
    }else
    {
        C();
    }
    return 0;
    
}

angr生成CFG以及可视化CFG的代码如下:

import angr
from angrutils import *

project = angr.Project("example/cfg",load_options={'auto_load_libs': False})

cfg_emulated = project.analyses.CFGEmulated()
plot_cfg(cfg_emulated, "cfg_emulated", asminst=True, remove_imports=True, remove_path_terminator=True)

cfg_fast = project.analyses.CFGFast()
plot_cfg(cfg_fast, "cfg_fast", asminst=True, remove_imports=True, remove_path_terminator=True)  

CFGEmulated如下图所示:

cfg_emulated

CFGFast如下图所示:

cfg_fast

可以看到CFGEmulated的三个分支的printf都单独提出来了。

image-20210816160116456

而CFGFast中,可以看到printf节点的前继节点是B,C两个函数。

image-20210816160226539

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

破落之实

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值