前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >编译原理在安全领域的应用

编译原理在安全领域的应用

作者头像
泉哥
发布于 2019-07-18 09:28:19
发布于 2019-07-18 09:28:19
1.8K0
举报
文章被收录于专栏:漏洞战争漏洞战争

什么是编译原理

上图是我从《编译系统透视:图解编译原理》里面扣出来的,基本包括编译原理的各个主要方面,从中可以对编译原理有个大体认识。

专业点来讲,编译原理就是介绍编译程序构造的一般原理和基本方法,内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。

之前在知乎上看到过一份视频,讲的是程序员编写的代码如何被计算机识别,并在CPU上运行,如果你未曾学习编译原理,推荐观看一下(视频时长11:34)。

135编辑器

每个信安学生总有一份叫“污点分析”的毕业设计

污点分析是指将程序从外部获取的数据标记为污点,然后观察污点在程序执行过程中的传播,从而得到程序中的信息流等信息,里面涉及编译原理中的词法语法分析会多一些,主要被应用于恶意软件分析、攻击代码检测等软件安全性分析研究中。

记得刚参加工作那会,经常到网上搜索安全论文,发现很多信息安全专业的学生大多有做过一份关于“污点分析”的毕业设计,你现在上CNKI就可以搜索到很多,尤以硕士毕业论文居多。

当时我几乎翻遍网上所有能找到的“污点分析”论文,最后我得出几点结论:

  1. 不求效果,但求理论高深。之前搞flash xss检测,花了几天时间用一堆grep实现的检测工具,挖不了不到大厂的漏洞,包括淘宝、京东这些电商;但也有同学花几个月搞flash actionscript污点分析,虽然有点作用,但从工作效率和结果看,有时高深的理论不见得适合工业界,虽然我的几行grep没法拿来写论文。
  2. 千篇一律,天下文章一大抄。下载了一堆同主题方向的论文,发现有的内容改都没改,互相乱抄。
  3. 以漏洞挖掘的主题居多,但最后总要以挖洞效果结尾,有0day自然最好,没0day就找几个历史漏洞重现下(很多可能是特例化处理的),没历史漏洞就对比几个主流开源的挖洞工具,对比效率、性能等等,最挫的就是连效果都没有就收尾了。

有过此般经历后,我已很少再去翻国内的安全论文了,学术论文可能还是以翻阅国外的为主。

成熟的技术 成熟的产品

污点分析技术最早是在1976被提出的,2005年左右开始,污点分析应用于二进制漏洞挖掘的研究火了好多年,其实技术已经相对成熟。

确实有一些人通过污点分析挖掘到不少有价值的主流软件漏洞,但这项技术要落地为一款安全产品还是有很多问题的。

首要问题就是误报率,之前有同学开发出基于污点分析的源码审计工具,每次外部报告漏洞的时候,复盘时总说能检测出来,只是没人工跟进。但是,检测出来的有成千上万条告警,需要消耗大量人力去排查这又有什么价值呢,本质上,还是没发现嘛!

这也算是安全运营的问题,深以为,凡是能检测到,但无法人工或自动跟进推动问题解决的,都是徒劳的。

相信有很多公司都有出过污点分析的安全审计工具,收费的或者开源的,国内的此类安全产品很多最后都不了了之,所以说成熟的技术不等于成熟的产品。

国外比较著名的商业源码审计工具就是Coverity和Fortify SCA,算做得最好的业界同款产品,但用过的人都知道,检测出来的问题,还是需要投入很多人工成本的。

反编译与加固

搞逆向的同学都知道IDA、JEB这些著名的逆向工具,平时在无源码的情况下,我们直接通过它们来分析程序逻辑,无需知晓其中涉及各类反编译技术。

反编译算是编译的逆过程,即将可执行程序转换成程序源码的过程,如果是转换成汇编语言,我们通常称为反汇编;如果是其它语言的(比如C、Java、C#等等),我们统称为反编译。

不同语言的编译过程还不一样,比如Java是通过JVM虚拟机将字节码转换成CPU认识的指令,而C是直接由编译器转换机器码供CPU执行的,因此它们的反编译过程也不一样。

所以如果不懂编译原理,又如何开发反编译工具呢?

有了反编译,自然就有了防反编译的工具,因此造就了各种加壳工具的出现。

未知攻,焉知防。要开发加固工具,就需要知道反编译原理,要知道反编译原理,又需要知道编译原理。

编译原理 <---> 反编译原理 <---> 加固原理

编译原理在漏洞攻防中的应用

搞文件Fuzzing,我们可以在样本(收集、筛选、精简)和Fuzzer(策略、方向等)上面下功夫,甚至简单地暴力fuzzing文件都可以挖到漏洞。

但对于JavaScript、CSS、Flash ActionScript这些脚本呢,直接简单地暴力变异文件根本无法进入正常的解析,做的大多是无用功。

因此我们需要一个能够准确生成代码的语法生成器,再用它生成fuzzing样本,这里主要涉及编译原理中的语法分析。这方面有著名的开源工具funfuzz(https://github.com/MozillaSecurity/funfuzz)、domato(https://github.com/google/domato),下图就domato生成js代码的语法模板片段:

除此之外,通过对clang/gcc等开源的编译工具对目标源码进行插桩,以帮助监控fuzz样本的代码覆盖率,反馈给fuzzer作改进,以进一步提高代码覆盖率,这块叫“驱动反馈(feedback-driven),比如著名工具就是afl、libfuzzer、honggfuzz,以后有机会可以专篇讲解此技术。

还有通过编译器增加防漏洞利用的机制,比如GS、CFG等安全机制,在对抗漏洞攻击上也起到了不小的作用。

所以通过研究llvm、gcc等编译项目,对漏洞攻防领域也是有一些可作为的地方。

总结

编译原理在逆向工程、漏洞攻防、软件开发等诸多领域有所应用,有时就看你怎么使用,也并不是每个人在安全工作领域中有机会运用到,但技多不压身,不妨多储备点知识,以免到了“书到用时方恨少”的地步。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 漏洞战争 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
从“能用就行”到“适度解耦”:业务驱动的架构转型策略
在业务阶段的划分中,业务发展通常经历探索期、成长期和成熟期三个阶段。在探索期,业务处于起步阶段,目标是快速验证市场假设并获取用户反馈,因此对开发速度要求极高,通常采用单体架构进行快速开发;进入成长期后,业务逐渐获得市场认可,用户量和业务量快速增长,此时系统的扩展性和稳定性成为关键问题;到了成熟期,业务进入稳定发展阶段,用户需求趋于稳定,系统则需要支持大规模并发和高效运维。
三掌柜
2025/05/08
1280
从“能用就行”到“适度解耦”:业务驱动的架构转型策略
🌍从 MVC 到微服务:架构演化的历程与应用场景(含代码演示)
这里推荐一篇实用的文章:《功能上线后,系统崩了!我怎么把它救回来的?》,作者:【喵手】。
bug菌
2024/11/30
2340
🌍从 MVC 到微服务:架构演化的历程与应用场景(含代码演示)
代码审查对团队协作的影响:沟通、信任与效率的平衡相处!
代码审查是软件开发中不可或缺的一环,其目的不仅是保证代码质量,还在于促进团队间的合作和学习。然而,代码审查也可能成为双刃剑:
bug菌
2025/01/22
1370
代码审查对团队协作的影响:沟通、信任与效率的平衡相处!
新技术学习中的时间管理:如何高效安排学习和工作?
在现代快节奏的工作环境中,如何高效地安排学习时间,尤其是在学习新技术的过程中,已经成为了许多人面临的挑战。忙碌的工作、无尽的任务和琐事可能让你感到无法腾出时间来提升自己,尤其是当你有很多新技能要掌握时,常常感觉一切都成了拖延症的源头。但其实,只要合理管理时间,不仅可以避免这些任务的干扰,还能确保自己在持续学习的同时,不会感到压力山大。
bug菌
2025/03/25
1710
新技术学习中的时间管理:如何高效安排学习和工作?
🔄从头到尾的重构之旅:代码重生的幕后故事!
你有没有过这样一个时刻——项目初期迫于时间压力,代码匆忙上线,功能跑通了,但维护起来就像在迷宫里摸索?每次修改,代码都成了一个庞大的怪物,稍不小心就会引发连锁反应。代码的清晰度、可扩展性、可维护性都逐渐消失,取而代之的是一个个千头万绪的 bug 和无尽的后续修改任务。
bug菌
2024/12/18
1160
🔄从头到尾的重构之旅:代码重生的幕后故事!
自动化部署工具的选择与使用!
在现代软件开发中,自动化部署已经成为开发团队提高效率和确保代码质量的必备利器。无论是在持续集成(CI)/持续交付(CD)的流程中,还是在日常的代码更新和发布中,自动化部署都起到了至关重要的作用。那么,面对市面上众多的自动化部署工具,如何选择一个最适合自己团队的工具呢?这是很多开发者和团队负责人都曾遇到过的问题。
bug菌
2025/02/08
3070
2023最新首发,全网最全 Spring Boot 学习宝典(附思维导图)
网络上关于Spring Boot杂而不精,很难系统化、全面地了解Spring Boot。如果想要对最新的技术要点进行系统的梳理、解读及应用, 推荐你看《滚雪球学Spring Boot》
bug菌
2023/08/15
2.9K0
2023最新首发,全网最全 Spring Boot 学习宝典(附思维导图)
架构设计中的性能优化与可扩展性:如何找到平衡点?
这里先给大家推荐一篇实用的好文章:《从小改动到系统崩溃:一场“蝴蝶效应”般的Debug惊魂记!》 来自作者:bug菌
喵手
2024/12/02
3090
架构设计中的性能优化与可扩展性:如何找到平衡点?
选择合适的开发工具:工具选型对开发成本的影响!
在软件开发的世界里,选择合适的开发工具、框架和平台,不仅会影响你的开发效率,还可能决定项目的长期维护成本。就像我们选择一辆车来出行,工具的选择直接影响我们能走多远、走得有多顺畅。所以,今天我们就来聊聊,如何通过合理的工具选型来提高开发效率,同时又不至于让你的开发预算“翻车”!🛠️
bug菌
2025/03/11
1370
选择合适的开发工具:工具选型对开发成本的影响!
CI/CD工具优化实战:从“小白”到“老司机”的进阶之路!
想象一下,你正处在一个开发团队中,产品上线的频率越来越高,需求变得越来越复杂,每个团队成员的手里都有几百个任务,而你作为技术负责人,发现,传统的手动部署和测试流程已经不堪重负,效率低下、出错频繁,甚至连团队成员的情绪都在崩溃边缘徘徊。
bug菌
2024/12/13
1950
CI/CD工具优化实战:从“小白”到“老司机”的进阶之路!
深入解读 eBPF:零侵扰性能追踪与 Java I/O 优化
咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~
bug菌
2025/01/15
3110
深入解读 eBPF:零侵扰性能追踪与 Java I/O 优化
🏗️ 架构设计中的性能优化与可扩展性:如何找到平衡点? ⚖️
这里推荐一篇实用的文章:《CQRS 与 Event Sourcing:如何高效处理复杂业务场景!》,作者:【喵手】。
bug菌
2024/12/02
2590
🏗️ 架构设计中的性能优化与可扩展性:如何找到平衡点? ⚖️
快速上线又不想返工?教你搞定“验证 + 演进”的技术策略
很多团队在开发新项目时常遇到这个矛盾:一方面想快速上线验证市场,另一方面又怕架构太“简陋”后期没法扩展。怎么平衡“先试试”与“别瞎搞”?这篇文章就来聊聊,如何从最小可行架构(MVA)起步,配合 PoC(Proof of Concept)验证,再一步步演进到稳定可维护的大系统。
Swift社区
2025/05/15
650
快速上线又不想返工?教你搞定“验证 + 演进”的技术策略
👨‍💻快速搭建SpringBoot3 + Prometheus + Grafana
咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~
bug菌
2024/12/26
2330
👨‍💻快速搭建SpringBoot3 + Prometheus + Grafana
什么才是真正的架构设计?
在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解。此君说的架构和彼君理解的架构未必是一回事。因此我们在讨论架构之前,我们先讨论架构的概念定义,概念是人认识这个世界的基础,并用来沟通的手段,如果对架构概念理解不一样,那沟通起来自然不顺畅。
xcbeyond
2020/03/25
1.3K0
什么才是真正的架构设计?
分布式系统到底该“牺牲”谁?CAP定理的血泪抉择你真的懂了吗?
朋友们,不知道你有没有这种感觉:刚学分布式的时候,脑袋里总有个声音:“这东西,咋比谈恋爱还难搞?”
bug菌
2025/06/18
200
分布式系统到底该“牺牲”谁?CAP定理的血泪抉择你真的懂了吗?
Spring Cloud简单集成RabbitMQ:详解与实战案例
咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~
bug菌
2025/01/03
3280
Spring Cloud简单集成RabbitMQ:详解与实战案例
技术团队的自主权有多重要?
团队自主权是指团队在无需获得其他团队批准的情况下进行决策和采取行动的能力。让我们首先看看为什么团队自主权对于快速、频繁和可靠的软件交付很重要。然后看看如何实现它。
JavaEdge
2024/05/25
1090
技术团队的自主权有多重要?
🔍CQRS 与 Event Sourcing:如何高效处理复杂业务场景
这里推荐一篇实用的文章:《功能上线后,系统崩了!我怎么把它救回来的?》,作者:【喵手】。
bug菌
2024/12/01
2780
🔍CQRS 与 Event Sourcing:如何高效处理复杂业务场景
从抽象地狱逃出来:一段 Python 代码看清“过度设计”的代价
你可能见过这样的项目:刚起步就整上微服务框架、Kafka 消息中间件一把梭,再加上好几层抽象工厂 + 策略模式。等上线后才发现,系统只有两三个接口,压根没人用。
连连LL
2025/05/06
760
从抽象地狱逃出来:一段 Python 代码看清“过度设计”的代价
推荐阅读
相关推荐
从“能用就行”到“适度解耦”:业务驱动的架构转型策略
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档