摘要: 如何利用GCC的插件功能,辅助安全分析人员实现对程序的安全审计、漏洞检测、安全加固等自动化处理能力,提升分析效率和精准度。

本文分享自华为云社区《利用GCC插件实现代码分析和安全审计》,作者:安全技术猿 。

GCC 4.5.0开始引入的一项插件功能,允许用户通过插件来干预GCC的编译过程,获取到GCC编译过程中的各种数据,甚至可以修改编译过程中生成的中间数据,从而达到修改最终生成的二进制文件行为的目的(注:特别需要注意的是GCC-Plugin的API是会随版本变化的)。此特性从程序员的角度来看,就相当于把原来GCC的黑盒编译过程一下子打开了,GCC编译的过程数据可以“大白于天下”,可以清清楚楚的看个够。

下图为GCC编译架构

GCC编译过程与插件的交互流程

注:图引自DragonEgg 在"Reimplementing llvm-gcc as a gcc plugin"

开源GCC插件列表

(来自https://gcc.gnu.org/wiki/plugins):

基于GCC此插件特性,从安全测试的角度来看,可以用它来干什么呢?

A、 可以把GCC编译过程的内部数据结构图形化,方便分析应用程序。

图形化对象可以是控制流图、函数调用图、支配图、Tree结构、Gimple结构、RTX结构、Pass列表等等。GCC VCG Plugin就是一个实现该功能的GCC插件(参考链接信息:http://code.google.com/p/gcc-vcg-plugin)。

下图是Gimple层次图:

B、 利用可以修改中间数据的能力,可以不用修改源代码就能添加新功能的功能,从而实现动态安全分析、安全加固的能力。

在安全测试中为了监控程序执行路径情况,需要通过动态插装来实现,常见的插装工具有Pin、Dynamo,但这些动态插装会对程序的运行性能产生影响,降低程序运行效率,严重的会导致程序不能正常运行。但如果能预先在目标程序中把插装代码编译进去,这样既兼顾到性能,有兼顾到实现插装的目的,一般要实现这个目的都是在源代码层面由开发人员增加插装代码,但增加的代码只是为了测试的目的,在实际发布版本中是不需要的,因此直接在源代码层面增加插装代码就给代码维护带来的不便,但如果我们应用GCC编译器的插件能力,在编译构建过程中自动添加插装代码到最终生成的二进制文件中,这样只需根据需要重新编译就能得到不同目的的应用程序而不需要修改任何一行源代码,既增加插装代码的动作对上层是透明的。

基于上述在编译过程中自动增加插装代码,可以实现对测试活动的度量和提升测试效率,比如测试时代码覆盖率的统计与度量,基于执行路径来优化测试用例提升fuzz效率等等功能。

总结:

利用GCC的插件功能,可以利用编译过程中的内部数据来帮助安全分析人员对程序进行安全分析和安全加固等事情,提升程序分析效率和分析精准度。

可以试试下面的漏扫服务,看看系统是否存在安全风险:>>>漏洞扫描服务

点击关注,第一时间了解华为云新鲜技术~

让数据大白于天下:GCC插件实现代码分析和安全审计的更多相关文章

  1. jQuery File Upload 插件 php代码分析

    jquery file upload php代码分析首先进入构造方法 __construct() 再进入 initialize()因为我是post方式传的数据  在进入initialize()中的po ...

  2. 使用 Gradle 插件进行代码分析(转)

    代码分析在大多数项目中通常是作为最后一个步骤(如果做了的话)完成的.其通常难以配置及与现有代码整合. 本文旨在勾勒出使用 Gradle 整合 PMD 与 FindBugs 的步骤,并将其与一个现有的 ...

  3. Eclipse插件(导出UML图,打开文件资源管理器插件,静态代码分析工具PMD,在eclipse上安装插件)

    目录 能够导出UML图的Eclipse插件 打开文件资源管理器插件 Java静态代码分析工具PMD 如何在eclipse上安装插件 JProfiler性能分析工具 从更新站点安装EclEmma 能够导 ...

  4. CNI bridge 插件实现代码分析

    对于每个CNI 插件在执行函数cmdAdd之前的操作是完全一样的,即从环境变量和标准输入内读取配置.这在http://www.cnblogs.com/YaoDD/p/6410725.html这篇博文里 ...

  5. POI 导入excel数据自己主动封装成model对象--代码分析

    上完代码后,对代码进行基本的分析: 1.主要使用反射api将数数据注入javabean对象 2.代码中的日志信息级别为debug级别 3.获取ExcelImport对象后须要调用init()方法初始化 ...

  6. Docker Libnetwork Bridge插件实现代码分析----创建网络部分

    // drivers/bridge/bridge.go // Create a new network using bridge plugin 1.func (d *driver) CreateNet ...

  7. Docker Libnetwork Bridge插件实现代码分析----初始化部分

    Bridge driver数据结构如下所示: type driver struct { config *configuration network *bridgeNetwork natChain *i ...

  8. GCC 嵌入汇编代码

    The format of basic inline assembly is very much straight forward. Its basic form is 基本汇编嵌入格式如下: asm ...

  9. 用 Eclipse 插件提高代码质量

    如果能在构建代码前发现代码中潜在的问题会怎么样呢?很有趣的是,Eclipse 插件中就有这样的工具,比如 JDepend 和 CheckStyle,它们能帮您在软件问题暴露前发现这些问题.在 让开发自 ...

  10. GEF入门实例_总结_04_Eclipse插件启动流程分析

    一.前言 本文承接上一节:GEF入门实例_总结_03_显示菜单和工具栏 注意到app目录下的6个类文件. 这6个文件对RCP应用程序而言非常重要,可能我们现在对这几个文件的理解还是云里雾里,这一节我们 ...

随机推荐

  1. [论文研读]空天地一体化(SAGIN)的网络安全_A_Survey_on_Space-Air-Ground-Sea_Integrated_Network_Security_in_6G

    ------------恢复内容开始------------ 空天地一体化(SAGIN)的网络安全 目前关注的方面: 集中在安全通信.入侵检测.侧通道攻击.GPS欺骗攻击.网络窃听.消息修改/注入等方 ...

  2. windows上时间项目时间正常,Ubuntu16.04上时间错误

    项目本次测试时间正常,放到服务器上时间差8个小时 1.查看Ubuntu系统时间,发现时间设置错误 date -R 该命令会把我们系统的时间还有时区显示出来,我们是属于东八区,如下图: 如果不是 +08 ...

  3. go中的内存逃逸

    内存逃逸(memory escape)是指在编写 Go 代码时,某些变量或数据的生命周期超出了其原始作用域的情况.当变量逃逸到函数外部或持续存在于堆上时,会导致内存分配的开销,从而对程序的性能产生负面 ...

  4. 题解 CF742B

    题目大意: 给定 \(n\) 个数,找数对使其异或值为 \(k\),求满足这样数对的个数. 题目分析: 考验位运算功底的题目(实际上也不是很难),主要运用到了下列性质: \[\begin{aligne ...

  5. Go笔记(3)-3种go语言的键盘输入详解

    go语言的键盘输入详解 go语言中有三种输入函数,分别是: fmt.Scanf() 可以按照指定的格式进行输入 fmt.Scanln() 通过指针将值赋值给变量 fmt.Scan() (1)fmt.S ...

  6. 离散傅里叶变换DFT的应用

    目录 一维DFT 1 DFT的相关内容 2 DFT计算结果验证 3 DFT的时频曲线分析 4 DFT的应用 二维DFT 1 DFT在图像处理时的相关内容 2 DFT滤波应用 一维DFT 1 DFT的相 ...

  7. javascript+php 实现blob加密视频(html video)

    1.mp4地址加密为blob链接在html5的video标签展示 PHP: 1 $file_path = "...mp4"; //视频文件地址 2 ob_end_clean(); ...

  8. 吉特日化MES & 再谈原料标签

    在前面之前提到的标签的选择和设计,原料标签可以做到如下几点:     1 原料标签是一物一码还是一码多物:在美妆类的原料建议原料标签采用一物一码,对于大液洗之类的产品原料如果能够做到一物一码最佳,但是 ...

  9. 【开源项目推荐】-支持GPT的智能数据库客户端与报表工具——Chat2DB

    2023年是人工智能爆火的一年,ChatGPT为首的一系列的大模型的出现,让生成式人工智能彻底火了一把.但有人会说,GPT对于我们数据开发来说并没有什么作用啊? 今天为大家推荐的开源项目,就是GPT在 ...

  10. Kubernetes: client-go 源码剖析(一)

    0. 前言 在看 kube-scheduler 组件的过程中遇到了 kube-scheduler 对于 client-go 的调用,泛泛的理解调用过程总有种隔靴搔痒的感觉,于是调转头先把 client ...