首页 » 漏洞 » 独家连载 | 零日漏洞:震网病毒全揭秘(23)

独家连载 | 零日漏洞:震网病毒全揭秘(23)

 

640.webp

最终,他确认了自己之前的怀疑,震网的确绑架了西门子这个核心.DLL文件,用假冒.DLL文件实现了劫持……

第八章 载荷(接上)

640.webp (31)

尼古拉斯•法里尔

法里尔长着一头黑发和高卢人的面庞,看上去更像一个在巴黎某个夜店驻场的摇滚乐DJ,不像是每天坐地铁通勤去公司读代码的技术宅男。而在生活中,他害羞话又少,比起去夜店嗨个通宵,他还是更愿意坐在电脑前,一行行检视密密麻麻的程序代码。

法里尔是个熟练的逆向工程师,特别擅长对恶意代码做深度分析。逆向工程是一种常人难以企及的艺术,主要内容是,取出一段由0和1组成的二进制机器代码,并把它翻译成人类可以看懂的程序语言。这项工作需要高度集中的注意力和高超的编码技巧,对震网这么复杂的代码来说更是如此。但法里尔就好这口。代码越复杂,把它破掉的时候就越开心。

法里尔十几岁的时候,经常玩一个叫做crackme(破解我)的代码游戏,是程序员们为相互测试逆向工程水平而设计的。游戏规则是:程序员甲在一个小程序外面加了一层加密外壳,制成一个crackme文件,然后把它发到网上。程序员乙必须破掉加密和其他安全机制,挖出藏在里面的“小纸条”,再把这个“小纸条”作为成功破解的证据发给甲。法里尔逆向工程的技术底子正是在那时打下的。从某种意义上看,病毒和蠕虫不过是更加复杂、破解难度更高的crackme文件而已。对于法里尔来说,玩游戏和破解病毒之间的唯一区别就是,前者只是好玩,而后者能赚钱。

法里尔在法国南部的图卢兹出生、长大,那里是空客公司总部所在地,还有一家卫星技术研究中心。在这样一个工程师和航空文化占主导的地区,法里尔从小就对科技感兴趣丝毫不足为奇。不过,早期给他更多影响的,是机械技术。他父亲是一名拥有并运营自己车库的汽车机械师。法里尔上高中的时候,才开始接触计算机,为他打开了另一扇门。他考取了法国国家应用科学学院的计算机科学专业。2001年,他赶上了红色代码病毒大爆发,造成超过70万台计算机被感染。这让他对计算机安全产生了浓厚的兴趣。在本科阶段,他曾在法国的一份小型技术杂志上发表过多篇文章,还有一篇上了赛门铁克公司旗下的安全焦点网(Security Focus)。在2005年底、攻读计算机科学硕士学位时,他被告知,要有一份6个月的实习经历才能申请学位。这时,他与安全焦点网取得了联系,网站又把他介绍给钱哥。法里尔运气实在是太好了。这时,赛门铁克都柏林公司正在广发英雄帖,而钱哥最缺的就是有经验的逆向工程师。钱哥告诉法里尔,不需要什么6个月的实习了,我给你一份全职工作。“你打算给自己开价多少?”

“我不要钱,”法里尔说,“我只要实习。”

“小子,你疯了吧?”钱哥说,“我会给你发个offer邮件的,等着吧。”

几周后,法里尔去了都柏林。他很快适应了新的生活。但经过了和女友两年“打飞的”式的异地恋之后,他提出,想去巴黎的赛门铁克市场营销分部。结果,他到了巴黎之后,发现自己是那里唯一一个搞技术的。这让他时常感到格格不入,但同时也让他把更多的精力放在自己的工作上。

他和另外两名同事共用一间办公室。在他的办公桌上,有一台用于运行恶意代码的测试用台式机,旁边乱七八糟的放着一大堆技术论文和书籍,还有一台装有调试工具的笔记本,专门用于代码分析。桌上唯一一件个人物品是一个圆筒形的魔方,每当他遇到难题的时候,就把它拿起来玩两下。

640.webp (32)

虽然法里尔非常擅长逆向工程,但实际上在震网出现之前,他这身本事也没派上过多大用场。一直以来,他扮演的角色是赛门铁克的“工具大神”。他能制作各种程序和工具,让其他分析师能更高效的破解恶意代码。不知不觉中,他已经扮演这个角色很久了。一开始,他只是把自己看着不爽的、低效的恶意代码鉴定工具做一些调整,后来,他开始把这些工具分享给其他同事用,甚至根据他们的需求制作新的工具。最后,他用来制作各种工具的时间远远超过了破解代码的时间。所以,这次要不是出了震网的事,钱哥点名找高层要他,他估计还在闷头做工具呢。

法里尔分析震网载荷的工作,是从研究西门子Step 7软件开始的。震网瞄准的Step 7软件,是用来为西门子S7系列PLC编程的专用工具。它运行在Windows操作系统上,程序员可以在Step 7中为PLC编写、编译指令和代码。Step 7不能单独使用,必须和Simatic WinCC配合。WinCC是一种可视化工具,专门用于监视PLC及受其控制的进程。PLCs通过工厂生产网络与WinCC监控台相连接,始终处于与机器同步的工作状态,定时向监控台发送数据报告和更新,让操作员能看到受PLC控制的所有机器和设备的实时运行状态。西门子的.DLL文件对于Step 7和WinCC非常重要,扮演着向PLC传输指令和从PLC接收数据报告的中间人角色。震网假冒的,就是这个.DLL文件。他不仅能执行原版.DLL文件的任务,还会执行其他任务。

要弄清楚“幽灵.DLL文件”做了什么,法里尔必须首先理解Step 7以及合法.DLL文件的工作原理。他在网上到处请教专家,甚至想去趟西门子公司,但又不知道该找谁。这个.DLL文件不过是西门子用到的N个.DLL文件之一,要找到能真正帮上忙的那两三个程序员,花的时间估计跟自己在这“硬破”也差不多。而且,说到底,还是自己破更有成就感嘛。

为了还原原版和“幽灵”版.DLL文件,法里尔把它们放进了反汇编器——用于把二进制代码翻译成汇编语言代码的工具。他可以在代码中添加标记和注释、或者将各部分重新编排,来提高程序的可读性。他每次只截取一小段代码,然后按顺序将一段段代码排列好,并详细列出每段代码的功能。

研究者在分析复杂的恶意代码时,一般会综合运用静态分析和动态分析两种手段。静态分析,是指把代码放在反编译器或调试器中观察;动态分析,是指让代码在测试机上运行,使用调试器反复中断、恢复运行过程,以便将每部分代码的功能与该部分代码运行期间对测试器产生的影响进行匹配。法里尔也是这样做的。但这个过程,即便在最好的环境下,也会极其劳神而耗时,因为,研究者必须在两台机器之间跳来跳去。考虑到震网假冒.DLL文件的规模和复杂性,反汇编的难度就更大了。

法里尔用了两个星期来验证这个.DLL文件的每一个功能。最终,他确认了自己之前的怀疑,震网的确绑架了西门子这个核心.DLL文件,用假冒.DLL文件实现了劫持。它把原版.DLL文件的文件名从s7otbxdx.DLL改成了s7otbxsx.DLL,之后把假冒.DLL文件放了进去,成功实现了偷梁换柱。之后,当系统调用这个.DLL文件执行任务时,假冒.DLL文件中的内容就生效了。

替换成功后,假冒.DLL文件开始大显身手。(待续)

译者:李云凡

 

原文链接:独家连载 | 零日漏洞:震网病毒全揭秘(23),转载请注明来源!

0