逆向工程师探寻软件代码深处的奥秘,而我们同样关心逆向工程师的内心,今天的论文推荐给大家介绍一篇研究逆向工程师内心的软安全论文:
来自EURECOM和Cicso Tales(对,就是那个弃医从文离开学术界加入工业界并写了一堆感想的Yanick)的研究人员搭建了一个平台,邀请了72位逆向工程师(作者是想要凑齐三十六天罡七十二地煞吗?)在上面进行了272小时的二进制代码分析,然后统计了相关行为,用这些数据来回答如下问题:
-
逆向专家和新手有哪些区别?
-
逆向专家和新手进行二进制代码分析分别有什么策略?
-
这些策略和二进制代码的关键要素(函数、基本块)之间有什么关联?
-
哪些策略能帮助逆向工程师更好地分析二进制代码?
最初作者在设计实验的时候,考虑过使用类似眼球追踪的装置去分析逆向工程师在分析过程中的关注焦点,但是发现这样不太现实。于是最后作者设计了如下图所示的一个平台,在工程师使用该平台的过程中,自动化记录这个分析者聚焦在哪个基本块。类似一些游戏中对地图的mask策略,该平台也会在使用中将一些未探索的部分先雾化,当使用者去点开被遮盖的部分的时候,平台就会自动记录你的“探索过程”,是不是很有趣!
作者用了两个CTF初级逆向难度的程序来测试分析者,具体的复杂度为:
作者招募了很多参与过CTF竞赛的RE选手和一些了解过二进制代码逆向分析的学生来做测试,经过测试,将七十二地煞72名测试者分为了专家组和新手组,并且发现参加过CTF竞赛的RE选手都进入了专家组(废话)
在第一题(下图所示的CFG,是不是很简单)测试中,作者追踪了三名测试者的表现
在下图中,前面两部分数据来自整个测试者中表现最好的选手,而第三部分数据是一个新手的表现。统计数据表明,第一名选手从main函数开始分析,而第二名选手从target函数开始分析,结果第一名选手多花了5分钟检查了一些useless的代码,而第二名选手只用了4分钟就理清了思路(虽然好像第二名选手查看基本块更为频繁)。相比之下,新手的分析比较无序,在不同的基本块之间反复切换,看了许多次最终才搞清楚思路。
从下面的数据可视化热图中,我们可以清楚地观察到逆向过程中大家对哪些基本块更为关心:
更进一步,作者分析了逆向工程师们对代码理解策略的使用,给出了如下的数据统计:
经过了一个大型的类似语文考试阅读理解测试的过程后,作者总结了逆向工程师的特点。首先,作者政治正确地表达了每个人都是unique的观点,然后才总结了一些规律:
逆向专家通常不会线性地从main函数,由前往后分析,而是前前后后反复阅读;
逆向专家看过一个基本块通常就能搞清楚里面的内容,然后就不再反复回头去检查了;
逆向专家的经验可以帮助他们快速略过一些(凭经验就知道)不需要分析的代码片段,提高分析速度;
逆向专家的分析时间和代码行数并不是线性相关的,更多的代码并不意味着需要更多的分析开销(狡猾的人类)
作者最后给大家提供了他们使用的在线逆向框架:
https://github.com/elManto/REmind
论文PDF:
https://simoneaonzo.it/assets/pdf/RE-Mind_a_First_Look_Inside_the_Mind_of_a_Reverse_Engineer.pdf
原文始发于微信公众号(安全研究GoSSIP):G.O.S.S.I.P 学术论文推荐2021-11-04