利用angr获取CFG

article/2025/11/8 10:30:24

静态二进制分析中,对于程序控制流图CFG的计算是很基础且重要的一步,很多的分析是要建立在CFG的基础上。angr作为二进制分析工具,当然提供了CFG功能,下面我们就来探索下要如何使用angr计算CFG,以及其中的坑。

angr中的CFG分为2种:CFGFast和CFGAccurate。两者的区别在于前者计算的东西更少,从而也就更快。一般情况下CFGFast就够了,但在研究中若要依靠CFG进一步分析的话可能就需要CFGAccurate了,更精准当然也就更慢,需在两者间加以权衡。

我们就以一个简单的例子开始吧。
在这里插入图片描述

  1. 首先计算CFGFast

在这里插入图片描述
说明:angr中CFG()是CFGFast()的子类,也就是在CFGFast()基础上的一个包装。

这里我们通过angr-utils将cfg绘画出来,看起来更直观:

在这里插入图片描述

这里我们主要关注0x4005bc->0x4005ff和0x4005bc->0x4005ee两条边,也就是源码中从func()函数有2次返回至main()函数的边。由于计算CFGFast()时不会考虑函数调用的上下文关系(在angr中称为context_sensitivity_level),导致单纯从CFG来看我们发现从0x4005f5节点可以走到0x4005ff,从0x4005e4节点也可以走到0x4005ff,而源码表示的含义是若要走到0x4005ff节点,那就必须经过0x4005f5,而从0x4005e4节点只能走到0x4005ee。因此,CFGFast丢失了上下文调用关系,从而导致在后向切片时的不准确性,也就是说当要对0x4005ff进行切片时,0x4005f5和0x4005e4都会在切片结果内,而实际上只有0x4005f5在我们希望的切片范围中。所以,为了保留这种上下文调用关系,angr还提供了一个API – CFGAccurate()。

  1. 计算CFGAccurate

在这里插入图片描述

CFGAccurate()默认的context_sensitivity_level参数=1

在这里插入图片描述

在上图中我们可以看出,有2个相同的func()函数节点,分别从0x4005e4和0x4005f5两个节点可到达。也就是说它把两次与func()函数的调用关系单独计算,从而将这两条路径分离开,从而对于0x4005ff节点进行后向切片时,只有0x4005f5会在切片范围内,表示从0x4005f5->0x4005ff是可达的,而从0x4005e4出发则是不能到达目标节点的,符合实际情况。

因此总结来说,angr计算CFG的过程就是:模拟执行每个基本块,并判断该基本块下一步会走向哪个基本块,从而建立cfg的边关系。然而存在一些困难:一个基本块在不同的上下文中会有不同的表现形式。举例来说,一个函数返回时的基本块(即上面的func()函数),对于不同的调用者而言该基本块的下一跳的地址是不一样的。因此上下文调用关系的保留情况对于CFG构建至关重要。angr中即是通过context_sensitivity_level参数来确定在调用栈中保留多少个函数,用一个官网的例子来解释下这个参数的概念吧:

在这里插入图片描述

这里对于puts函数而言,有4个调用链:main->alpha->puts,main->alpha->error->puts,main->beta->puts,main->beta->error->puts。在这种情况下,angr可以对每条调用链都分别处理,但在实际程序中往往不可行,因此angr提供context_sensitivity_level参数用于设置在调用栈中保存的函数调用者caller的个数。举例说明,对于puts函数而言:

在这里插入图片描述

context_sensitivity_level=1:当从alpha调用puts时,puts函数便会返回到alpha;当从beta调用puts时,puts便会返回到beta;对应上面的例子,当从main1调用func时会返回到main1,从main2处调用func的话会返回到main2。

context_sensitivity_level=0:CFG仅仅表示当从puts函数返回时,会返回到alpha, beta, error这三个函数;对应上面的例子,不管从哪里调用func函数最终返回时会到任何调用func函数的下一基本块,即同时返回到main1和main2。

上面就是context_sensitivity_level的概念和应用场景分析,当然该值越大计算的CFG越准确,但这也会指数级地增加分析的时间,到底是要速度还是要精度就要具体情况具体分析了。

原博客地址:https://joyceqiqi.wordpress.com/2017/04/25/利用angr获取cfg/


http://chatgpt.dhexx.cn/article/tJHupELb.shtml

相关文章

Angr 内存符号化 05_angr_symbolic_memory

说明 通过查看下面的源码或IDA汇编&#xff0c;可知此例需要输入4个输入字符串&#xff0c;给每个输入字符串赋值给了user_input数组这块已经开辟的内存空间&#xff0c;我们可以监测user_input在内存中的值来获取最终的答案。 随机生成的源码 #include <stdio.h> #in…

Angr学习笔记

Angr学习笔记 前言 本文记录一下Angr的基本使用方法&#xff0c;主要是基于Github上的开源项目以及笔记AngrCTF_FITM整理&#xff0c;Angr在逆向方面确实用处比较大&#xff0c;特此记录一下。 什么是Angr angr是一个用于分析二进制文件的python框架。它专注于静态和符号分…

angr纠错和易错点

现在环境已经没有问题了。我运行了几个代码&#xff08;使用python3&#xff09;&#xff0c;都会出现不同的问题。 运行报错 解决方法&#xff1a; 添加b 运行报错&#xff1a; 解决方法&#xff1a; 删掉cast_to; 因为python2中str就是字节流 python3中不一样&#xff0c…

git本地分支管理

文章目录 一、master分支没有改变&#xff0c;合并其他分支二、master分支有改变&#xff0c;合并其他分支 作为开发人员&#xff0c;我们应该尽可能多地建立分支&#xff0c;在分支上进行开发&#xff0c;功能测试稳定后&#xff0c;再将分支上地代码合并到指定的分支 git bra…

Git 分支管理

Git 分支管理 一、主分支Master 首先&#xff0c;代码库应该有一个、且仅有一个主分支。所有提供给用户使用的正式版本&#xff0c;都在这个主分支上发布。 Git主分支的名字&#xff0c;默认叫做Master。它是自动建立的&#xff0c;版本库初始化以后&#xff0c;默认就是在主分…

git分支管理策略

git分支管理策略 1 总览 git 的分支整体预览图如下&#xff1a; 从上图可以看到主要包含下面几个分支&#xff1a; master&#xff1a;git默认主分支&#xff08;这里不作操作&#xff09;。 stable&#xff1a;稳定分支&#xff0c;替代master&#xff0c;主要用来版本发布。…

IDEA中使用Git功能和IDEA中的Git分支管理

IDEA中使用Git功能 IDEA中创建Git仓库 1、设置Git程序的路径 2、设置编译器的GitHub账号 3、新建项目 4、发布项目到GitHub IDEA向Git提交修改后的代码 1、实现git add 2、开始commit 3、实现git commit -m 4、实现git push origin master 项目成员使用IDEA的Git功…

【Git-10】Eclipse中Git分支管理

分支管理&#xff0c;是 Git 开发中的一个非常有效的团队开发策略。多个程序员并行开发&#xff0c;每个程序员可以定义各自的分支&#xff0c;在自己的分支上开发工程。再开发结束测试完毕后&#xff0c;再合并到主干工程中&#xff0c;一次性提交到远程。由其他程序员使用。 …

Git 分支管理最佳实践

Git 是目前最流行的源代码管理工具。大量的软件项目由 GitHub、Bitbucket 和 GitLab 这样的云服务平台或是私有的 Git 仓库来管理。在使用 Git 时通常会遇到的一个问题是采用何种分支管理实践&#xff0c;即如何管理仓库中作用不同的各类分支。和软件开发中的其他实践一样&…

Git分支管理办法,每个团队不一样,仅供参考!

原创不易&#xff0c;转载注明出处&#xff0c;喜欢就点个赞吧&#xff01; 网上有很多文章&#xff0c;很少有实际具体的流程图说明&#xff0c;我根据我们团队的情况&#xff0c;画了几张简图&#xff0c;仅供参考。 每个公司的代码管理方式都不一样 主要有两种 1.TrunkB…

Git分支管理与常用命令

一、分支管理 Git在创建分支仅是生成了一个指针又称快照&#xff08;有的工具则进行了物理拷贝&#xff09;&#xff0c;这样在使用起来就非常的方便。方便的同时问题随之而来&#xff0c;如果不加管理&#xff0c;那么就会到处开枝散叶&#xff0c;完全看不出主干。因此&…

复杂项目的版本管理及git分支管理建议

在复杂项目中&#xff0c;特别是多团队的快速迭代中&#xff0c;版本管理与分支管理&#xff0c;总是我们难以回避的问题&#xff0c;这里分享一下我们在团队中使用的规范&#xff0c;以及对应的每一步的步骤。 为什么需要GIT使用建议 团队开发中&#xff0c;遵循一个合理、清…

2022新版Git教程 从入门到实战(三)Git分支管理

&#x1f41f; 个人主页 &#xff1a;https://blog.csdn.net/qq_52007481⭐个人社区&#xff1a;【小鱼干爱编程】&#x1f4f0;最近专栏&#xff1a;Git教程专栏 文章目录 分支工作的工作流程Git分支管理分支的好处 前期准备查看分支分支创建分支转换在新分支中添加记录切换回…

Git 分支管理最佳实践(转载)

前言 Git 是目前最流行的源代码管理工具。大量的软件项目由 GitHub、Bitbucket 和 GitLab 这样的云服务平台或是私有的 Git 仓库来管理。在使用 Git 时通常会遇到的一个问题是采用何种分支管理实践&#xff0c;即如何管理仓库中作用不同的各类分支。和软件开发中的其他实践一样…

Git 分支管理策略汇总

原文链接&#xff1a; Git 分支管理策略 最近&#xff0c;团队新入职了一些小伙伴&#xff0c;在开发过程中&#xff0c;他们问我 Git 分支是如何管理的&#xff0c;以及应该怎么提交代码&#xff1f; 我大概说了一些规则&#xff0c;但仔细想来&#xff0c;好像也并没有形成…

Git分支管理

四、分支管理 分支的存在&#xff0c;极大的强化了不同开发者的协作管理&#xff0c;在一个功能的开发过程中&#xff0c;可以在一个单独的分支上完成&#xff0c;这样不影响主分支的开发&#xff0c;待功能完成后再将分支的内容合并到主分支。 每次提交到分支&#xff0c;Gi…

git的分支管理

这篇文章主要想讲一下git下的分支管理&#xff0c;因为分支管理是你在日常工作中必不可少的一项操作&#xff0c;觉得自己之前了解的不是很多&#xff0c;这次便决定利用一些细碎的时间好好去再次学习巩固一下&#xff0c;初衷也是为了加深自己的理解&#xff0c;便写下此文&am…

【Git】“分支” 如何管理和使用?这一篇就够了~

目录 一、什么是分支&#xff1f; 二、分支的操作 2.1、查看分支 2.2、创建分支 2.3、切换分支 和 修改分支 2.4、合并分支 2.4.1、正常合并 2.4.2、合并冲突 三、创建分支和切换分支的底层原理 一、什么是分支&#xff1f; 在版本控制中&#xff0c;我们可以针对每个任…

管理Git的分支

目录 一、本地分支&#xff08;local branches&#xff09;管理 1.1 查看和建立分支&#xff08; git branch&#xff09; 1.2 分支中提交的浏览与比较&#xff08;git log&#xff09; 1.3 切换当前分支&#xff08;git switch&#xff09;与合并分支&#xff08;git mer…

常用的git分支管理方法都在这了

一、分支管理定义 几乎每一种版本控制系统都以某种形式支持分支&#xff0c;一个分支代表一条独立的开发线&#xff0c;使用分支意味着你可以从开发主线上分离开来&#xff0c;然后在不影响主线的同时继续工作&#xff0c;Git 分支实际上是指向更改快照的指针。 其作用显然…