今天要介绍的大人物,真名方兴,Flashsky,windows漏洞挖掘骨灰级专家。2003年的时候,是全球第一个公布LSD RPC DCOM漏洞分析的人,后来有国外黑客根据他的分析写出了臭名昭著的“冲击波”蠕虫,在全球范围内造成了数十亿美金的损失,微软悬赏了50万美金抓捕蠕虫作者。
Flashsky在安全圈内大名鼎鼎。一个真正有故事的人。
看了全部文字,我发现为作为程序员在求职路上的苦逼是因为自己还没有达到人家期望的高度。当你的能力超出别人的预期,你离成功就不远了。
本文对做了适量的删改,如想阅读全文可搜索《Flashsky:我的安全之路》
0-引子
很早之前,KILLER曾经劝我写写我的安全经历,因为我是从计算机零基础开始自学计算机和安全的,这些经历可以帮助很多后进想学安全的人少走很多弯路。当时太忙,而且做技术工作时,觉得自己写自己未免有自我吹嘘的嫌疑,所以也就没有动笔。
10年开始和王伟一起做翰海源,角色逐步由技术研究人员转化为管理人员,最大最有挑战的工作就是打造技术团队,以及如何向这些后进的人员传递自己的知识和经验。深刻感觉到自己以前的这些经历,或许可以帮助这些同事和希望从事研究安全的人员。所以就有了此文,主要目的有三:
1)是给那些希望从事安全比较低层研究的人以激励,其实用心去做一件事,取得成绩并不难.
2)是很多事情会随时间而淡忘,有些事情会被一些报导所混淆,现在记录下来,未来也有个参照
3)是有很多人对我有很大帮助的,是应该我感谢的,在此文中表达对他们的感谢
希望能对各位有所帮助。(以下都是我个人真实的经历,但是考虑到会牵涉其他人和事,所以一些地名公司名人名都会做些处理)
1-大学时代:计算机补考请人代考(1994)
我高考时数理化生都是高分,但是语文政治英语都不及格,勉强过了少数民族地区的照顾线,进了湖北XX学院。本来报的专业是物理,但是被调剂到市场营销专业。
上大学之后,没有了父母的管制,对学的课程也没什么兴趣,加上那时候都是包分配,没什么压力,于是开始完全放纵自己,每周去课堂的次数屈指可数,我一天的经典日程安排是:早上起来,和对门的一个业余四段下围棋(我当时的棋力大致是业余三段左右,他也是逃课大王),一般下到中午两三点左右才结束(我和他都是长考派,中午吃饭由观棋者带饭),然后出门踢足球。晚饭后,以打台球和打电子游戏为主。
这样下来,毕业那年,成绩自然非常惨淡,靠抄袭和作弊,最犯难的几门如英语什么给混了过去。但是还是遗留下高数,统计,计算机三门需要补考。我寝室的的另一位姓杨的逃课大王(他爸是当时有名的律师,靠在S市专门给人打经济官司发了财,在S市开了一家公司等杨同学回去经营,所以他在学校天天的事也就是玩和等毕业,他个子高,喜欢打篮球)也只需要补考两门,统计和高数。于是我和他统一行动,先是找到教统计的老师,统计老师是一位女老师,这位杨同学于是向其哭诉,我们都是来自大山区的穷孩子,借了很多钱才读大学的,现在要是补考不过毕不了业,家中老母都要自杀之类的话,说的声泪俱下,说到那位女老师都跟着只掉眼泪;我才知道这位仁兄不去从事演员行业真是浪费人才,于是我们顺利的搞定了一门。
高数,则遇到了些麻烦,负责高数的老师是有名的铁面无私。于是我们补考也没过,只剩下最后离校前的一次机会了,我和他在教室里一间间寻找教高数的老师,希望能问到教我们高数老师的家,然后上门去求情,正好看到阶梯教室里一位教高数的老先生刚下课,于是杨同学跑上去询问,这位老先生沉着脸问:你找X老师干什么。杨同学也直白,直接说为补考的事,这位老师脸色大变,厉声问到:你们怎么知道我是这次补考的出题老师?我和杨同学心理一惊,真是得来全不费功夫啊,居然这样都给我们误撞到出题改卷老师了。于是求情了半天,但这位老师好象一点都没受到感动,一副铁面无私公事公办的样子。于是我和杨同学只能铩羽而归。杨同学不死心,出门居然找人打听到此老师的住址,于是撺掇我买点礼物上门去求情。于是我和他买了几斤苹果和香蕉,由于只打听到该老师住址的楼栋和单元,并不清楚楼层,所以他负责打前哨敲门去问。我在后面远远的拿着水果跟着,两人鬼鬼祟祟来到该老师住所。他敲了一楼的房间问是不是该老师的住所,出来一老太说该老师住在2楼,于是我们上了2楼,敲门一问果然是此老师的住所,老师正好不在,只有老师老婆在家,我知道这事八九成了。因为这位杨同学对付三四十岁妇女的杀伤力指数绝对一流,又高又帅又会说又能演,道明来意后,杨同学开始了入戏的表演,果然不久,这位师母就开始掉眼泪了,最后师母说:你们太不容易了,这事包我身上,把你们名字记下来,老头子回来我给他说,他要难为你们,我就让他好看!我们千恩万谢退出来之后,相视一笑。看来天无绝人之路啊。
剩下计算机,只能靠我自己一个人搞定了,计算机不是我们的主要课,当时主要是学的DOS操作和BASIC语言,所以考的很简单。但对我这种一次课都没去上,只是去上机打了几次游戏只会DIR和CD两个命令的我,自然是难如登天;不过计算机不是主要课,监考不会太严。我的上铺是我的老乡,家里比较穷但学习好,我从入校就经常接济他,这个时候他自然就主动请缨要帮我代考。
于是这样,我三门补考都被对付过去,94年的6月,我光荣地毕业了。
2-X王工作之酒店经理一(1994-1995)
我毕业去的企业,是湖北很早就上市的一家以焊条起家的公司X王,他是一家民营企业,由于焊条做的不错,然后就成了X市里的一面红旗,于是很多破产或经营不善的企业都由市政府出面盘给X王兼并,X王再以这些兼并企业的资产去申请贷款然后到处布点,至于这些兼并的企业是否真能因为X王的兼并扭亏为赢做起来,就只有天知道了,但是X王却成了市政府不敢让其倒下的旗帜,因为一倒,全市一半的工人要失业。我去的那年正是X王宣传要三百大发展的时候,所谓三百就是三年内要在全国建100家焊条厂,100个销售公司,100个其他实体,于是那年招了近万名的毕业学生,具体分配到不同公司的大会上,只要你敢说去做,就马上给你任命和一笔启动启动经费,让你去各地开始建办事处等机构然后去申请当地贷款之类的。我不太能忽悠,所以最后我去的企业是X王兼并的一家本地的柴油机厂下面的三级房地产公司,那个时候,房地产还没有起步,远没有现在这么热火,所以轮到最后选人,就这样我去了这家公司。公司老板姓姜,通过关系把柴油机厂里面的地拿了一块,就在柴油机厂里开始盖商品楼,我刚去的时候,在工地上泡了几天,然后就被抽回来做文员,当时还是按学历和工作年限拿固定工资,我记得我是 120块左右,不够我吃盒饭的(当时此地因为修建某千亿的大工程,导致本地物价带的很高,比省会武汉还高,盒饭素的2块,荤的3块)。每个月还得找父母寄些钱来才够用,不过公司管理也很混乱,也没什么人管,上班经常几个总都带头打跑得快,下班后打球打麻将就成了经常性活动。我当时也很惶惑,觉得这样混日子实在不是个方法,宿舍里住了我的一个同班同学,他是个计算机迷,拿过学校计算机编程比赛的第一名,天天捧着一本计算机书看,劝我自学计算机,于是我借了他一本计算机的书,看了2页就头疼无比,把书还给了他,对他说我实在不是学计算机的料,这辈子估计都不会和计算机打交道了。N年之后,他也出来在武汉的一个计算机公司做应用开发,我去武汉见同学时碰到他,当他知道我现在从事计算机安全研究时无比惊讶,我相信应该是当年我那种决绝的样子给他的印象太深了。
4-X王工作之下岗(1996)
再不经世事的人,也知道我这个酒店经理,肯定是做到头了。
不出所料,过了2个月,我首先是从酒楼以工作需要之名调回了物资公司。又过了几个月,公司优化人力资源,我成了被优化对象;被优化的对象都送到X王总部, 重新安排工作,我被送到X王刚兼并的一个大山里的农用厂先当工人。
我每天冻得睡不着的时候,都在想,未来我会是怎样呢?就是这样活着吗?我能改变什么吗?但我很快就沮丧的发现,未来我可能会更惨,很显然,给我的小鞋不会因为我的努力就停止,这样的生活我必须改变,但我怎么改变呢?继续呆着当着没有出头之日的推车工或者去当欺骗农民买开不动的农用车的销售人员吗?我想我良心无法接受,回家吗?考大学本来我父母就不同意,因为我的母亲姐姐姐夫都是银行系统的,当时银行是可以照顾家属进银行的,所以他们要我去读银行的中专然后进银行,但我讨厌银行刻扳的生活,还是报考了大学,希望能混个人模鬼样,而我父母几个同事的子女,学习差的一塌糊涂,高考只有一百多分(总分710),最差的学校都上不了,但是靠关系上了银行的中专,出来分配到银行工作,一个个混了段日子都升成小管事的了,那个牛逼啊。我就这样灰溜溜地回家,亲戚朋友会怎样看我呢?而且我回家之后,放弃了已有的工作,什么都不懂的我又能做些什么工作呢?
我在稻草上,几个晚上都没睡着翻来覆去地想,对未来生存的恐惧让我深深感觉到,一个人要没有生存的技能,在这个世界上是多么无助。我开始后悔在学校里荒废掉的时光。
帮我最后下定决心的,是旁人说起的一个新闻,那几年,正是工人大下岗的时候。X王兼并的一家厂子,最后还是支持不下去了,于是这个厂子的工人就全员下岗了,停发工资了。一对中年夫妻都在这家工厂做工人,于是家庭一下断绝了经济来源,他们还有一双在读书的儿女。他们想去找工作,但是身无所长,找不到工作。 于是绝望中,杀了自己一双儿女后双双自杀。我被深深震撼了,难道,我的未来也要如他们一样?当一个身无所长的工人,到中年的时候,突然接到下岗的通知,找不到工作,然后等待悲惨的结局?不,我还年轻,我应该还能改变什么,而不是等一切都来不及的时候,被命运和世界主宰。
第二天,我一早就爬了起来,从工厂坐了个回X市的便车,找同学借了些钱,然后什么招呼也没打,连我在X市宿舍里的被子,行李,我大学心爱的用我2个月省下来饭钱买的一把黑吉他都没带。买了回家的长途车票,头也不回的离开了X市。自己给自己主动下岗;回到了家乡。在我的父母充满惊讶的眼神中,告诉他们,我决定不在厂里干了,我要自己找工作打工。
多年以后,我对X市的记忆日渐模糊,除了因为回家偶然途经之外,再也没有去过。只有一次去武汉中途到此地转车,离转车开车时间还有4个多小时,我抽空又来到这个房地产公司的旧址,当年我们盖的楼已经入住满了住户,也开始显得有些老旧了,转过楼道,我依稀还看见那位办公室主任走进单元。可是除此外,我没看到一个其他认识的人,于是我又默默的离开了。今天,我回想起当年这些,依然还能感觉到当初自己,被对生存和未来深深的恐惧占据心灵的感觉,我想我或许应该感谢刘总和那位办公室主任,是他们的小鞋让我终于惊醒,让我在还能靠自己努力去改变命运的年纪,选择了一条不同的道路。不然,或许某天,社会新闻里出现的一位下岗失业自杀的新闻人物就可能是我。
5-四处打工之信用社出纳(1996)
父母是最心疼儿女的,在这个时候,他们四处活动,希望能帮我找到一份工作。靠母亲老银行的关系,不久后找到一个去农村信用社当聘用制出纳的工作。在这之前,我表达了我想学计算机的想法。我姐夫是工行电脑科的,也是科班计算机专业毕业的,就在银行里找了一台报废但还能用的386的机器给我,抱这这台黑白显示屏的老机器,我开始了自学计算机之路。我姐夫把他大学里的计算机教材找出来,就成了我自学的教材。我用飞速的速度首先学会了打字和DOS基础命令操作, 当年正好是各个业务系统都开始上微机的时候,会打字出去找工作是一个很大的优势。去信用社当出纳,还必须考点钞手法和算盘,在压力的驱动下我居然几天就精通了它们,于是通过点钞和珠算考试之后,我成了农村信用社的一名出纳。
这个时候,我开始了我自学计算机。这是最艰难的时候,我姐夫是学硬件的,先开始我想跟着他学计算机维修,但很快我发现,我还是对软件和开发更有兴趣点,当初银行系统都是类UNIX的xenix系统,于是开始学xenix的操作与命令。这些都容易,最难的还是学计算机组成和操作系统原理,由于我姐夫是学硬件的,他的计算机组成和操作系统原理的教材,都是以汇编做例子来讲解的,对于我这样一个没有任何语言基础的人,想看懂这些汇编级的计组和操作系统原理的教材,其难度可想而知。我咬着牙,一遍又一遍的看,看不懂的,先记下略过。下次再看,每条指令,先从英文的角度去理解他的意思,就这么着,一遍一遍,我不记得这两本书我看过多少遍,但最终,我都看懂了。想来这或许是一个奇迹,但我宁可相信是对未来生存的恐惧驱使我获得了某种力量;未来我从事安全研究的汇编功底,或许就是这么来的吧。看懂了计组和操作系统原理这2本书,我发现我对计算机系统和语言的理解能力大副上升,我于是买来计算机高级程序员考试的教材,自学数据结构,FORTRAN和C语言,有了计组和操作系统原理的汇编根基,C语言中的指针这些很让人饶头的概念就很容易被理解了。
信用社的工作对我而言很轻松,但是对信用社其他的人就不一样了,她们基本上都是银行系统的女家属,年纪都比较大,新上的微机系统的操作和打字显然对他们是个很大的挑战,每笔业务都需要做很长的时间,而我则非常得快,自然我成了她们的威胁,每当我干完出纳的活抽空去看计算机的书时,而她们还在不知道怎么敲打字的时候,她们就会很自然地嘲笑我一个出纳还看这么高深的书,难道想一个人把活都干了之类的话,我也就当耳边风。不过另一个人让我更讨厌,就是社长的司机兼系统管理员。信用社没有搞计算机的专职人员,信用社这套柜员操作系统是武汉一家公司来安装调试的,是当年流行的NETWARE的系统,我们那里山高水远,那几年路也不好走,每年都会发生大客车翻车重大伤亡事件,所以那些武汉的人当然不会经常到这边来维护,于是就把一些日常如开机关机命令写好,让这个司机每天定期照着做,于是这个司机就升格成为系统管理员了,到处指指点点,俨然一副资深管理员的样子,每次看到我再看计算机的书都会鄙夷地发出一声冷笑,然后和这些大妈一起,开始在背后嘀咕着揶揄我,什么大学生,咋没工作当打工的出纳了,这么用功装谁看啊,会打几个字真以为自己是计算机高手了之类的话。
我那时候也比较气盛,就想给他们点厉害看看,我就想破破这个司机的密码试试。银行这个系统用的是NETWARE的终端模式,程序是采用FOXPRO开发的,用户一登录后就通过PROFILE启动进入银行柜员程序,但是当时没有什么安全考虑,居然没有屏蔽CTRL-BREAK。于是在程序进入之前按下CTRL-BREAK。中断银行柜员程序,我轻易就进入到了DOS命令行模式,就可以直接用TYPE命令看到一些数据库DBF文件的内部信息了,包括用户的信息库。这个系统的用户密码是用程序加密过的,但是是程序员自己写的一个算法实现的加密,于是我通过不断修改自己的口令观看自己密文变化的方法,居然把这个算法给推导出来了。于是我破解计算出了这个司机也就是管理员的口令。当然我破解出来后什么也没做,毕竟我只是赌口气,没想过去干什么犯法的事,不过我在纸上写写画画计算算法和口令的行为,被后面高度警惕的一干大妈时刻关注着。中午乘我吃饭的时候,她们把这张纸翻了出来,虽然她们看不懂写的什么,但她们拥有的特工一样高度敏锐的嗅觉还是告诉她们,此事不同寻常,于是她们拿着它集体去向社长报告我的异动行为,社长也不知道纸上我写的是什么,于是把信用社唯一的半IT人士,也就是这个司机兼系统管理员叫来让他分析,他虽然也看不懂,但最后一行是计算出来的他的密码他还是认识的,于是晚上,社长一行人到达了我家,鉴于我没有任何违法行为,但确实又破了管理员的口令,所以社长劝我主动辞职,理由是我太危险了,他在银行系统这么多年还没听说过出纳能破管理员密码的事情,他们担不起有我这样能力人在信用社工作的风险。于是2个月的信用社出纳的职业生涯,又到此为止。我的妈妈本来想埋怨我几句,但是被我父亲阻止住了,他只说了一句:“我的儿子肯定有前途,社长都说了,他在银行系统几十年都没听说过能破管理员密码的事情,但我儿子才学计算机几个月就能破,只要他不犯法,就说明了他有天赋”。我的父亲是一个严厉的父亲,从小到大,我挨他的打不计其数,记忆最深的两次,一次是我被父亲用荆棘条抽的浑身是血道,让我表妹看到都吓哭了,还有一次是我高中在街上的棋摊上下围棋被我父亲看到直接在众人面前一顿猛抽嘴巴。但这一次却让我深刻感觉到了父亲的爱。当然我也深刻反省到,在职场上有职场的规矩,虽然我无犯罪之心,但是行为上确实触犯了很多规章与制度,也必须承担相应的后果。信用社这么处理我,是我完全应得的。
6-四处打工之寿险出单员(1997-1998)
丢了信用社的工作,我又处于失业状态。这个时候正好是寿险在国内开始开展的时候,加入寿险销售没有任何要求,当然收入也是全靠提成。于是我成了太保寿险的一名推销人员,做过简单的寿险业务培训后,然后就是开晨会搞激励,穿得笔挺上街做陌生拜访。加入寿险销售的一般以女性为主,男性不多,基本都是三十多岁以上,像我这样年纪的小伙没几个。我对业务的理解还凑合,但真到对人忽悠买保险就完全没路了。其他卖保险的都在忽悠客户若干年后能赚多少钱,如何比存银行划算,其实保监会都规定了寿险精算后的收益率是不能超过银行的利率的。保险保险,就是要降低风险而不是追求收益。但是国人对风险和安全的认识比不过对现实的利益追求,于是鼓吹自己的险种怎么比存银行能赢利倒成了国内推销保险的特色。自然我这种只会从降低风险角度去说服客人的销售业绩是一塌糊涂,不过业绩不好只是你拿不到提成而已,也没什么人来管我。
这个时候,保险也开始要求用电脑出单了,总公司下发了单机版的寿险出单程序,各地都要上。自然我们这也需要招一个会打字的寿险出单员,这个工作是聘用的, 有400块固定工资,当时的经理为了刺激业务人员的积极性,于是规定,最近3个月业务成绩第一的人就可以获得这个职位,不过要自己学好打字,于是一帮人除了做业务外还开始学起打字来,热火朝天,虎视耽耽想拿到这份工作。当时保险行业延续了金融行业的惯例,这套程序使用的系统是SCO UNIX的,在哪个我们这会打字的人都比较少的年代,除了银行系统会这个的就更少了,不过经理也不懂,觉得能打字的就差不多可以出单了。我打字和折腾 SCO UNIX固然没问题,但是推销寿险业务想要拿第一当然是天方夜潭了。我母亲知道后,于是开始为我到处跑业务,先我父母,我姐姐,我侄女,我亲戚什么的,全部被我母亲动员买了保险。然后我母亲带着我一个熟人一个熟人去拜访卖保险,靠着我母亲的面子,我终于成了这3个月寿险销售的第一名。如愿以偿地拿到这份工作,一个寿险出单员。
寿险出单对我来说轻而易举。我们是州府,下面还辖着的8个县市按要求也必须电脑出单,当时下面会打字维护系统的人就更没有了,而且下面业务量也不大,配专有人员成本还是很高。于是老总让下面地市的人出差时带保单过来到我们这边出单,时效比较慢,保户意见也很大。于是我建议用传真的方式加快出单(那个时候用传真在我们这个偏远地带还是少量单位的事),于是老总让我出差去采购多台传真设备回来再教导地市的人使用。我怀揣着2万巨款到了武汉,找好了卖设备的人,谈好价格;第二天下午5点多我去提货,武汉电脑街这个时候居然空荡荡的,的士司机给我停远了200米多,我下车走过去的时候,居然被一群混混给围住了,先是逼我买光盘,后面就直接上来开始搜我身,买设备的钱放在一个比较脏的纸袋里拎着,要是给这帮人抢走了,我可赔不起。我一个激灵,于是主动用江湖口吻说道:兄弟,大家都是出来混生活的,我身上就200块钱。我主动把衣服口袋里的荷包都翻出来给他们看,确实只有我自己用于零用的200块钱,我接着说到:大家出来都不容易,这100块请大家去买包烟抽,剩余的100,大家帮忙下,我多少要留点路费,谢谢各位兄弟手下留情。那些人看我好象确实也没什么钱的样子,领头的接过了钱,马上就四下散了。我才有惊无险地走到卖传真机的店里。
传真买回来之后,各县市的工作效率明显提高,老总也得到了上级的表扬,于是开始比较看重我,让我全权负责这套系统。寿险这套系统,是SCO UNIX+FOXPRO开发的,程序还是第一个版本,错误百出。地市级的公司根本没有维护能力。于是省级公司电脑部的人就疲于奔命在各地维护这套程序,而我们这里,是他们最畏惧来的地,97年春节,2天翻了3辆大客车,死亡100多号人,上了焦点访谈;但是一年多来,我们这边居然没叫他们来维护过,而一些程序的BUG,都需要他们去各地升级程序,而我们这里也没有让他们来升级过,他们感觉很不放心,担心我们这里在玩什么花招。于是武汉分公司电脑部的人决定过来做突击检查,他们来了之后,抽查了保单和统计数据,发现都正确无误。而那些需要修改程序的BUG,也都被我改过来了,他们这才知道我的存在。武汉分公司电脑部正为缺少人到处去跑各地维护程序着急,于是很自然,我被抽调到武汉分公司电脑部。终于,我由一个非IT专业人士,终于成了一个专职的IT人士。另外,我参加了98年的水平高级程序员的考试,我早早第一个做完了试卷,本地的监考老师显然很希望我们这里多出点成绩,因为之前我们这里还没有出一个高级程序员,看着后面急头搔耳的考生,于是拿着我的试卷让后面一干人等抄袭,抄完之后还给了我,我做了下检查,发现了一个错误,于是修正后交卷。
7-四处打工之水平高级程序员(1998-1999)
太保武汉电脑部我没呆多长时间,工资是550,涨了一些,但是武汉的生活成本更高。而且显然,这里也很难转成正式的职位。我的父母一直希望我能找一个稳定的工作,也希望我能呆在家乡,他们通过关系找到本地一所大学的校长,让我去这所学校当老师,校长答应待到一定时间后可以转正,于是我又回来成了该学校的一个编外计算机老师,职责是管一个小机房,10来台机器,专门给老师上网用的。
我97年就初次接触了互联网,买传真机时对方送了一张瀛海威免费几个小时的光盘,但是需要长途电话到北京,上网免费但是电话费得自己出。回来后我偷偷上去了几次,第一次认识到互联网,不过当月老总就抱怨电话费过高,要查查,之后就不敢多做这样高花消的事情了。98年,我高中同学在华中理工大学读博,去他们学校上了下教育网,见到的就更多了,BBS,TELNET,都是我以前没有见到的新奇玩意。这个时候,电信也开始有了互联网业务,我们那出现了第一个网吧,价格是10块钱1小时,我每个星期会去奢侈1个小时。各地电信开始纷纷建各种在线的站点,也有了聊天室这样互动的应用,我经常去的一个聊天室,我发现它注册的聊天室用户都是写在一个文本文件里,用||分割开,里面包含描述用户权限的信息,标记是管理员还是普通用户,但是没有对用户注册时的||做过滤。于是我注册用户时,使用||字符,后面就可以再增加一个管理员权限帐户,原理类似SQL注射,于是就成了这个聊天室的管理员。于是在里面踢踢人,偷看偷看聊天记录什么的。
这个学校的计算机系是由数学系分出来刚成立的,上课老师都是以前数学系毕业后留校的老师。学生学习热情很高,但感觉学不到东西,这个系的学生会主席不知怎么就打听到我对互联网了解很多(其实当时我也只懂得点皮毛),于是找到我,希望我能给同学办一次讲座讲讲互联网知识,我欣然答应了。讲座很快就开了,学生爆满。当时我讲的主要就是利用HTML和脚本编程可以做个简单的聊天室应用,这在现在是很平常的东西,但在那时和我们那里,确实非常超前和震撼的东西,讲座举办的非常成功,但是很多编制内的老师,对我则非常不满,在他们看来,我只是一个打杂的(除了管这个小机房,系里打杂的事也归我做),居然也敢办讲座。
在老师上机的机器上,我给几台机器安装了SCO UNIX+WINDOWS的双系统环境,一方面方便我继续玩UNIX系统,另一方面,学校教操作系统课程也是以UNIX为典范的。给老师提供UNIX使用环境在我看来并没什么问题,但是却没想到出现了一个意外。一天一位教操作系统的老师来上机,我自然让他坐到装了双系统的主机上。过了一会,他脸色铁青的关掉电源就走了,我也没注意。过了2天一个和我关系还不错的老师跑来对我说:你有大麻烦了,系里所有老师在开会申讨你。我奇怪问为什么?他说,因为教操作系统的老师说你改了CMOS开机密码,故意阻碍老师上机,我一晕,这那跟那啊?想起来了,双系统起来时候,是在BOOT界面上,直接按回车进入UNIX,敲DOS进入WINDOWS,用过UNIX的人都知道,但是我却从来没有想到过,专门教学生UNIX的老师居然从来没见过用过UNIX,不知道这是什么,还误以为我给他们上密码。
晚上系主任找我谈话,不外乎就是我锋芒太露,我们专职老师都不敢给学生办讲座,你凭什么办?你是有关系通过校长到我们这里来的,但也得本份之类的话。我对系主任说:我辞职好了,然后走出了系主任的办公室,我又失去了一份工作。
之后,我去了本地一家卖财会电算化软件和培训使用,顺带做一些硬件维护的公司,给人拆机换配件,装系统,扛机器是我这段时期做的最多的工作,除此外就是继续去网吧,99年大使馆被炸后引起了国内第一次有组织的黑客行为,我那时候对安全不太了解,但是凭着对UNIX的一些了解,居然也误打误猜到一台UNIX主机的口令,不过进去转了一圈也就出来了。很快这家财会电算化公司就不满意我了,毕竟我拆卸和扛机器的速度不咋滴,我很识趣就自己辞职了;几年后,我的一位若干年没见面的初中同学后来成为这家公司的技术主管,偶然碰到我,问起我,惊奇地得知我曾在这家公司工作过,于是去找几位还留在该公司的老人问对我的影响如何,他们鄙夷地说了一声:技术非常烂,给机器换个配件都要10分钟。
就在我生命又一次暗淡的时候,终于出现了一线转机,我98年考的水平高级程序员的成绩终于出来了,我以高分过了,是那年我们州里唯一过的高程。主管程序员考试的人告诉我,由于监考老师当时把我的卷子给别人抄袭,导致我们这次州有多个高分过线的,答案又明显一致,而且我们历年没有过水平高的人,所以当时决定全部做作废处理,但是一位改卷老师说肯定有一个是原始被抄的人,而且这个地方这么落后好不容易出一个高程,还是应该照顾下,最后由于我分数比别人高半分,而且明显是改了一个错误点,说明我是原始被抄的。于是就批了让我一个过。虽然我不知真假,如果是真的,我想我要感谢这位不知名的老师,是他的一念之仁,给了我机会。
有了水平高级程序员的证书,我这个非计算机专业毕业的半路和尚,第一次拥有了一个能证明自己能力的证书了,于是我又花了口袋里不多的10元钱去网吧上网,在刚开始出现的一些招聘网站上,四处投放简历,简历上我加上了一行字:1998年水平高级程序员。
8-职业IT生涯之DELPHI程序员(1999-2000)
很快,X州的一家L公司打电话过来,对我进行面试。他们开发用的是PASCAL语言为基础的DELPHI开发环境。他们希望我能很快上手干活,除了一些计算机系统方面的问题,所以也问了一些DELPHI开发的问题,我只自学过C和FORTRAN语言,对这些问题只能依靠理解蒙混着回答,其实当时我不是很了解这些问题的正确答案,但很显然我运气不错,他们对我的回答很满意,电话里就决定录用我,工资是2000多;从500多一下飞跃到2000多多,这对当时的我来说简直是意想不到的工资;对方要我尽快就到岗,于是二话不说,买了次日去武汉的汽车,但是DELPHI还得靠临时抱佛脚,本地没什么卖计算机书籍的地方,只能到了武汉后,买了晚点去X州的火车票,马上就去书店买了2本DELPHI开发的书;我不想失去这份工作,他们以为我以前做过DELPHI开发才录用我的,我必须要利用在火车上的不到2天的时间成为能用DELPHI编程的人,千万不能让自己露陷;对于一个长期每个月拿4、500工资甚至经常失业在家吃父母白饭的人,2000多的工资实在是太有诱惑力了,而且这是第一份我凭自己本事找到的工作。
到达X州L公司时已经是下午三四点多了,显然不可能在这个时候就安排我开始干活,我庆幸又多了一个晚上可以突击学DELPHI,晚上安排好住宿后买了点物品,又温习了一遍DELPHI的东西才睡觉。但心里还是没谱,毕竟,连DELPHI都还没有安装使用过一次。第二天,公司给安排好了工作机器,接手一个调走到其他岗位的程序员的工作,学会安装好DELPHI,开始上手干活了,我一边靠临时背的点知识,一边看人家的代码和DELPHI里的开发指南帮助,开始了第一天职业程序员的生涯。
一个星期下来,我差不多能熟练使用DELPHI进行程序开发,除了一些比较深入的东西还需要时间掌握外,应付些日常的问题已经差不多。也开始了解到L公司更多的一些信息,L公司是科大毕业的6个人合伙创办的一家公司,负责技术也就是面试我的是科大少年班出来的,当时任总工。才17岁,但已经非常老成了。这家公司主要以开发医院的HIS系统为主,他们当时拿到了X州医院的一个HIS项目,然后又拿到一个X州本地老板200万投资,在这家公司我也接触更多的如QQ,新浪这些新生的互联网事务;显然他们也感觉到了互联网这个潮流,在总工的力主下,还在做一个网上商城的站点,他们做网上商城是非常早的了,如真能坚持到现在,没准成功的就是他们。但他们除了网上商城的商业模式外,显然还面临另一个更严重的问题,他们6个人,每个人单纯论个人技术都是很不错的,但在一起就有点谁也不太服谁的样子,经常争吵不休;我没搞懂当年他们是怎么凑到一起来创业的,也不太清楚他们的股权分配情况和决策体系。但是能看到CEO的职位老是走马灯式地换,每个人当1,2个月,然后就会在吵闹中换另一个人上来当CEO。所以在方向上也是变化不定,不过他们变化快倒逼着我学到不少新的东西,他们要做商城,我学JS,HTML,ASP这些WEB开发,他们决定做网上诊断系统,我学XML的应用,他们决定做餐饮和酒店系统,于是我又成了系统分析员和架构设计师。另外就是公司有一个喜欢玩黑客攻击的姓许的同事,经常拿一些发布的安全漏洞的攻击程序黑同事的机器来恶作剧,我也被他黑过一次,算是个小插曲。
但是渐渐的,我开始觉得公司问题越来越大了,技术创业型公司不擅长市场和营销的特性显得突出起来,HIS系统没有拿到新的单子,餐馆和酒店系统也只卖出去几套。商城也没找来投资或者形成一种赚钱的商业模式,对一个创业公司来说可能负担就比较重了,这个商城是总工力排众议要做的,但是随着时间推移压力逐步增大,内部争吵也越来越激烈。虽然后面又拿到老板追加的100万投资,但公司的方向好象就从来没有稳定过,在各种不同的方向中摇摆着,天天几大巨头都为各种决策吵闹不休,甚至出现了动拳头的事件,让下面的人也人心惶惶起来。后面一些开发主力也开始辞职了,特别是一位也是科大毕业,主要负责HIS架构的人员也离职了,他是当时公司除了总工外技术上最核心的人员,让我开始隐隐有所担心。我想,或许该考虑换换了。正好这个时候,一位先离职去了S市的同事打电话来,说他在S市找到了一个有钱的大佬,愿意投资他做套进销存软件。大佬把办公室都已经租好了,让我赶紧去S市和他一起图谋发展,大展拳脚,许诺给我的工资是4000。看来是该去有名的改革开放之地S市见识见识改革开放的成效了。
9-职业IT生涯之WEB程序员(2000-2001)
来到了S市,见到了这位朋友,然后接触到这个愿意投资的大佬,就开始发现这件事情很不靠谱。原来这个大佬是个爆发户,他的职业是某证券公司的投资经理之类的,那几年正是国内股市大发展的时代,他通过自己私人募集了一些资金跟着所在的证券公司一起炒股,赚了几千万,就开始想做点实业。不知被什么人教唆,说做软件公司赚钱快,做完了之后就可以在家等着数钱,举的例子就是广州某市一家做财会软件的公司,做了套财务软件,一年赚了好几个亿;因此他的计划是我们这个进销存软件一个月之内就要出来,他就好开始等着在家收钱了;大佬讲到这里,已经眉飞色舞,好象已经看见钞票在向他招手,这不扯淡嘛。软件一行代码都还没写就等收钱,就算我们能一个月做出来,你的销售,渠道和市场推广计划这些东西,这位大佬也好象没有什么想法和准备,于是我就给这位大佬解释软件的开发过程,说不可能这么快就出来,而且建设销售渠道这些事也不是几个月就能搞定的事。看着这位大佬幻灭的眼神,才知道破人发财的梦想实在是一件很得罪人的事情。不过大佬就是大佬,立马当机立断就做出了新的决策:既然做软件赚钱这么慢这么难,那我还是继续做我老本行证券相关的业务划算,原来注册为XX软件公司的办公室,立刻改头换面成为XX理财公司的办公室,于是我又要去找工作了。
幸运的是,凭着懂得一些WEB的编程知识和高程的证书,很快找到了一家马来西亚在S市做在线酒店订房和旅游推广的互联网公司,他们正好需要在WEB上做XML相关开发的人,于是我顺利地进去。在这里我认识了喜欢折腾LINUX和安全的DXK,那几年,以民族口号为诉求的各类XX黑客行动正如火如荼,DXK也经常去参与一下,因此也认识了不少做安全的人,我最早认识的一批做安全的人都是他介绍给我认识的,包括小鱼巫师,冰河,SSQ,苏樱等。
在DXK的带动下,我第一次学会了利用安全漏洞和相关利用工具。学会了拿着扫描器去扫描主机和一些常见工具的使用方法,不过也都只是玩玩而已。在这家公司另外的一个成就就是,当年IBM的DB2刚刚进入国内,为了推广DB2以及相关的认证考试,于是展开了网上在线的DB2的认证考试,考过之后可以获得DB2的各项认证,包括DB2的DBA,DB2的程序开发和高级程序开发三个认证。DXK是一直搞DB2的,我只是跟着他混混了解了些DB2 DBA的皮毛。所以DXK就兴冲冲去网上考了下,但是没有过,回头对我抱怨题目比较难。我于是上去,找了个这个考试程序的BUG,轻易获得了这些题目的正确答案,于是这三个考试我都顺利拿到了100分,回来悄悄告诉了DXK,我们两都顺利地拿到DB2的这个3个认证。
不过很快,轰轰烈烈的互联网泡沫开始破灭,这个互联网公司也受到很大的冲击。开始收缩裁员,控制费用,马来西亚籍的CTO找我和DXK谈了2次话,希望我们继续留下,但很显然,公司好象很难继续维持下去了,他们开始找各种人来接手,最后找到了一个日本人来收购,我不太喜欢未来是被日本人管着,于是开始在网上投寄简历。寻找下一份工作。
不久,就有家M公司回复,让我去面试。我来到M公司,见到了负责研发的K总,相谈甚欢。于是就定下了去这家公司。
我新来到的这家M公司,是S市的一个民营企业,老板姓W,有点传奇色彩,传说他当年只身来到S市打工,在一个综合布线做机房工程的公司做仓管,一天客户来了,所有销售人员都外出了所以没有人员接待客户,他主动跳出来给客户讲解产品,让客户很满意,最后达成了交易,老板知道后非常惊奇,于是升他做销售,一年后就成了该公司的销售主管。后来他的客户关系多了,就私下接了一个大单,然后自己带领了几个弟弟,亲戚之类的单独做,几年时间内已经做到年销售5000万左右,是一个典型的家族公司。他的名言就是只要你给我做出块砖头我就能给你卖掉。M公司在证券行业做机房集成工程是非常有名的,但是利润则随着行业的规范化发展则变薄。因此W老板希望能跨向利润率更高的软件行业发展,于是挖来了K总,设立了软件研发部门,开始招兵买马。就是在这个背景之下,我来到了M公司。
10-职业IT生涯之开放式基金(2001-2002)
K总以前是某证券公司的技术部门经理,自己工作之外还开发了一套针对证券部门进行监管的软件,也希望能推向市场。K总有开发能力,管理经验,又有成型产品,证券行业背景。W老板有平台,有资源,自然是一拍既合,K总带产品加入,成了M公司的小股东兼副总裁,主要负责研发。
当时W老板拿到了某知名基金公司的开放式基金交易系统的开发和集成的单子,带设备和软件开发,项目金额接近2千万。我是K总招来的第三位研发类员工,不过第一位员工很快就自己闪了,第二位是一个女孩,于是我就自然成为了这个项目的项目经理,实际也是开发部门的经理,负责这个开放式基金系统的开发。那时候开放式基金在国内刚起步,证监会只出台了一个模糊的文件,具体业务规则该怎么做,就得基金公司和开发商自己去慢慢琢磨了,我当时面临最大的问题第一个是技术问题,第二个是业务问题,技术上,这套系统使用的是IBM RS6000的小型机,AIX操作系统,对方要求是沿袭金融体系的那一套复杂的架构,使用CICS,tuxedo的中间件,MQ的消息中间件,除了DB2数据库外,这些技术都是我以前没有遇到过的,陆续招进来的人也没用过的,我只能天天捧着技术文档,从装AIX系统开始,配置各种系统的参数,一个一个的来解决,终于把整个系统架起来,能在TUXEDO,MQ下做开发,调试各种中间件的代码了。业务是另一个难题,开放式基金在世界上有2套差异很大的规则,一套是日本规则,一套是欧美规则,证监会的文件上并没说使用哪家的规则,我们只能两个规则对照着研究,结合证监会文件一个字一个字扣字眼,看那种规则更符合文件精神。这样下来,我们开发组的成员个个都几乎成了开放式基金的业务专家(后来我的这些同事基本都去了甲方当技术经理了)。
做完了这个项目,W老板又折腾到和另一个基金公司谈开放式基金项目的机会。业务和技术都由我去谈,那时候我还对商业礼貌没什么观念,因为大夏天,我就穿了个大短裤和拖鞋去客户那里谈。由于业务和技术解说上都让对方很满意,对方立马就拍板了这个项目,理由是,穿了个大短裤和拖鞋的我,让他们觉得我们是做技术而不是专忽悠的公司。只是这个项目比以前那个项目总金额少多了,800万。因为换成HP的小型机了,基金行业逐步认识到,其实开放式基金的交易量不可能如以前想象的像证券交易那么大,主要的计算只在每天下班之后的清算上,对实时性要求并不高,并不需要非常高端的设备才能完成。
由于开发部门和质检部门的工作一直比较对立,K总和我谈了几次话,我就主动申请了靠边站,K总给我成立了一个新部门:系统策划部去当经理,不再过问开发事宜。主要是研究新系统和新方向,简单点说,就是K总以前带来的证券监控软件,希望增加一些新的功能,如SNMP监控和一些安全功能,然后向证券行业去推广。这个事,让我正式和安全开始结缘。另外就是在此期间认识了XFOCUS的BENJURYY等兄弟,以及SHOTGUN等人。
11-安全研究生涯之转折(2002)
给这个软件完成了SNMP功能后,接着就是实现端口到进程的映射研究,让我和安全圈的朋友不打不相识。
端口到进程的映射关系,当时微软并没有公开的技术文档来说明。但是国外的一个软件FPORT却实现了这个功能。于是FPORT成为我第一个逆向研究的程序,花了大半个月,通过汇编代码分析逆向成伪代码,终于把整个FPORT的过程机制分析清楚了。那个时候经常去SHOTGUN当斑竹的西祠黑客也是侠的版面,看到很多人也在讨论这个问题,于是发布了我写的这个工具。哪里知道却引起了一场风波,很多人上来骂我用别人的工具说成自己的工具,让我莫名其妙,最后才知道,原来白细胞的ilsy也写了个同样的工具发布了,而我消息比较闭塞,并不知道他的工作,所以大家都认为我是偷盗了他的成果忽悠成自己的东西。我自然不服气,于是把我写的源代码,FPORT机理的分析,以及我逆向分析了ilsy的工具之后得出的我们之间技术的区别贴在了论坛上。于是指责停止了,这让我感觉到,安全技术圈子的人还是很实在的,只要你能拿出证据来,人家就服你。也是从这次风波中,知道了XFOCUS站点,以前虽然认识BENJURRY和冰河,但不知道他们是XFOCUS的人。去XFOCUS上看安全技术相关的文章让我收益匪浅,于是觉得自己也可以通过研究,写出一些文章来,于是就把自己对安全的一些研究心得和成果,写出来发布在XFOCUS上,以此认识了更多XFOCUS的核心成员,小呆、ISNO等,其中ISNO还给我了 UNICODE SHELL编码的例子,让我更深入理解了SHELLCODE的一些原理和技巧。
XFOCUS上发布的文章多了,自然也和XFOCUS的兄弟熟悉了,然后由BENJURRY和冰河做介绍人,我也就加入了XFOCUS,感觉安全给我打开了另外一扇窗户,而且这期间也发现了一些微软的安全漏洞,如管道匿名劫持,ODBC查找SQL SERVER存在堆栈溢出等,虽然将这些信息发给了微软也石沉大海,但对安全的研究兴趣也越来越浓。于是开始考虑是不是要转入安全领域,这一年我已经29 岁了,即将而立。比我小很多的人,早已是安全领域知名的人物了。我擅长的应用开发系统分析,都将随这一选择全部被抛弃,进入一个陌生的领域,我能行吗?但我已深深被研究安全的乐趣所吸引。于是给几家大的安全公司,包括启明和绿盟都投过简历,但估计我以前没有安全行业经验,年纪也偏大,学历也不符合,所以基本没消息。
随着基金系统市场这块蛋糕减少,M公司内部也出现了很多分歧,当年老板找K总来成立研发中心是看中软件这块高利润蛋糕的,前面上千万的项目规模也让他对现在在竞争中开发式基金系统的价格如此跌价难以接受,软件开发这一块现在近4,50号人,但是收入却比以前要大幅萎缩。K总性格比较强势,以前软件业务很赚钱的时候,W老板能忍,但现在业务不好,W老板肯定希望做出很多调整,自然和K总的强势性格形成冲突。我预感到风雨既来,离开吧。正好冰河对我说北京LX安全事业部在招安全人员,他可以介绍我去,小榕也在那里。于是29岁生日那天,我正式向K总提出辞职,晚上和开发部门的兄弟告别,我喝了不少酒,就要离开自己一同成长起来的团队,心里也很难受。
说下K总,我一直很感激K总,他虽然性格比较强势,但确实是想做事也有能力做事的一个人,对我也很赏识,后来虽然和我意见不合,但基本都是明对明的。后来我还留在M公司的同事告诉我,K总最后和W老板闹翻,先是降级成部门经理,最后走人,而他一直器重的质检部经理。先后成了总监和总裁助理。03年底我接到过K总的电话问我怎样,听得出是想拉我再起炉灶,我当时在安全行业已经做出了些成绩站稳了脚跟,自然不会再折腾那个我已经放弃了的行业了。于是告诉他我很好。之后听说他做过很多行当,包括租虚拟办公室,再之后我在他BLOG上看到,全都是他拍摄的很专业的摄影照片,不知是他转成专职的摄影师还是就有爱好(这个爱好以前我没听说过)。后来,M公司软件部门大裁员,很多人都在公司红黑榜站点上大骂W老板心黑,没能力。我回复了一条:“我算是老一批的M员工了,在M公司当开放式基金项目的项目经理以及以后的研究策划部的经理,2002年底觉得公司在软件上的发展存在问题,就离开了M,做安全去了。公正的讲,M存在很多问题,比如家族企业,内部互斗,但是这些问题在其他企业的身上也一样存在。我在M学到了很多东西(虽然这些随着我行业的转向现在完全没用了),或许我离开的时机还不错,离开半年后,我的股份后来还是给我兑成钱了。漫骂是没多少用的,企业的问题不能靠漫骂解决,如果看不上这个企业,就离开他好了。我还是很佩服W的,白手起家能折腾到这个规模还是非常不容易的。”
从M公司走时,我历年来的积蓄是5万,化了1万多买了个笔记本,来到北京,又租了个在LX安全事业部附近的房子,又花了几千买了西服等行头,准备去LX安全事业部应聘。但从应聘反馈回来的信息是:技术上我虽然没问题,但是学历是个麻烦,非计算机专业的专科,在LX这样的大公司里,必须要总裁特批才能进去。我问这个总裁特批需要多久呢,对方说,至少3个月以上吧。我看了看荷包里剩余不多的钞票,想想至少3个月,没准是半年一年呢,我这荷包可等不起,而且春节要来了,好歹要赚点车票钱和回家给小辈的压岁钱,看来只能另谋出路了。
12-安全生涯之冲击波(2003)
于是,我来到A公司。A公司是一家在北京做安全的小公司,他们的总工一直和我在QQ上有联系,所以我很快就进去了,里面还有几个技术不错的人,其实我来这也就是混个过年,开年再想办法,其实我很感谢这位总工,很明显他也知道我的这种想法,知道我在A公司呆不长,但还是让我进去混了一个月的工资,春节放假时还给我发了1000块的红包。还破天荒带我去和YUANGE吃了个饭介绍了我一下,当时YUANGE已经是安全技术圈子里的神话,当然没有听说过我。所以后面就是总工和YUANGE在上面侃侃而谈,我就在下面大口吃肉。顺便提下YUANGE,YUANGE让我影响最深刻的一篇文章是02年就有一篇关于UNICODE短整数表示长度的方式会有可能触发溢出的文章。若干年之后,某个知名0DAY漏洞爆光,我马上就联想到了这篇文章,看来当年YUANGE写这篇文章时,很大可能就已经藏着了这个0DAY。
在A公司也杂七杂八做了一些活,这个时候,我开始通过汇编逆向加动态调试方式,分析了多个微软未公开的协议,如SQL的TDS的协议。另外就是首届XCON开了,我凑了个<溢出植入型的木马>做为议题,参加了XCON,这个想法其实我觉得还是非常有意思的,不过后来基本不碰木马的方向了,也就没怎么研究了。议题结束时候,有幸被WRANG3大牛问了几个尖锐的问题,仓促应对完狼狈下场。会上也认识了不少安全技术圈的人,还有ILSY,当然是相逢一笑泯恩仇。
混过了年,再回到北京,我先委托STARDUST帮我介绍去绿盟,不过很久也没回复。看看自己的口袋,也急了,这时STONE对我说可以介绍我去启明,于是我就来到了启明应聘。比想象中简单,很快我就进到启明的攻防实验室。开始做漏洞分析的一些技术研究。当时分析了很多缺乏技术说明的漏洞公告,这个阶段,让我对安全漏洞机智和攻击手段有了更多了解。虽然接着就碰到了SARS,在家呆了很久,还是写了大量的漏洞机制分析发布在XFOCUS的内部论坛。7月份,微软的MS03-26漏洞公告通报RPC DCOM有严重的远程安全漏洞,当时所有的WINDOWS操作系统都受影响。鉴于此漏洞的严重程度,微软和发现此漏洞的LSD组织都不给出任何细节,这意味着安全厂商必须自己去分析安全漏洞机理。
当时还没有BINDIFF这样的工具,漏洞的分析和重现靠人工分析,所以当时漏洞补丁到分析出来的周期大致是20天以上。攻防实验室经理的蔡晶晶对我说,赶快去分析吧,这可能是WINDOWS历史上最严重的安全漏洞。于是我开始了独自的分析和调试,3天后,发现了一个新的RPC拒绝服务漏洞,5,6天后终于再现了这个漏洞。漏洞分析文章写出来了。于是我找BENJURRY和XUNDI帮助翻译和增加了一些其他系统的JMP CODE,以XFOCUS的名义投寄到BUGTRAP上。我也没想到这一投寄,引起了很大的风浪,这是世界上第一个公布的该漏洞细节的文章,被美国的HDMORE修改后转载,很快在安全社区到处流传。由于那个时候绝大部分用户还没有打补丁的习惯。因此就意味着这个漏洞会影响当时很多WINDOWS系统,可能会形成蠕虫;微软立刻召开了记者会指责XFOCUS没有通知他们就发布了这篇文章。BUGTRAP上,全世界黑客都在用此文章给出的POC进行修改、验证。8月初,冲击波蠕虫如期而来,瞬间影响了上千万台主机,随后还有数十个蠕虫使用了这个漏洞,造成了巨大的损失,XFOCUS组织也被推到风口浪尖上。国内外的批评紧跟而来,我只接受了一个国内媒体的采访,阐述了我的看法:安全不是靠黑客不知道来保证的。这是一个针对已经修补的漏洞的技术分析文章,他不触犯任何法律和安全行业行规,因为漏洞已经被厂商修复,但是用户缺乏打补丁的意识导致的,降低用户损失的关键是教育用户及时打补丁。之后当BINDIFF这样的工具出现之后,重大漏洞从补丁到分析出来的时间周期已经缩短到3天,但用户打补丁的意识却被教育起来之后,安全损失则会大大降低。
当然冲击波事件,也让我开始正视,作为安全人员,一些行为确实可能会给用户带来危害。不可否认,我发布的POC被冲击波直接利用到冲击波代码里,虽然发布它们不违反法律和行规,但确实应该多考虑一下事件之后可能带来的损失。可以更加专业和职业一些,这是我在冲击波事件中学到的东西。
但无论如何,这篇技术分析文章让我正式成为一个被安全圈认可的安全研究人员,我以前的文章也开始被人关注。我2002年发现的2个微软的安全漏洞,当时由于给微软漏洞接收组发邮件,3个月都没收到回复,所以就公布在了XFOCUS的文章里,也没什么人关注。但是冲击波后不久,我发现居然被国外一个安全研究组织一起上报给了微软并修复了。我虽然没有完全的证据,但猜测应该是看了我的文章,想到这些老外也得折腾看我们汉语写的文章,也算为汉语普及做了点贡献。冲击波事件里,我应该感激的人包括:蔡晶晶,启明的领导,BENJURRY和XUNDI,帮助我翻译,并增加了一些JMP CODE并发布到BUGTRAP上。XFOCUS的其他兄弟,在我遭受指责时和我共同承担了指责。
13-安全生涯之新的研究(2003-2004)
2003-2004年研究的方向主要是一些系统机制与攻击利用技术上的研究。03年除了分析了WINDOWS认证过程与SMB协议外,主要的一个工作就是做了很多WINDOWS堆的分析。WINDOWS的堆除了前人分析出来的CHUNK结构和FREE链表外,整个堆的管理也是非常有趣的,如堆节的管理,扩展后的回调函数,堆块的融合过程,LOOKASIDE表。利用一些堆的特性,可以实现一些很难利用的堆溢出的利用,当初曾准备过一个议题,就是针对当时出的一个很难利用的堆溢出,利用堆的融合时的操作,巧妙地绕过这个限制实现利用,不过最后还是没找到合适的场合讲。之后,微软逐步增强了对堆上面的保护,WINDOWS 2003 SP1首次增加了链表一致性的检查。2003年的XCON,我的议题是《WINDOWS 2003堆保护的饶过利用》就是针对当时WINDOWS 2003 SP1检查机制不完善,只针对摘链表做了检查,对插入链表没有做检查,攻击者可以伪造堆头构造释放,在插入链表时绕过保护。并且提出了将利用堆栈伪造符合条件的思路,可以将堆溢出转化为堆栈溢出的方式,之后沿着这条思路美国的Matt Conover(shok)找到了更好的方法,通过触发LOOKASIDE表使用形成天然的符合条件的方式,可以获取把任意内存当作一个堆CHUNK分配给用户任意使用来达到利用。MATT是安全领域的传奇少年,10几岁时就写出了的世界最早的堆溢出原理文章。在堆溢出领域研究非常深入。
2004年,我的研究重点先是转到WINDOWS内核远程溢出上,这一块以前全世界都没有人公开发布过相关的技术。正好赛门铁克的个人防火墙出了一个WINDOWS内核的远程溢出,之前我对内核也没什么接触,搞内核的溢出利用确实需要对内核很多机制有深入的了解,这一块,得到了科技师傅的大力帮助和支持,遇到对内核机制不了解的地方,科技就象一个活字典帮我解答一些疑难问题,终于成功实现了WINDOWS内核缓冲区远程溢出的稳定利用,在XCON上公布了WINDOWS内核远程利用的关键技巧但是没有公布代码。也被赛门铁克的报告里认为是世界上首个公布WINDOWS内核缓冲区远程溢出利用技术的演讲。这个演讲之后被SOBEIT分析研究做了改进公布出了代码。
这时我的兴趣逐步转向了漏洞挖掘,在这之前,漏洞挖掘基本靠人逆向分析源代码,比如yuange就是大家公认的肉眼挖掘机。2004年前我发现的几个安全漏洞都是靠很长时间协议分析和手动测试,逆向分析,花了很多时间才分析到,觉得这样找安全漏洞效率太低下。2003年SKIPE工具第一次把模糊FUZZ的思想引入了漏洞挖掘,取得了很不错的效果,但是SKIPE毕竟只是个简单的工具,还是很难有效去找更多安全漏洞。我当时就想,如果实现一个由异常监视,模糊器和自动化测试模块组成的框架,应该就能让测试程序自己去找安全漏洞,多配一些机器,找寻安全漏洞的效率会高很多。于是和科技师傅一起深入探讨了一些WINDOWS异常的表现,处理的机制等技术问题后,然后我写出了个原形展示给科技师傅看,科技也很感兴趣,又提出来可以做自动模拟键盘和鼠标的功能,于是按照样本模糊器策略,异常监控,自动化实施组成的FUZZ框架很快成型,我和科技马上投入使用,效果非常显著,在我们测试的头两星期,就找到了一批微软产品的安全漏洞。于是我们整理出来3个,我发现的2个,科技发现的1个。发信给微软负责接收漏洞的邮箱。意料之中过了2周,没有任何响应,于是我们发布给漏洞公告的专业组织CVE,等CVE确认之后,这时微软还是没有什么响应就公布了出来。自然又引起了微软的一通公告式的指责。但我觉得作为我们安全厂商已经做到自己的义务了,主动联系你但你没响应,这样我们也是先提交CVE再公布的。后来当时的微软安全主管ANDREW CUSHMAN和我联系时又提及此事,我告诉他我们写了漏洞报告给微软,但是微软直到现在也没给我们回复过。他回去让人去查接受漏洞报告邮箱,果然找到了我们提交的报告,还没人打开阅读过。他向我表达了歉意并表示会整改此事,之后微软对来自中国的安全漏洞报告的响应速度就及时了很多。这几个漏洞中,值得一提的是ANI的整数溢出触发堆溢出的利用EXP,整数溢出触发堆溢出后由于拷贝的数据是整个表达范围的长度,注定都是会触发异常的,WINDOWS在堆栈之下可以利用SEH来在触发异常时获得控制权,但是在堆溢出中就缺乏这样的一个控制通道,而且堆被破坏之后很容易异常。但是在IE下面,攻击者存在很多可以控制堆内存布局的手段,这个就EXP就是生成多个HTML元素,利用HTML元素在堆上面的对象包含了大量函数指针,而且这些函数指针会被多线程例程调用,这样就有很大的几率在异常之前获得控制。这么多年来,微软产品的安全获得了足够的改进,但在IE上面,由于攻击者可以借力的渠道太多,而且大量流行的第三方的控件的机制和代码质量难以约束,IE的安全问题还是非常严峻。
14-安全生涯之黑客游戏(2005)
随着我们公布安全漏洞的增加,我们关于漏洞挖掘的研究显然引起国际安全社区的注意,不久我就收到了美国知名安全公司EEYE首席技术官的邀请,让我去美国EEYE工作,在办好H1B签证之前可以在国内工作,待遇让我无法拒绝。当时我已经32岁,在启明的工作虽然很开心,启明的氛围不错,但是买房的压力也是相当的大。毕竟我已经不是21岁。
启明非常大度地让我离开了,回首在启明的日子,我是应该对启明抱有感恩之心的。在启明我成了一个真正的安全研究人员,启明里面的很多人传授给了我很多有用的经验和知识,帮助了我的成长。而启明管理者,至少对我,是非常宽容和大度的,虽然离开了启明,我还是要对他们真心说一声感谢。另外技术上对我帮助最大的是科技,说点科技的小八卦,他是一个不吃任何葱姜蒜辣椒等刺激品的人,他是舟山群岛的人,因为从小就不吃,所以非常敏感,有一次我在办公室吃一包花生,科技哥一脸严肃的走过来,要求我马上别吃了,因为花生里有大蒜的气味,他受不了。科技师傅还有很多怪习,比如不吃圆的物品,不吃面食。不过科技师傅在WINDOWS系统层的研究,确实非常深入,让我非常佩服,他至今还在启明。当然还有小波,村长等人,从他们那里我也学到不少东西。赵伟则帮助做了很多翻译的工作。另外,高端安全研究人员成为全球都比较紧缺的资源,在这之后,多家国际安全公司包括MCAFEE在内都在国内大举网罗高端的安全研究人员,毕竟他们可以用美国普通研究人员一半的薪水就能招到国内最顶尖的安全研究人员,比如MCAFEE挖走了小波,孙冰,SOBEIT;微软聘用了吴石和SOWHAT。基本上在XCON上作过PAPER的人,都会接到这些国外公司的OFFER。
EEYE那个时候在安全行业以漏洞挖掘和挂微软修补灯笼而闻名的一家美国公司,当时他的扫描器由于内嵌了能检测很多他们发现的但微软还没修复的安全漏洞而非常出名。他们还生产一些防火墙软件之类。我去之后主要的工作是帮助测试他们防火墙的安全和性能,不过所有研究团队的人,都有义务去找各种其他通用产品特别是微软的产品的高危安全漏洞,由EEYE报告给厂商,然后挂上灯笼。所谓灯笼就是报告厂商后,EEYE会出给公告,但不涉及到漏洞细节。根据厂商修复时间显示不同的警示信息,让很多修复时间长的厂商脸上不太挂得住。厂商修补出了补丁后,EEYE就会正式公告具体的漏洞细节和验证代码。
我还在国内办H1B签证,但给EEYE的工作已经开始了,CTO发了封邮件把我介绍给研究团队的成员,EEYE研究团队里有一群牛人,其中我最敬佩的是个美国研究员,发现了很多WINDOWS高危而且影响广的安全漏洞,我发现欧美的研究人员,一般对人比较友善,都主动发信给我过来致意。EEYE当时还有2个日本研究人员,当年做漏洞挖掘也很厉害,也爆了不少高危级的安全漏洞。其中一个还比较好,发了个邮件表示了下HELLO,另一个则明显不太友善,什么表示也没有。过了2天,CTO发邮件给我说,那个没表示的日本研究员希望和我做HACK GAME,就是比谁在最近几个月内,发现的安全漏洞越多,高危级越严重,谁就是胜利者,问我是否应战?我一笑接受了。
于是,我买了4,5台当时最高配置的机器,放在家里,每个机器上都开了多个虚拟机,除了给EEYE的产品做测试外,连天连夜用自己写的FUZZ工具去做漏洞挖掘。我是憋着一口气,所以一个个安全漏洞被找出来后,我马上加班加点做分析报告提交给EEYE,微软产品的,FLASH的,REALPLAY的,纷纷上了EEYE的灯笼榜,个数已经远远超过了EEYE的其他人,包括这个日本人;但我知道,不发现一个能通过常见服务远程利用的,理论上可以导致蠕虫级高危级的安全漏洞,这个日本人是不会服气的,于是又去测试一些系统默认会开启的RPC服务的进程,很快就找到了MSDTC RPC服务的高危级远程安全漏洞;不过这个漏洞按普通的理解是比较难利用的,但是我发现通过一些攻击技巧是可以实现非常稳定的利用。当这个漏洞提交上去后,这个日本人表示了下置疑,我早有准备,提交了稳定利用的SHELLCODE给EEYE,之后,再没听到这个日本人提起黑客游戏的话题了。