3
一个真正的黑客,内心绝不平静。
如果你见到袁哥,几乎会怀疑上述判断。你很难把眼前这个和善,甚至有些木讷的大叔和那个当年依靠一段代码就可以随意出入所有个人计算机和服务器的“赛博空间之神”联系起来。
但请相信我,一旦走进他的精神世界,你会看到惊涛骇浪。
相比文字和语言,袁哥更习惯用数字和代码抒情。一个沉默的人不断向世界索要答案,屡次掀翻了人们对赛博空间的根本认识。
现实就是这么惊悚,我们爱这样的剧情。
【袁哥 袁仁广】
迷恋数学的人,身上都有一种冷峻的气息。当袁哥还是小袁哥的时候,确切地说在小学的时候,就已经每天捧着数学理论的书籍,站在呼啸而过的时间里。
我生在农村,家里条件并不好,所以我只能在小学图书馆或镇上的新华书店看我喜欢的书。幸好我关心的数学方面的书籍,销量都不是太好。一毛钱、两毛钱就可以买一本。但即使是这样,我也很难买得起,只挑最喜欢的、最厚的同时也是最便宜的那一本买回家。
到了中学的时候,袁哥已经开始看研究生的群论内容,《布尔代数》《对称恒等式》,你可以脑补同学们看他端着这些书时候的眼神。
买这些书,是需要代价的。
初中的时候,一支圆珠笔都是很好的文具了。有一次我和家里要了几毛钱想去买一支圆珠笔。但是正好我考试成绩很好,得到了学校奖励恰恰是一支圆珠笔。我告诉父母这就是我用钱买的笔,把省下来的钱买了一本书。
这次事件,以哥哥“告密”,袁哥被父亲暴打结尾。那个年代,精神的脱贫走到了物质脱贫的前面。袁哥虽因一本书挨打,显然运气还不算太坏。
对数学和逻辑的偏执,让他得以用独特的视角和世界相处。
我有个同学的哥哥喜欢下象棋,所以我对象棋残局很有兴趣。下残局的时候有一个重要的原则,那就是不能按照大多数人的思维考虑,而是要考虑所有逻辑上的可能性。比如在平时,你不会轻易拿车给别人吃,但是在残局里,你要考虑整个空间,其实每一步都可以抽象成布尔代数逻辑的一个步骤,用数学方法可以很好地解决这样的谜题。
除了是残局高手以外,少年袁哥还是扑克牌谜题高手,脑筋急转弯高手。也许对于他来说,这个世界上没有比严密的逻辑更性感的事物了。
【时任山东大学校长,数学家潘承洞】
因为仰慕山东大学校长、数学大师潘承洞的名望,严重偏科的袁哥依靠数学和物理两门几乎满分的成绩有惊无险地考入了山东大学数学系。不过,到了大学的袁哥面临一个棘手的问题,那就是几乎所有的课程他都在高中阶段完成了自学。坐在课堂上发呆睡觉对他来说是一种折磨。
“我不想上大课,我喜欢自学,因为自学学得更快,也更深。”他的理由简单明了。袁哥在物色一个让他着迷的新世界,计算机就这样正式走进了他的生命。
1993-1997年是袁哥的大学时代,当时的赛博世界还没有像今天这样连接成浩瀚的海洋。计算机病毒往往通过软盘从一台计算机传播到另一台计算机。袁哥回忆,当时就是想“搞明白病毒这块儿”。一旦袁哥想搞明白某件事情,那就是真的要搞、明、白。你懂的。
由于病毒的特殊属性,往往它们都藉由计算机底层逻辑传播。“追随”病毒的袁哥,也来到了赛博空间的底层。《汇编语言》《计算机原理》《操作系统原理》《磁盘控制器原理》,一节课都不去上的袁哥整日泡在图书馆里看这些书。
学校里上机是要钱的,所以我不能总是待在机房。我在机房里用 debug 反汇编操作系统 BIOS 代码,遇到需要仔细研究的代码,我就用学校发的作业本手抄下来。有些代码翻译成高级代码没有几行,但因为我抄的都是底层的汇编代码,量非常大。后来我发现发的作业本都被我抄满了。
对于他来说,大学四年获得的最强技能,就是掌握了和计算机灵魂沟通的能力——二进制语言。对于计算机来说,二进制代码就像每个人用来思考的“乡音”,没有任何一种语言比二进制语言更能直指“机器之心”。如今的袁哥在看二进制代码的时候,可以自动脑补出高级语言的源代码,能够像这样以计算机的世界观思考的人,全世界并不多。他就像一个“风语者”,口中的一段抒情诗在普通人眼中却像一阵风。
计算机的底层原理很枯燥,但如果感兴趣的话,你发现掌握这个原理能够理解和控制计算机的基本运行,这很舒服。如果你的计算机原理底子好,稍微加一些投入,基本都能成为大牛。
袁哥斩钉截铁。
大学时代的袁哥不仅把各种编程语言烂熟于心,还从病毒身上见识了对这些语言最为诡谲精巧的运用。袁哥回忆道:
例如当时著名的幽灵病毒,可以自动变形,这就突破了依靠病毒特征码查杀的规则;
例如 DIR 病毒,可以彻底绕过防毒卡的机制,创造出一个新的感染方式。
对袁哥来说,跳出这个赛博世界的所有禁锢,是他内心不灭的江流。除了攻破学校机房的防毒卡导致病毒肆虐以外,破解当时叼炸天的杀毒软件“KV300”也是他的行动之一。
【上世纪末最流行的杀毒软件(没有之一):KV 300 杀毒软盘】
当时我在研究一个CPU运行的特别机制:DMA。一些信息由 CPU 直接传输,可能要等待很长时间,所以可以由 DMA 控制器直接控制内存实现辅助传输,为 CPU 分担一些工作。我发现这个机制是可以被利用的,因为每当 DMA 传输完成之后,会产生一个中断,如果在这个时候进行拦截,就可以解析出它对磁盘的操作内容。用这种方法循环往复,就可以把整个杀毒软盘的信息读出来,完全绕过了它的加密技术。
当时其他人做的破解盘,隔一段时间就会被江民公司封杀,但是我的破解盘,只要更新病毒库,就可以一直正常使用。
对于当年的“作品”,袁哥还是很满意的。以至于当他因为英语没过四级而拿不到毕业证和学位证的时候,他甚至想到,如果实在找不到工作,就去卖盗版盘算了。“人家正版卖260、360,我只要十分之一的价格,26、36,应该生意不错。”
上天没有给袁哥成为“盗版贩子”的机会,他还是在海信谋得了一份单片开发的职位。
熟悉另一位黑客启蒙者张迅迪的人都知道,因为供职的酒店最早接入宽带,他才走上安全研究道路,创立了黑客界的黄埔军校“安全焦点”。和张迅迪类似,袁哥接触互联网,是因为1997年海信就申请了网络专线,这使得袁哥可以在工作之余研究新的课题。这次,他想搞一下网络协议。你应该了解,按照袁哥的剧本,但凡被他“搞”,就一定被搞到外焦里嫩死去活来。
我学习网络协议的时候,就一边看书记忆,一边反汇编成二进制代码对照看。这就像学英语,一边背单词,一边做对话才能记得牢。
这个因为没考过英语四级而没毕业的黑客居然很有幽默感地拿英语举例子。
现实世界有无数种逻辑,而每一种逻辑,只要它存在,哪怕多么离奇,多么难以想象,可能都是改变世界的武器。袁哥抓住了一扇看起来怪异的逻辑之门。
在 Windows 9X 中,很流行网络共享文档。我研究共享协议代码的时候发现,服务端对客户端进行密码验证的时候,密码长度校验是以客户端发来的信息为准。这件事情看上去非常奇怪。因为经验告诉我们,密码有多长,一定是要以服务器上存储的密码为准的。我马上写了验证代码,从客户端发送信息,告诉服务器只验证一个字节,服务器果然就只验证一个字节。而一个字节只有256种可能,非常好破解了。
袁哥黑进了同事和领导的电脑,一边看着他们的工资条,一边慨叹世界的神奇,一边立志要做一个网络安全专家。
【windows 98 界面(谨供怀旧)】
这是他发现的第一个真正意义上的漏洞。从此之后,袁哥一发不可收拾。
他发现了名噪一时的 Windows 共享密码验证漏洞,可以随意访问共享文件;
他参与创建国内老牌安全公司绿盟,研究出很多高危 IIS 服务器漏洞,可以随意访问任何 IIS 网站服务器;
他研究每个个人电脑都使用的 RPC 协议,发现了很多严重的 RPC 服务缓冲区漏洞,可以直接突破所有 Windows 计算机的权限,实现远程入侵。
21世纪初,在迅速普及的互联网大潮中,很多技术爱好者登陆黑客论坛时,袁哥已经成为了黑客界的一盏精神灯塔。
一开始,袁哥积极地把发现的漏洞提交给微软,但彼时的微软并不是如今那个愿意为漏洞买单的微软,对方不置可否的态度让袁哥逐渐丧失了提交的热情,以至于2001年当袁哥发现了可以用来攻击任何一台电脑的 RPC 服务的致命漏洞时,他选择了沉默。直到两年之后,美国18岁少年杰弗里通过同样的技术制造出冲击波蠕虫病毒,席卷半个世界。
虽然在2000年之前,微软对于白帽子的态度一直是冷漠的,但这并不妨碍袁哥对网络安全的探索。袁哥觉得,这是他人生最“高产”的时候。每天吃饭、睡觉、上厕所的时间都在想代码。他在考虑的最核心的命题是——能否用一个通用的安全模型来辅助甚至代替自己挖掘漏洞。
想要理解袁哥的工具,需要先了解漏洞的本质。
计算机的本质是程序处理。根据输入的数据不同,一串代码会在计算机内部打开无数不同的门,最终成为一个结果。而当输入的信息符合一定的特殊条件,它就会在计算机内部找到一扇奇特的门并且试图打开它。这时,赛博世界就会遭遇崩溃,一个漏洞就此产生。
也就是说,找到这个特定的代码,就找到了可以击溃系统的漏洞。所以漏洞挖掘有两个主要方向:
1、模糊测试。模糊测试是黑盒测试的一种,通过随机给系统一些数据,观察系统是否有异常反应。然而,一个系统是如此庞大,输入的信息又有无数种可能,这个可能性空间之广袤是指数级的。所以如果盲目测试,即使到宇宙毁灭,甚至都不能测试所有可能性的亿亿分之一。
2、白盒测试。通过研究系统的源代码或二进制代码,发现其中的逻辑漏洞和潜在问题。这种方法同样存在问题,那就是对于一个复杂程序来说,代码量之巨大已经超越了人的阅读能力。而且一个程序中有很多是描绘界面内容的代码,这不是漏洞挖掘者关心的,而在阅读之前,你是无法把这些无用的代码剔除出来的。
【软件运行的逻辑树示意图】
袁哥的工具结合了模糊测试和白盒测试,他称之为“数据流”的测试方法。
根据研究员的兴趣点,构造有针对性的数据,让系统进行处理。在处理的过程中,可以通过断点在调试器里查看程序运行的状态,而通过调试器里停留的代码,可以反向推测出是哪段代码在处理这段数据。用这种方法,不用通过大量的代码审计,就可以直接定位到关键的一段代码,对这段代码进行反汇编,就可以读懂它的“心思”。根据这段代码,可以推测出它的所有逻辑分支,从而根据这些全量的分支有针对性地重新构建新的数据,进行进一步的有针对性的尝试。
听上去似乎并不困难,然而这个系统的最难之处还未到来。
虽然你能看懂这段代码,但是你需要用数学的方法把这段代码的内容抽象出来,才能推演出它的所有逻辑分支,有些人类很好理解的逻辑,想要用程序自动化求解,就需要很复杂的逻辑描述。而且针对每一个细小的逻辑点,其后都可能跟随着极多的路径层级,在这种情况下同样有无数的可能性存在,这就涉及到约束求解的数学问题。
袁哥说。
正如盗梦空间中所展现的那样,袁哥对于数字和世界逻辑的深刻见解,在赛博世界最深处的 Limbo,在只有几个字节的腾挪空间里,给了他洞悉真相的判断。
2008年左右,微软难以抵挡无数漏洞的侵袭,开始逐步推出漏洞利用缓解措施。这类机制并不会减少漏洞出现,而是让漏洞的利用变得非常困难。它们就像一堵堵墙,你明知道漏洞就在对面,但是你却无法接近。包括 DEP、ASLR、emet,包括后来推出的 cfi 都是有效的漏洞利用缓解措施。
袁哥站在墙后面,准备“搞”一下。他突然觉得眼前的景象,像极了近十年前的一段记忆。
1997年的时候,宏病毒正在流行,这是一种利用脚本代码执行来搞破坏的病毒。由于病毒只能依靠文字属性的脚本进行攻击,所以包括金山在内的很多研究机构觉得这类病毒的破坏力非常有限,甚至说它“只能用来恶作剧”。
但袁哥不这么认为,他相信自己的判断:“宏代码虽然是解释执行,但解释执行也是执行,和机器码没有本质区别。”他写了几篇文章,证明了把二进制病毒代码编译成了纯文本格式的可能性。也就是说,一个攻击程序可以看上去完全是字母和数字的样子。这大概相当于把一把沙土通过改变原子的排列结构而转化成了金子,让人叹为观止。
时光又回到2008年,袁哥突然发现,自己在十年前提出的世界观有可能从更高的维度绕过所有的漏洞缓解措施。那就是,用脚本(文字)代码编写攻击程序,通过某种精巧的设计,攻击过程中根本不会触发微软用以防护的 DEP 芯片。
然而,把一串攻击代码变成纯文本说起来简单,实现起来却非常繁杂。
两三个月的时间,袁哥做了如下N件事:
通读了 JavaScript 和 VBScript 的详细原理,补齐了代码编译的短板;
找到了 IE 上的攻击漏洞;
尝试了无数攻击路径,配置了很多漏洞的攻击组合;
完成攻击代码的编写和调试。
这个攻击方法,通杀从早期的 IE 3 到彼时刚推出的 IE 9 之间的所有版本。甚至两年后 IE 10 推出的时候,在不改动一个代码的情况下, 仍然可以完成攻击。这就是袁哥最引以为傲的技术:DVE(数据虚拟执行技术 ),他本人称之为“上帝之手”。
这就像在另一个更高维的空间里做出动作,所有人都无法看到动作的过程,只能承受动作的结果。
他解释说。
代码,在袁哥眼里只是一种工具。站在“上帝位置”的人,甚至可以用一首诗,一首每个单词都有意义的诗来击溃一个系统。所谓“谈笑间,樯橹灰飞烟灭”不过如此。
然而,这个游走在赛博空间的上帝终究还是触碰了人类的商业困境。2010年,微软想要用35万美金收购“上帝之手”——DVE 技术,但是这个技术在袁哥心中,远远超过这个价值。这个生意并没有成功,直到三年后,袁哥的好友,大名鼎鼎的黑客教主 TK 独立向微软提交了一套对抗技术,获得了那著名的十万美金。由于其中涉及到的技术和 DVE 技术有交集,微软才在某种程度上封堵了 DVE 攻击的一部分。
2014年,袁哥选择在互联网上公布 DVE 的技术细节,曾经的上帝降落凡尘。
【湛卢剑(一称湛泸)】
湛泸
袁哥在期待自己的下一个 DVE。
为此,这位改写了互联网安全历史的黑客宗师加盟腾讯,建立了全新的实验室,名曰“湛泸”。
袁哥告诉雷锋网:“湛泸,是春秋时代名匠欧冶子所铸名剑。‘仁义之剑,大巧若拙’是世人对湛泸的评价。”这也是已过不惑之年的袁哥的某种内心写照。他需要一把剑,一把能再次穿透云霄的剑。
对于袁哥来说,虽然自己的灵感和成绩无法被复制,但是他意识到,自己比以往更需要一个团队的配合。
现在的漏洞挖掘和利用已经到了比较高级的阶段,如果没有团队和一整套技术力量支持,有些东西靠一个人的力量是做不到的。
他说。
至于加入腾讯的原因,袁哥给出了简单的理由:“TK、吴石都在,我了解他们,对他们的为人都很认同。安全这个行业就是人聚人。”
2016年3月,湛泸实验室成立。袁哥站在赛博世界的边疆,等待新的战友。
那个让他成为上帝的瞬间,终会归来。
雷峰网原创文章,未经授权禁止转载。详情见转载须知。