静态程序分析学习心得 tai-e

news2024/7/6 20:14:32

0x00 前言

经过将近2个月的时间,看完了b站上南大的静态程序分析课程,并且完成了其oj上的作业,在这里记录一下在做题过程中,遇到的一些坑点,文章不会贴源码,只记录一下思路,因此大家可以放心阅读。
在这里插入图片描述
PS:注册oj的邮箱是向读研的同学借的。

0x01 活跃变量分析和迭代求解器

第一题可以算作一道让学生来熟悉tai-e平台的签到题,因为具体实现算法在课程中已经讲到了,所以只需要按照作业中的提示,完成每个函数就行了。但是对于很久没做过java开发的同学来说,在实现transferNode方法的时候,可能会犯下面的低级错误:
计算OUT[B] - def[B]的值时,直接调用了out.remove(def)方法,这时虽然IN的值算出来了,但是OUT的值却被修改了,因此在最开始,需要使用out.copy()方法拷贝一份out的值,然后调用拷贝对象的remove(def)方法就可以了。

0x02 常量传播和 Worklist 求解器

这一题是分析整数类型的常量传播,题目对要程序要分析的范围划分也很明确,因此在实现transferNode方法时,仅分析DefinitionStmt语句就可以了。这道题应该是我花费时间最多的一道题,一度因为一个测试用例而WA,直到考虑了下面这个条件才AC:
对于除以 0 的情况(出现在 / 和 % 中),无论被除数是NAC,还是其他什么值,他的结果都应该是 UNDEF。

0x03 死代码检测

做这道题时,比较难处理的是SwitchStmt,因此我们需要先去了解switch语法在IR和cfg中的表现形式,相信有了前两道题的经验,大家应该也知道了IR文件都在sootOutput文件夹下,cfg会被输出到output文件夹下,后缀是.dot,需要借助Graphviz工具,使用 dot -Tpng xxx.dot -O 命令即可将.dot文件转换为png来查看,但前提是需要把pascal.taie.analysis.Tests#DUMP_CFG这个属性设置为true。相信大家借助cfg图,就会有处理SwitchStmt的思路了。

0x04 类层次结构分析与过程间常量传播

这道题实现起来比较简单的是实现类层次结构分析,比较难的是实现过程间常量传播。但最后发现,过程间常量传播只是需要花点精力来处理那4种类型的边,只要把算法设计出来,测试用例可以一把过,反而oj上的类层次结构分析的测试用例,却一直没通过,后来通过查看tai-e提供的api,最终是AC了,情况是这样的:

1、开始我没注意到DefaultCallGraph类有addReachableMethod方法,但是我注意到了他有reachableMethods这个属性,因此我就用这个属性保存了我找到的reachableMethod,然后通过遍历这个方法里所有的stmt,来获取所有的callSite,最终实现了整个算法,我手动实现的这个算法的结果肯定是没问题的,要不常量传播的测试用例不可能通过。但是在oj上,我所有的类层次结构分析的测试用例都没通过。
2、后来我改用了addReachableMethod方法来保存reachableMethod,跟进这个方法我发现他的实现跟我一样,而且他顺带也保存了方法里所有的callSite,所有直接用callGraph.callSitesIn(m)方法就可以获取m方法中所有的callSite,用这个方法最终通过了oj上所有测试用例。

0x05 指针分析

无论是非上下文敏感的指针分析,还是上下文敏感的指针分析,课程中讲的都非常清晰,因此只要把课程完整跟下来,充分理解了具体的算法,基本上都可以一次性AC,这里也没啥坑点,就不多说了。

0x06 Alias-Aware 的过程间常量传播

同上,这道题只要把作业中的描述都理解了,理解了什么是别名,然后按照作业的指引,正确处理LoadField、LoadArray、StoreField、StoreArray这4种stmt就可以了。
不过可以在initialize方法中提前保存一下每个变量的别名,以及所有静态的StoreField,和所有静态的LoadField,方便后面使用。当然这也不是必须的,也可以在后面需要这些信息的时候再实时计算,不过这种方式效率会很低。

0x07 污点分析

最后一个作业,花费了很长时间在算法设计上。
1、Sources规则比较好处理,在指针分析里合适的地方插进去就行了。
2、TaintTransfers规则同样也是需要在指针分析里合适的地方进行处理。但是这里处理的结果该怎么保存呢?这里想了很久,最终想到需要用一个图来建立污点传播的关系。这个图的数据结构可以参考PointerFlowGraph。基于污点流图,就可以在指针流图上进行污点传播了。需要注意的是,在传播污点数据时,只传播污点对象就行了,不要把普通的指针分析的对象也给传播了。
3、根据作业中给的提示,可以在collectTaintFlows()方法中实现处理 Sinks的规则。这时遍历程序所有callSite即可。当然也可以提供一个方法,用来保存所有符合Sink规则的callSite,然后插在指针分析的合适的位置,最后遍历这些callSite就行了,这样可能更高效些。

0x08 总结

这个作业几乎占用了我这两个月所有的周末,以及五一假期,不过功夫不负有心人,最终还是通关了。终究是有收获的,对静态程序分析的原理有了更深入的了解,总之继续加油吧,网安的路上,需要学习的还有很多!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/544163.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

aac怎么转化为mp3?4个超简易转换方法推荐给大家!

aac怎么转化为mp3?音乐是人类灵魂的表达,只有懂得欣赏音乐的人才能领略到生活的美好与价值。除了运动、看电影等,聆听音乐也是小伙伴们调剂生活的一个好方式。很多小伙伴都有在网上下载音乐的习惯,通过我们也都知道音乐的格式种类…

Linux系统编程——多线程[下]:生产消费模型信号量线程池

0.关注博主有更多知识 操作系统入门知识合集 目录 1.生产者消费者模型 1.1基于阻塞队列的生产者消费者模型 1.2生产消费模型的效率问题 2.信号量 2.1信号量 2.2基于环形队列的生产者消费者模型 2.3环形队列的生产消费模型的效率问题 3.线程池 3.1线程池的实现 1.生…

javaIO流之转换流

目录 简介一、编码和解码二、字符集2.1ASCII 字符集2.2Unicode 字符集2.3GBK 字符集 三、乱码四、InputStreamReader4.1构造方法4.2解决编码问题 五、OutputStreamWriter六、小结 简介 转换流可以将一个字节流包装成字符流,或者将一个字符流包装成字节流。这种转换…

Ajax、Promise、Axios前端三剑客

文章目录 🐳前言关系二维表: 🐳Ajax定义:特点:🐡核心对象XMLHttpRequest:XMLHttpRequest对象的五种状态: 使用:1.Jquery的ajax:2.Vue的ajax: &…

【C#】GridControl增加选择列(不用二次点击)

系列文章 【C#】单号生成器(编号规则、固定字符、流水号、产生业务单号) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器(开始日期、结束日期) 本文链接:h…

【FMC156】基于VITA57.1标准的2路2.5GSPS采样率16位分辨率直流耦合DA播放FMC子卡模块(DAC38J82)

产品概述 FMC156 是一款基于VITA57.1 标准规范,实现2 路2.5GSPS 采样率16 位分辨率直流耦合DAC 播放子卡模块。该模块遵循VITA57.1 标准,可直接与FPGA 载卡配合使用,板卡DAC 器件采用TI 公司的DAC38J82 芯片,该芯片提供4 个模拟输…

2023,有哪些适合网工跳槽的好公司?(不是BAT)

大家好啊,我的网工朋友 都说行业内卷,卷的不成人形,这内卷,一卷就卷了好几年。 很多网工同行都讨厌被卷来卷去,但是看到同行进了大厂,免不了还是要羡慕嫉妒恨一波。 作为主编几年,我就发现了…

注册ChatGPT时提示Oops! The email you provided is not supported

问题描述 今天本想出一个ChatGPT的注册与使用的教程,结果上来吃了个闭门羹。之前我通过微软账号登录验证是没有问题的,但这次想使用另一个微软账号,结果提示Oops! The email you provided is not supported(您提供的电子邮件不支…

C# 给winfrom窗体添加皮肤控件

如何快速给C# winform添加好看的皮肤C# Winform中窗体的美化 SkinEngine的应用 皮肤控件换肤素材包,IrisSkin2.dll皮肤素材资源下载 压缩包内一共有22种皮肤素材,使用说明:把控件拖到你的form上,只需一行代码,即可实…

Ubuntu安装时没注册root用户密码,怎么登录root

一、Ubuntu设置root密码: 1.桌面空白处右键菜单 点击“打开终端“。 2.输入命令 "sudo passwd root

Cinema 4d 和 3ds Max:哪个软件更好?

3D 设计有很多挑战。设计师通常需要克服他们的看法和偏见,此外还要学习一些深入的程序来有效地使用 3D 风格的软件系统。市场上有很多用于3D设计的软件,因此对于哪一种对您的需求最有效会令人困惑。如果您不熟悉3D,或者您正在四处寻找新的软件…

数据进行分组后同一字段字符串连接方法

数据源如下:期望将同一个id_supplier_basic_info输出的supplier_type写在一行上,可以按‘/’分隔 一开始的时候使用的是但是一直提示找不到这个函数,一时陷入迷惑,难道是mysql不支持这个函数?但是百度明明都说mysql是支…

Mss32.dll丢失怎么办?怎么修复Mss32.dll文件

Mss32.dll丢失怎么办?如果你打开游戏或者应用程序时出现了如下错误提示:“找不到Mss32.dll”,那么你就需要解决这个问题。 Mss32.dll是一个动态链接库文件,它通常用于多媒体应用程序和游戏中的音频功能。如果该文件丢失或损坏&…

谷歌seo怎么做?2023做好谷歌seo的7个关键点

谷歌seo怎么做? 谷歌搜索引擎优化(SEO)是一系列的技术和策略,旨在通过改进网站结构、内容和其他因素,提高网站在搜索引擎结果页面(SERP)中的排名和可见性。以下是一些常用的谷歌SEO技术和策略&…

C语言——指针初阶

哈喽,大家好,今天我们来学习C语言中的指针,今天主要学习初阶指针,后期我们将继续学习指针进阶。 目录 1. 指针是什么 2. 指针和指针类型 2.1 指针-整数 2.2 指针的解引用 3. 野指针 3.1 野指针成因 3.2 如何规避野指针 4.…

苹果浏览器safari打不开网页怎么办?参考方法在这!

案例:为啥苹果自带的浏览器打不开网页?输入名称或者网址,打开的网页都是空白的。 【不知道怎么回事,我在safari浏览器里面输入网址,但是打不开正确的网页,一直打开的是空白网页。】 当您使用苹果自带的浏览…

构件连接器

构件连接器 1.构件连接器是什么 构件之间传递信息的器件称为构件连接器,简称为连接器。connector。 构件连接器就是在构件之间进行信息传递的通道,可以通过该通道实现信息由一个构件的端口传递 给另一个构件的端口或者是接口。 2.常见的连接器关系 委…

Python-PyEcharts绘制柱状图

更多优秀文章,请关注个人微信公众号: 程序猿小杨 Python-PyEcharts绘制柱状图 一、简介 核心创建流程: 1.通过Bar()构建一个柱状图对象 2.和折线图一样,通过add xaxis()和add_yaxis()添加x和y轴数据 3.通过柱状图对象的&#x…

Talk预告 | 香港中文大学博士生徐英豪:从不规则的单目图片数据构建3D生成模型

本期为TechBeat人工智能社区第498期线上Talk! 北京时间5月18日(周四)20:00,香港中文大学博士生 — 徐英豪的Talk将准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “从不规则的单目图片数据构建3D生成模型”,届时将介绍…

ipa怎么装到苹果手机

下面介绍ipa怎么装到苹果手机? 方法/步骤 进入手机上的设置,如下图所示: 在设置页面中,点击进入通用,如下图所示: 进入通用页面后,点击页面上的描述文件,如下图所示: …