《反入侵的艺术——黑客入侵背后的真实故事》试读:第1章 赌场黑客轻取百万美金

第1章 赌场黑客轻取百万美金 每当某些软件工程师认为“没有人会劳神地去干那种事”的时候,总会有一些芬兰的年轻人来找麻烦。 —— Alex Mayfield 当把一次让人心动的诱惑也能想象成栩栩如生的具有三维真实效果的情景时,赌徒产生了,这是一个着魔的瞬间,这一刻贪婪吞噬道德,而赌场的计算机系统成了下一座需要征服的山峰。那一刻想在牌局上或机器上只赢不输的念头确实出现了,但却令人大吃一惊。 Alex Mayfield和他的三个朋友所做的事情更甚于白日梦。与其他黑客一样,一开始他们也只是把非法入侵当作智力游戏,只是想看看到底能不能行得通。到最后这4个人成功地入侵了这个系统,Alex说,他们从那里赢了“大约一百万美金”。 20世纪90年代初,4人在高新技术行业当顾问,生活十分懒散。“你知道的,我们要去工作,赚些钱,然后就不干了,直到钱花光,再去找活干。” 拉斯维加斯距他们很遥远,那只是电影中的景象。所以当一家技术公司让他们编写软件程序,并出席在拉斯维加斯举办的高新技术会议时,他们迫不及待地抓住了这个机会。这让他们能够第一次踏上维城的土地,看到闪光灯为自己而开,并且所有的花费都有人负担,这样的机会谁也不会推辞。每个人还能在大饭店有一个独立的套间,这意味着Alex的妻子和Mike的女友也能加入这次快乐的行程。两对伴侣,加上Larry和Marco起程了,他们向往着罪恶城的美好时光。 Alex说他起先对博彩并不了解,而且也不知道能从它获得什么。“你下飞机之后就会看到所有的老太太都在玩老虎机,这看上去既有趣又讽刺。同时你自己也被浸润在这种氛围中。” 4人完成展览后,就与两名女士在饭店的赌场里玩老虎机,喝着免费啤酒,这时,Alex的妻子提出一个大胆的想法: “这些机器的工作不是建立在计算机的基础上吗?而你们这些家伙又是搞计算机的,难道你们不能做点什么好让我们赢得更多吗?” 一群人来到Mike的房间里,仔细商量研究机器的工作原理。 1.1 研究 那仅仅是个导火索。4人“对那一切都有些好奇,当我们回到家的时候,开始着手处理这件事情”,Alex一边诉说,一边重温过去的时光,曾经的创造激情还历历在目。研究没进行多久就证实了他们最初的猜测。“是的,它们都建立在计算机程序的基础上。所以我们都非常感兴趣,想找出一种办法破译机器的密码。” 曾经有人通过替换固件来破坏老虎机的系统—— 触及机器内部的芯片,将原来的程序替换成比赌场预期提供更多诱人回报的版本。有些人就是这样做的,但是这样做需要一个赌场雇员的协助,而且不是任何一个雇员都行,必须是通晓老虎机运行的雇员。对Alex和他的朋友而言,“更换老虎机内ROM的程序数据就像给老太太当头一棒并抢走她的钱包一样。”他们认为这样是对自己编程技巧和智力的一种挑战。并且,他们在社会技能方面没有天赋,他们是搞计算机的家伙,不知道怎么偷偷地去接近那些雇员,让别人为自己做事,并且回报的钱还不属于自己。 那么他们是如何开始解决这个问题的呢?Alex解释道: 我们想知道我们是否真的能够精确地预测扑克牌的顺序,或者说能够找到一个后门(可以允许非法访问内部程序的软件代码),一些编程人员为了获利事先会留一些后门。所有程序都是由这些人员开发的,而这些程序员都是些爱搞恶作剧的家伙。我们想也许瞎猫能碰上死耗子,撞见一个漏洞,比如随便敲击键盘就能改变赌场的投注赔率,或者仅仅发现我们可以利用的后门。 Alex读过Thomas Bass撰写的Eudaemonic Pie (Penguin出版社,1992)。故事讲的是20世纪80年代一群搞计算机和物理研究的家伙袭击了拉斯维加斯的轮盘赌博系统,他们发明研制了一种烟盒大小的便携式计算机,用这个“可穿戴的”计算机去预测轮盘赌博将产生的结果。他们让一个人坐在桌边按下按钮向计算机输入轮盘转动的速度,以及球转动的情况,一会儿计算机就会产生一些信号,通过无线电波将这些信号发送到助听器,另一个成员就可以通过助听器听到这些信息。他解读这些信息后,在正确位置投下赌注。通过这种方式,他们理应可以从赌场带走大把大把的钞票,但事实并非如此,在Alex看来,“但他们的计划是很有潜力的,只是因为技术不可靠和效率不高,这项计划遭遇到很大的困难,并且,参与的人员太多,所以言行和人际关系又成了一个问题。我们决定不再重复他们的错误。” Alex认为攻击一个以计算机运行为基础的游戏系统应该要容易一些。“因为计算机运行的数据是完全确定的”—— 输出的结果必须以输入为基础,或换句老一代软件程序员的话来说:“进去的是正确的数据,出来的就是正确的数据。”最初人们用怀疑的眼光看待计算机运行,造了一个俗语“进去的是垃圾,出来的也是垃圾。” 这一切正中他们的下怀。Alex年轻时,曾是个音乐家,加入过流行乐队,梦想成为一名摇滚明星。但那个梦想落空了,转而开始学习数学。他有数学天赋,虽然对自己的学业从不关心(大学时辍学了),但他的所学已经为他当黑客打下坚实基础。他决定先做些调查,因此去了华盛顿特区,在专利局的阅览室呆了一段时间,“我猜准有些人会笨得将所有视频扑克游戏机的程序代码放在专利局。”显然,他猜对了。“那个年代将目标代码转储在专利局,让专利局办事员保管是维护个人发明创造成果的正常途径,因此代码里肯定有对成果十分详尽的描述。但这个成果的使用界面不会十分友好。我将成果的目标代码拍成缩微胶片,并对书页上我所感兴趣的所有用十六进制描述的程序段进行了扫描。然而这些内容必须反汇编成便于解读的程序段。” 分析代码的过程中,这些家伙发现了其中的一些秘密,这引起了他们的极大兴趣。他们认为唯一能取得实质性进展的办法就是去弄一台与他们所要攻击的型号一致的机器,那样的话就可以仔细研究那些代码了。 作为一个团队,这些家伙堪称绝配。Mike是一个极其优秀的程序员,而且在硬件设计方面比其他三人更厉害。Macro也是一个了不起的程序员,他是东欧移民,看上去像一个十几岁的小伙子。但他有点冒失,将任何事情都看成小菜一碟。Alex在编程方面是个能手,同时对他们需要的加密技术也很了解。Larry不太擅长编程,而且因为一次摩托车事故导致行动不便,但他是一个十分能干的组织者,他组织所有工作走上了日程轨道。队里的每个成员在每个阶段都集中精力完成自己的任务。 初步的研究完成后,Alex差不多把购买老虎机这个事情给忘了。但Marco一直对这项计划念念不忘。他一直要求坚持做下去:“这也没什么大不了,有13个州允许个人购买这种机器。”后来他成功说服其他人试一试。“我们想了一下,觉得没有什么关系,就大伙共同凑齐一笔钱,准备再往维城跑一趟,并买一台这样 的机器。”于是他们再次聚首维城。这次来花的是自己的钱,而且心中也另有打算。 Alex说道:“要想买老虎机的话,你得首先向他们出示身份证,以核实自己所在的州是否允许个人合法拥有老虎机,而且还要出示驾驶证,以检查所发放的州是否也允许此举。其实他们提出的问题真的不多。”他们当中有人与一位内华达居民有着亲密的关系。“他似乎是某个家伙的女朋友的叔叔或其他什么亲戚,而且他就住在维城。” 他们推荐Mike与这位先生去谈,因为“他的言行举止颇具推销员的风度。而且长相体面。对这种产品,人们通常会认为我们购买这种产品是为了非法聚众赌博。这就像买枪支一样,非常容易走火,”Alex解释道。许多这种机器都是在非正常渠道—— 黑市进行交易的。交易的地点通常有社交俱乐部等。更令我们吃惊的是:“我们可以买到与赌场一模一样的产品”。 Mike花1500美元买下了一台机器,是日本产的。“然后我们两个就将这些该死的东西放在车的后座上,然后载着它回家,仿佛载着一个婴儿。” 1.2 黑客技术日趋成熟 Mike、Alex和Macro将机器搬到房子二楼的空卧室里。这种刺激的经历让Alex久久不能忘怀,并将它视为生活中最令自己兴奋的一件事情。 我们打开机箱,取出ROM(只读存储器),并想知道它用的是什么处理器。我决定将这个日本产的机器改装成为非品牌产品。我猜想那些工程师现在也许工作压力更大了,他们过去有些懒惰和马虎。事实证明了我们的猜测。这台老虎机用了一片6809芯片,与苹果二型或Atari用的一样的6502芯片。这是一个8位芯片,有64KB的存储空间。我是一个汇编程序员,因此对这一切都十分熟悉。 Alex选中的是一台已经在市面上出现了10年之久的机器。当赌场想要购买新型机器时,要经过拉斯维加斯博彩委员会的同意。同意之前,委员会必须对机器的程序进行仔细研究,保证游戏机对所有的玩家都是公平的。让一款新机器的设计通过审核将是一个冗长的过程,因此赌场机器的使用年限通常比预期的要长。对黑客人员来说,旧机器就意味着过时的技术,这样,他们攻击赌场系统就不会很复杂,反而会相当容易。 他们从芯片上下载的计算机代码是二进制的机器代码形式。0和1的字符串是计算机指令系统的最基本表示形式。为了将这些代码转换成方便阅读的形式,首先他们得做一项逆向工程(reverse engineering)—— 程序员用来了解机器是如何设计的过程,也就是说,他们需要将机器语言转换成他们容易操作和解读的形式,以便理解。 Alex需要一个反汇编程序(disassembler)来转换这些代码。为了解决这个问题,他们把目光瞄准了软件—— 这种行为无异于去图书馆找书,仿照书里所描述的方法去造炸弹。这些家伙开发了自己的反汇编程序,Alex描述他们的工作“不是轻而易举的,但有趣而且较为简单。” 当视频扑克游戏机的代码通过新的反汇编程序反汇编之后,这三个程序员就坐下来开始仔细地审读这些相对容易理解的汇编程序。通常,对于那些娴熟的程序员而言,在程序里找到他们所需要的程序段是比较容易的。因为编程的时候,通常要标明所有的“路标”—— 注释、标记等,这些都会将特定的程序段解释清楚,这些有点像书的篇章结构,有章题、节题,章节里面又有小标题。 通常来讲,当人们编写的程序被编译成所需的机器代码后,这些“路标”都被忽略了。因为计算机或微处理器根本不需要这些注释。所以通过逆向工程反汇编回来的那些程序根本不包含任何注释。为了与前文的比喻“路标”保持一致,这些反汇编过来的代码就像一张光秃秃的地图,而上面没有地名,没有高速公路和街道的标志。 他们在屏幕上仔细查看代码,搜寻所有蛛丝马迹,希望能得到这些最基本的答案:“这些是以什么逻辑编排的?扑克牌是怎么洗牌的?那张被替换的牌是如何抽出来的?”这些问题的共同之处让他们将目光锁定到了随机数生成器上。Alex猜到程序员编写这些机器代码时也许会因偷懒而走捷径,因此他们设计的随机数产生的程序应该有后门可寻。这个猜测后来又被证明是对的,他们找到了后门。 1.3 重写代码 Alex在讲述自己的杰作时颇为得意:“我们是程序员,对自己的东西了如指掌,我们明白代码中的数字如何对应机器中的扑克牌,然后我们就重写了一段C语言代码,与该型号机器完成同样的事情”,他说道。他们是使用C语言编写的程序。 这极大地激发了我们的兴趣,我们夜以继日地赶工。我敢说在两三个星期的时间里,我们就找到并掌握了代码运行的机理。 你看到它,从而做出一些推测,再写出一些新的代码,将它写到只读存储器(计算机芯片)中,再将它放入机器中,然后等着看会发生什么事情。我们可以做一些诸如编写程序的试验,这些程序能在计算机屏幕上的扑克牌背面显示十六进制数字。所以我们基本得到一些如何处理扑克牌的设计规则。 我们结合使用了试错法和自上而下分析法,这样很容易就能理顺程序所表示的意义。所以我们也就彻底搞清了机器内部的数字是如何与屏幕上的扑克牌关联在一起的。 我们希望程序里的随机数的产生能够简单一些。在20世纪90年代初,情况的确如此。我稍微研究了一下,发现这些程序基于Donald Kunth早在20世纪60年代就提出的一种方法。这些家伙没有一点自己的创新,他们仅是将别人现有的成果套上Monte carlo方法,然后就填入了自己的代码。 我们猜得对极了,他们就是用这种算法来发牌的,这就是所谓的“线性反馈移位寄存器”,这是产生随机数的一种比较好的算法。 但他们随即发现这个随机数生成算法存在一个致命的漏洞,这样使得他们的工作更加简单了。Mike解释说这是一个相对简单的32位随机数字生成器,所以攻击其他系统程序的计算复杂度也在可接受的范围之内了。经过一系列的优化之后,程序变得更加简单。 因此,这样产生的随机数并非真正意义上的随机数。Alex给出之所以出现这种状况的一个解释: 如果数字真的是随机的,投注赔率根本无法设置。他们无法知道确切的赔率是多少。有时一些机器可能会按照某种规律产生同花大顺,然而这根本不应该出现。因此一些设计者希望能够证明自己的设计能产生随机的数据,或者证明他们没有控制游戏的结果。 设计者们设计机器时另一个没有意识到的问题是,其实他们所需要的并不是随机数生成器。一般来说游戏中的每一局会发10张牌,首先发5张,然后玩家观察手中的牌,如果他决定换牌,就先扔掉一张牌,再得到一张替换的牌。可以一直换牌,直到10张牌全部发完。在这种机器的早期版本中,这10张牌通常是通过随机数生成器一次产生的。 因此Alex和他的伙伴认识到这种早期游戏机的程序指令编写得非常蹩脚,当看到这些错误时,他们觉得自己可以写一个更简单却更灵活的运算程序来攻击现有的程序。 在Alex看来,他们得先在赌场玩玩,看看那里机器上首先发的是哪5张牌,然后将这些数据输入家里的计算机上,计算机认清了这些牌后,运算重写后的程序,计算出程序运行到什么位置,从而计算出再产生多少个数字会出现同花大顺。 因此我们测试了这台机器,让它运行我们编写的一些小程序,它准确无误地告诉了我们将要产生的扑克牌顺序,这让我们兴奋不已。 Alex将这种兴奋归结于“知道自己比别人更聪明,能打败他们,而且还能从中捞一笔钱。” 在商场购物时,他们看到了一种娱乐场所用的倒计时腕表,时间能精确到0.1秒。他们不假思索地买了三只—— 去赌场的每人一只。Larry将呆在家里操作计算机。 现场演练的准备都已就绪了。兵分两路:一路人马到赌场去玩牌,5张牌发完后,将自己手中牌的点数和花式都告诉Larry。Larry就将这些数字输入到他们自己的计算机。这台杂牌计算机,融合了菜鸟与行家的智慧,它内部芯片的运行速度比日本生产的视频扑克牌游戏机快得多。因此用在这上面真是太适合不过了,仅花片刻功夫就计算出了赌场计时器开始倒计时的精确时间。 当倒计时结束时,在老虎机旁的这些家伙就按下“开”按钮,但这个动作必须在一秒钟之内完成,要非常精准。但正如Alex解释的那样,问题没有想象的那么复杂: 我们其中的两个曾是音乐家,如果你也是的话,就会对节奏特别敏感,能在大约0.005秒内按下一个键。 如果事情如预期发展下去的话,将会出现他们久候的同花大顺,他们在自己的机器上不断试验练习,直到每个人都可以以高命中率击中同花大顺。 前几个月的时间,用Mike的话说就是“更换机器的运算程序,明确知道随机数字怎么变成屏幕上的扑克牌,随机数生成器以什么效率和什么方式产生一次结果。掌握了这种机器的‘癖好’”,根据这些编写了一种将各种变数都考虑在内的程序。因此在某一特定时刻,只要我们知道一台机器当前的运行状态,我们就可以有把握地预测出接下来几小时甚至几天内任何时候生成器的运行状态。 他们打败了这台机器—— 将它变成了自己的奴隶,经受住了黑客要经受的煎熬和挑战,并且胜出了。知识能帮他们赚到大钱。 白日梦确实挺吸引人,他们能否美梦成真呢? 1.4 重回赌场—— 进入实战 在私人的并且安全的地方摆弄自己的机器是一回事,而坐在吵闹的赌场里,并且试图偷取他人钱财却是另一回事了,那需要巨大的勇气。 女士们认为这次出门简直是活受罪。男士们让她们穿上束身裙装并要求她们在言行上装腔作势—— 玩牌、聊天、笑得咯咯响、要求端上饮料等—— 目的就是让她们漂亮的脸蛋和迷人的身材将监控室里的人的注意力转移。“所以我们尽可能在那些事情上夸张一些”,Alex回忆着说。 他们希望自己显得与赌场环境相协调,掺和在人堆里,不露痕迹。这一点“Mike做得最好,他有些秃顶,与妻子搭配看上去就像一对典型的夫妻玩家。” Alex描述这些场景时,仿佛就发生在昨天。与Macro和Mike的实施方式稍有不同,Alex是这么做的:首先与妻子选好赌场和一台视频扑克牌游戏机。然后他们需要准确地知道机器内部运行到计算周期的哪个阶段。为解决这个问题,他们将一个摄像机装在背包里,带进赌场,把镜头对准游戏机屏幕进行拍摄。他回忆说:“将包放在一个准确位置,能对准屏幕,同时又不让人感到有什么异样,的确不容易。你不能做任何可疑的动作引起别人注意。”而Mike喜欢用另一种方法,那样不需要这么大的动作:“对任意一台机器,我们通过屏幕上两次发牌的时间间隔来计算它运行一个周期所需的时间。但时间间隔通常会达几个小时之久。”所以每次坐在屏幕前时,他首先得确定离开的时间里机器没有额外的程序在运行,因为那样会改变程序反复运行的速度。但要确定很简单,只需要看看屏幕上的牌是不是还和原来保持一致。而实际情况是牌通常都一样,因为要下大赌注的机器不会开得那样频繁。 当机器第二次发牌时,他按下计时器,同时打电话给Larry,告诉他机器运行的位置和发牌的情况,Larry将这些数据输入到家里的计算机。计算机将计算出下一个同花大顺出现的时间。“你希望仅仅是几个小时,但有时它需要几天”,如果出现这种情况,他们不得不换台机器重新开始,有时甚至得换家旅馆。 有时很早就回到自己的机器旁,但位置还是被别人占了,这时Alex和Annie就先玩玩其他机器,一见别人离开,Alex立即坐到原来的机器旁,Annie则坐到相邻的机器旁,然后他们开始玩牌。在玩牌过程中,他们要装作玩得十分开心。接着就像Alex回忆的那样: 我开始自己的游戏并小心地同时按下计时器,当牌发下来的时候我将5张牌的花式和点数牢牢记住,然后接着玩牌,直到我已看见8张牌。这时我点头告诉老婆,我要去赌场外边找个不起眼的公用电话机打电话,我必须在8分钟内找到电话机,打电话,然后回到座位上。而Annie在8分钟之内则不得不一直跟别人说那个位置是她老公的。 因为赌场的人通常会窃听我们的电话,所以不能把牌说出来,于是我们想了一种办法,将牌的信息通过电话的数字键发到Larry的寻呼机上。Larry则将信息输入到计算机,然后运行我们的程序。 然后我再给Larry打电话,Larry就把电话听筒放到计算机旁,计算机则会发出两组信号声,当第一组信号声响起时,我按下计时器的暂停键,不让它走表;当第二组信号声响起时,我再次按下那个键,这时计时器重新开始计时。 Alex报给Larry的牌可以让计算机找出机器随机数生成器的运行情况,计算机接受了迟来的命令—— 所以校对计时器非常关键。计时器必须与同花大顺出现的时间相吻合。 当计时器重新开始工作时,我马上回到机器旁,当计时器发出“嘀嘀咚”的响声时—— 就在那一刻,在“咚”响起的那一瞬,我按下了机器的按钮。 那是第一次,我赢了35 000美元。 我们有30%~40%的命中率。一切都进行得非常顺利,仅有的几次失手也是因为时间没有校准。 对Alex来说,第一次赢钱“确实令人兴奋,但也很害怕。赌场的老板是个双眉紧锁、颧骨凹陷的意大利男人。我敢肯定那天他看着我的样子很奇怪,满脸都是怀疑的表情,也许是因为在玩游戏的时候我一直在打电话。我当时认为他会去查阅赌场的录像带。”但除了紧张害怕,确实让我感觉非常刺激。Mike则记得自己当时“我不由自主地紧张,生怕有人看出破绽,但事实上没有人怀疑。我和妻子享受到与其他大赢家一样的待遇—— 受到人们的祝贺并收到许多小礼品。” 一次又一次地成功,他们不由得担心因自己赢钱太多而被别人注意。他们开始意识到自己正面临着奇怪的麻烦事—— 成功太多!“我们赢得上万美元的累积奖金,这的确十分惹眼。同花大顺的奖金是4000比1,如果在一台每注为5美元的机器上,那就是两万美金。” 他们因此一发而不可收拾。游戏中有一种累积赌注玩法,就是奖金不断累积增加,直到有人把这笔钱全部赢走。而这帮家伙就轻而易举地赢走了这笔高额奖金。 “我那次赢了4.5万美金。这时某个厉害的家伙出来了,他研究了一番机器,并动了手脚,还掌握了一串赌场工作人员没有的钥匙。他打开机箱,取出电子板,拿出只读存储器芯片,并将它放在大家的眼皮底下。他还随身带了一个ROM解读器,根据机器固件的副本来检测机器芯片,这个固件副本是锁起来用来对照固件是否更改的最后一道防线。 ROM测试标准化程序已经出现多年了,这个Alex知道。他猜想这帮人先前也知道此路不通,但最后还是采取了这个办法,把ROM检测作为自己的对策。 Alex的话让我产生了疑问,因为我在监狱里确实遇到将机器固件替换过的家伙,但如果赌场人员考虑到了这一点,自己进行了检测呢?我想知道这帮人要做得多么迅速才不至于被发现。这就得想其他的办法了。他们牺牲一些自己的安全,然后花点钱将赌场内的相关人员遣散。Alex猜想他们甚至将机器固件的副本都替换过了。 Alex坚持认为他们黑客团体技术的魅力就在于他们不需要更改固件,并且他们的技术面临的挑战更大。 伙计们赢得没有以前多了,他们猜一定是有人将过去所发生的事情掂量了一番,发现了一些苗头。“我们开始感到恐惧,怕被抓起来。” 除了一直害怕被抓之外,他们同样担心税收。因为每次赢钱一旦超过1200美元,赌场就会要求递交身份证以将收入情况报告给国家税务局。Mike说:“如果玩家不给身份证,就可以逃税,但我们不想因此而引起别人注意,以免被人发现。”其实交税本身不是什么大问题,但“我们却在那里留下了一条记录,就是靠赌博频频赢钱,这样会引起很多问题,以后我们在监控器下就束手无策了。” 他们需要想出另外一种办法。在短暂的开心刺激之后,他们开始寻找新方法。 1.5 新方法 这群家伙这次从两个方面下手:第一,想出一种办法可以让他们有不同的赢法,如满堂红、顺子、清一色等,这样就不会因每次赢法都一样而引起注意;第二,想出更简便的办法可以进行程序运算,而不用每次跑出去打电话。 赌场提供的日本产的机器数量十分有限,这帮家伙开始瞄准一种由美国公司设计的、功能更齐全的机器。他们以同样的方法拆卸机器,发现这种机器的随机数生成程序相当复杂:这种机器不是用一个生成器,而是用两个生成器同时工作。“程序员非常清楚一个生成器很有可能被攻破”,Alex总结道。 但他们4个人再次发现了设计者所犯的错误。“他们显然读过文献,知道如果加上一个寄存器,就可以改进随机数的任意性,但他们还是错了。”因为这样的话,扑克牌就是这样被决定的:第一个生成器的数字加上第二个生成器的数字。 对第二个生成器进行调用的正确方式是使用迭代—— 当第一个生成器工作完后,挑选出了一张扑克牌,第二个生成器对此进行迭代,从而改变扑克牌的花式或点数。但设计者们并没有那么做,他们仅让第二个生成器在每局开始的时候迭代一次,产生一个数字,然后第一个生成器产生的每一个数字都依次加上这个数,这样屏幕上的扑克牌就产生了。 对Alex来说,两个寄存器的使用是一种挑战,“涉及密码学的研究”,他知道那项技术有点像加密信息中使用的技术,他从前也学过这方面的一些知识,但还不足以使他攻克这个难题,所以他开始“造访”附近一所大学的图书馆。 如果设计者阅读加密系统方面的书籍时更仔细一点的话,他们就不会犯那样的错误。而且他们应更有效地检测系统,以防备我们的侵袭。 任何一个计算机专业的大学生,如果他明白一段程序欠缺什么了的话,他就能像我们一样写出代码。这当中最令人讨厌的部分是用尽可能快的方法找出算法,最好能够只花几秒钟了解机器的运行情况;反过来如果你对这一切不熟悉的话,可能要耗费几个小时。 我们真的是不错的程序员,至今我们仍以编程技术为生,我们的技术不断得到优化。我不认为这样很浅薄。 我记得Norton(在Symantec收购该公司之前)的一个程序员在开发Diskreet产品时犯过这样的错误:所做的应用程序允许用户自己创建加密虚拟驱动器。开发人员错误地执行了这段程序—— 也有可能是故意的—— 密钥的存储空间由56字节缩减到30字节。联邦政府的数据加密标准用的是56位密钥,这被认为是不可攻破的。Norton给客户的感觉是他们的数据都是以这个标准进行保护的。因为这个程序员犯下的错误,用户的数据其实仅是以30位加密的,而不是56位。即使在今天,仍可以用蛮力攻击30位的密钥。所有使用这种产品的客户都被一种错误的安全观误导了:黑客总能用自己的密钥在某个时刻访问到用户的数据。这些家伙在这种机器的程序里发现了同样的错误。 同时,伙计们在编写程序,打算用它在新的目标机器上赚钱。他们一再劝说Alex发明一种不需要跑到公用电话机的方法。这个答案来自Eudaemonic Pie上提供的办法:造出一个可穿戴的计算机。Alex设计了一种微型计算机,计算机的微处理器板是由Mike和Marco找到的目录纸板充当,并且与微处理器相匹配的有:一个适合放在鞋里的控制按钮和一个无声震颤器(就像今天手机中普遍用的那种)。他们将这个成果称作“口袋计算机”。 “在一个小芯片和很小的存储空间的基础上编写程序,我们得聪明一点”,Alex说道,“我们制作了一个漂亮的硬件,它不但适合放在鞋里,而且非常符合‘人机工程’。”我估计,这里的“人机工程”指的是该硬件很小,放在鞋里,人走起来不会一瘸一拐! 1.6 发起新一轮的攻击 新招数就要付诸实施了,他们都有些紧张。当然,他们可以免去那个让人起疑的动作了,不必在牌局的最后几分钟跑到公用电话机上打电话了。虽然在自己的“工作室”将所有动作都预演过了,但晚上的“表演”意味着面对一群实实在在的“观众”,而这些“观众”恰恰是始终警惕赌场安全的人。 因为这次程序设计不同,他们可以在一台机器旁坐得更久些,而每局赢的钱也少些,不会让人起疑,但赢钱的次数增多。Alex和Mike描述起当时的情景时,还有些后怕: Alex:我通常将计算机装在一个手提式晶体管收音机的壳里,然后放到口袋里。我将计算机的电线穿过袜子,一直连接到鞋子里的开关。 Mike:我将计算机绑在脚踝上。我们的开关是用小块的面包板做的(在硬件实验室做电路试验时使用的材料)。这些材料约一平方英寸,上面装有缩微按钮。我们在大脚趾上箍一根橡皮筋,在鞋垫上打一个洞,以确保它不会移动。偶尔穿上还不是太难受,但如果穿上一天,则是极其痛苦的事情。 Alex:然后你就走进赌场,装作很镇静,仿佛什么事也没有。你坐到机器旁,开始玩游戏。我们有一种编码,一种类似于摩尔斯码的东西。你投进一些钱,开启一个账户,这样你就不必一直投硬币了,然后一切就正式开始了。当牌发下后,你按下鞋里的按钮,将扑克牌的信息输入计算机。 从按钮输入的信息被输送到装在我内裤口袋里的计算机上。在早期的机器上,通常一次能拿到7张至8张牌。发牌拿到5张后,再抽3张是常事,这一共就是8张。 Mike:鞋里的按钮代码是二进制的,它所采用的压缩技术有点像Huffman编码。比如长-短就是0-1,也就是二进制代码的2,长-长就是1-1,也就是3,依此类推。任何一张牌不需要按三下以上。 Alex:如果你持续按着按钮超过三秒钟,那就是执行取消命令。并且计算机会给出一些提示,比如“嗒-嗒-嗒”就表示“OK,我已经准备好了。”我们为此练习过—— 你得认真学习才行。一会儿之后,我们就可以按按钮了,通常按动按钮的时候都会与一个赌场服务生聊天。 我曾试着输入代码来确认我的8张牌,通常是99%的准确率。在数十秒到一分钟的时间里,计算机会用蜂鸣器发出3次信号。 听到信号后,我就会做好一切准备。 这时,口袋计算机会找出机器运行程序的位置。因为这种程序与视频扑克牌游戏机的相同,所有每次新一轮发牌后,我们的计算机就知道处于等待中的是什么牌,而且只要玩家决定好丢掉哪张牌并将之告诉计算机,计算机将提示要哪张牌可以赢。Alex继续说道: 计算机通过震颤器发出信号告诉你该做什么。我们的震颤器是用旧寻呼机改装的,没花钱。如果计算机想让你拿第3张牌和第5张牌,它将会发出,“嘟,嘟嘟嘟-嘟-嘟嘟嘟”的信号,你可以通过震颤器感受到。 我们计算过,如果操作时小心一点的话,可获得20%~40%的抽头,这意味着在每手牌上我们较其他玩家有40%的优势。这个优势是巨大的,世界上最厉害的二十一点高手也只能达到2.5%的优势。 如果你坐在每注5美元的机器上,每次投入5枚硬币,一分钟投两次的话,那么这台机器的赌注就翻了5倍,成了25美金。半个小时之内,你可以轻而易举地赚得1000美金。每天都有人在机器旁走这样的好运,大约有5%的人花半个小时坐在机器旁就能获得这样的收入。但他们不是每次都能做到。而我们却每次都能做到满载而归。 他们在某个赌场赢走一大笔钱后,就会换个场地。平均每圈会换四五个地方。约一个月后,他们会回到原赌场,重新开始一圈。但他们会选择不同的时间去,因为这时赌场的工作人员都已经换过班了,所以这个时段的工作人员不会认得他们。他们同样会去其他城市的赌场—— 如里诺、亚特兰大等其他任何城市。 旅行、赌牌、赢钱渐渐成了日常工作。但有一次,Mike认为一直所害怕的事情就要发生了。他提高赌注,第一次玩了每注25美元的机器。赌注下得越大,就会越紧张,因为他们就会被监视得更加严密。 我有些紧张,但事情发展得比我想象的要顺利一些。我在相当短的时间里就赢了5000美元。然后一个体形彪悍的工作人员拍了拍我的肩膀,看着他的脸,我胃里有一阵恶心的感觉,心想:“终于来了。” “我发现你经常来玩”,他说道,“你喜欢青的(green)还是紫的?” 要是换作我的话,我也许会想:“什么意思?—— 他们是不是要把我打个稀巴烂,还要我选择打成什么颜色?”我肯定考虑把钱全部留在那里,然后立即逃跑。但Mike却很有经验,那一刻他的头脑仍然保持着冷静。 那个男的说道:“我们想请你喝杯咖啡庆祝一下。” Mike选了一杯生咖啡(green coffee)。 Macro也有紧张的时候。有一次,在他正等着赢牌的时候,一个颧骨凹陷的老板在他不注意的时候拍了拍他的肩膀。“你的回报将翻一番,能赢走5000美元,手气不错!”他有些惊讶地说道。邻座的一个老女人突然发话,她的声音因吸烟而变得沙哑:“这…靠…的不是运气。”那老板的脸一下子绷紧了,似乎起了疑心。“这是靠那个球!”那个老女人呱呱地叫道。老板笑了笑,然后走开了。 三年多的时间里,这些家伙不时做些正经的顾问工作,来延续合同和保持自己的技术水平。他们也时不时地跑出去,到视频扑克游戏机那里让自己的钱包鼓起来。他们又买了两台机器,其中一台是被广泛采用的视频扑克游戏机。他们还不断更新自己的软件。 旅行外出时,三个队员一般分头行动,进入不同赌场。“一起行动像个帮派似的。”Alex说,“我们偶尔会那样,但事实上,那样是愚蠢的。”虽然他们说好每个人无论去哪儿都要告诉另外的人,但有时也有人会偷偷独自溜到其他赌城去。但他们只会在赌场里干,不会去像7-11那种便利店或超市,因为那种地方的回报太低了。 1.7 落网 Alex和Mike都试着“规矩点,不那么张狂,以减少被盯上的可能性。他们中的任何一个人从来不会在一个地方赢太多的钱,从不在一个地方频频试手,在一圈里面也会收敛些,少赌几天。” 但其实Mike对待游戏规则更严肃。他觉得其他两个家伙不够小心。他坦然接受在一个多小时之内少赢一点,多看一点,就像其他普通的玩家一样。如果他一局中拿到两张A,同时计算机告诉他如果其中一张或两张都丢掉,那样可以拿到更好的牌—— 比如三个J,他不会那样做的。所有的赌场都有“空中电子眼”,楼上安全亭里有人正在盯着下面,数不清的摄像头在转动、聚焦、放大,寻找赌场作弊者、行为不轨的工作人员和其他被金钱诱惑的人。如果一个“观察员”恰巧通过镜头看到有人扔掉了两张A,他必定会起疑心,因为一个正常的赌徒决不会扔掉一对A的。如果不是在搞鬼,怎么会知道更好的牌就在后面呢? Alex就没有这么小心了。Marco就更别提了。“Marco就是有点自负”,在Alex的眼中: 他是一个极其聪明的家伙,自学成才,虽然高中没毕业,但绝对属于聪明的东欧高智商群体中的一员。不过言行高调,有点爱炫耀。 对计算机,他什么都清楚,但他始终认为赌场工作人员都是愚蠢至极的家伙。这些工作人员很容易给我们留下这种印象,因为他们一而再,再而三地让我们拿走那么多钱。但即使这样,我还是认为他太过自信了。 他是一个冒失鬼。他的形象与赌徒根本不符,因为他长得像个外国小朋友。所以很容易让人起疑心。并且他去的时候也不带个女朋友或女伴—— 那样会让他看起来更像外国小朋友。 我想他会栽在这些招人注目的事情上。并且,随着日子一天天过去,我们变得越来越胆大了。我们一步步地增加自己的赌注,那样回报会来得更多些,但同样,风险也大了。 虽然Mike不同意这么说自己,但Alex却暗示着他们就是冒险家,他们一次一次地铤而走险。就像他说的那样:“我们一步步向着危险的深渊逼近!” 那一天终于来到了。那时Marco刚刚在一台机器上坐下,就上来一群身材魁梧的保安将他团团围住,他们将他推搡着带到赌场后面的一间屋子里。Alex详细地描述了这一幕: 这太让人害怕了,你肯定曾经听说这些人将作弊者往死里打的故事。这些人以这些“名言”出名:“警察到一边去,这事老子要自己管!” Marco非常紧张,但他有着非常倔强的性格。事实上,在某种程度上说,我感到庆幸,被抓的是他,而不是我们其他任何一个,因为我认为他是最适合应对这种情况的。据我所知,他完全以东欧人的方式处理了这个问题。 他讲哥们义气,没有将我们供出。他没有透露任何与人同伙的事情。他紧张不安,但他在炼狱般的拷问中也没有屈服,仅告诉保安他是一个人干的。 他说:“嘿,我被捕了吗?你们是警察吗?能把我怎样?” 除了他们不是警察无权审问之外,这场审讯犹如一场正式的法庭审讯,这真让人不可思议。他们不断地向他提问,但没有对他实施暴力。 赌场的人给他拍了存档用的面部照片,并没收了他的计算机和身上所有的现金,一共7000美元。他们大约审问了一个小时,或更久—— Marco太紧张了,什么都想不起来了—— 最后他们放他走了。 Marco回家途中立即给他的搭档们打了电话。他听起来十分慌张:“告诉你们出事了,我差点被抓起来。” Mike一听到马上赶回“集中营”。“刚听到出什么事时,我和Mike都非常恼怒。我立刻把机器大卸八块,扔到城里的各个角落。” 因为Marco冒了没必要的风险,Alex和Mike都对他不满。Marco不愿像另外两人一样把按钮嵌到鞋里,而是固执地将它放在夹克的口袋里,并用自己的手操作。Alex描述Marco是这样一个家伙:“认为安全人员愚蠢无知,以至于他可以在人家眼皮底下不停地按那个家伙。” 即使不在现场,Alex也完全能推断出事情的经过(事实上他们三个都被蒙在鼓里,Marco并没有像他们所约好的那样,把自己的行程告诉其他人,而是偷偷跑去赌钱了)。Alex猜想事情是这样引起的:“他们发现他赢了很多钱,赢钱时,手一直在摸什么东西。”而Marco却从来不管自己的行为是否会引起别人的注意和怀疑。 虽然不能肯定这事对其他人意味着什么,但对Alex却意味着终结。“最初我们4个人就说好了,只要其中任何一个被抓的话,我们都要停止这样的行动。”他说:“就我所知,我们都遵守了这个约定。”但片刻后,他似乎不那么确定了:“至少我是这么做的。”而Mike表示他也是如此,但他们谁都没有直接问过Marco这个问题。 赌场一般不会像他们所认为的那样轻易起诉袭击者。“原因是他们不想将自己的漏洞公之于众。”Alex解释道。所以通常都发出这样的警告:“天黑前离开这座城市,并且保证从此再不踏进赌场半步。这样的话,我们可以放你一条生路。” 1.8 结局 大约6个月后,Marco收到从赌场寄来的一封信,告之将不起诉他。 他们4个人依然是朋友—— 当然已没有以前那么亲密。Alex估计自己大约从这个行当中赚了30万美元,其中一部分按照事先约好的付给Larry。这三个亲身经历了赌场风云的家伙,事先都曾许诺将会将自己的收入与其他人平分,但Alex认为Mike和Marco应该赚了40万~50万美元。Mike却坚持说自己只拿了30万美元,只是承认Alex所得确实比自己少些。 他们这样干了三年。撇开钱不说,Alex很高兴这一切结束了:“从某种意义上说,我解脱了。最初入侵的乐趣早消散了,而变成了一项工作,一项很危险的工作。”Mike看到这一切结束,同样不觉得可惜,还轻轻地抱怨那种事情“实在是太累人了”。 他们俩最初都不愿开口提及这件事情,但稍后他们却兴致勃勃地讲个不停。这也没什么奇怪的—— 自从10年前出事后,除了参与此事的老婆和女朋友,从没有对外人讲起过此事。这是第一次对外人提起,并保证匿名,这样讲讲也不失为一种不错的消遣。他们显然对其中的一些细节津津乐道,Mike承认这是他曾经做过的最刺激的事情之一。 我并不认为我们这样赚钱有什么不好,这不过相当于从那个体壮如牛的行业拔了根毛而已。老实说,我们从未受到良心上的谴责,因为那是赌场! 道理非常明白:我们是从赌场骗了钱,但赌场却通过让老太太们玩她们永远不可能赢的游戏,从而骗得了大把大把的钱。拉斯维加斯想让所有人都迷恋那个吞钱的机器,然后一点一滴地吸干他们身体里的血。我们仅仅是替玩家们向假仁假义的“老大哥”报仇,而不是偷窃那些可怜的老太太的钱。 他们将一个游戏摆在我们面前并跟我们说,“如果你能挑中正确的牌,你就赢了。”我们挑中了正确的牌。赌场要做的是不让任何人挑中正确的牌。 Alex说他今后再也不会干这种事了。但他的解释却是你想不到的:“我已找到其他赚钱的门道了。但如果我的经济状况和以前一样的话,我还会那么干的。”他将自己曾经的所为看作理所当然的事情。 在这场猫和老鼠的游戏当中,猫不断地揣摩老鼠的伎俩,并采取相应的对策。今天老虎机里的软件设计得好多了,如果这帮家伙还打算入侵的话,真不敢保证他们还能成功。 当然,对于安全问题,没有人能说他找到了万无一失的解决办法。就如Alex所说的那样:“每当开发者说,‘不会有人劳神去干这样的事情’,总会有一些芬兰的年轻人来找麻烦。”并且不只在芬兰,在美国也是如此。 1.9 启示 在20世纪90年代,赌场和机器的设计者们没料到那些漏洞日后会给他们带来如此大的麻烦。伪随机数生成器并不能真正生成随机数。相反,他们仅将一串数字任意地排好序。在这里,是一串非常长的数字:2的32次方,即40亿个数。程序每重新开始运行一次的时候,它只是在排好的数字列表中任选一个位置作为开始。因此其实直到下一个循环开始前,当前循环中后面的数字都是确定的,并可以计算出来。 通过将软件进行逆向工程,这群家伙获得了这个数字列表。通过发牌,知道了列表当中几个“任意数”,他们就可以找到正在运行的列表位置,从而知道接下来会运算出哪些数字。并且由于自己“额外”掌握的知识,可以知道特定一台机器的迭代率,由此可以计算出多久时间会出现一次同花大顺。 1.10 对策 使用ROM和软件的开发商都需要关注安全问题。任何一家使用软件和计算机产品的公司都要注意—— 当今一家公司很可能意味着一个人的工作室—— 不要认为开发者将系统所有的脆弱性都考虑到了,那样是很危险的。开发老虎机软件的日本程序员犯下的错误就是想得不够远,没将日后可能存在的入侵考虑进去。他们未采取任何措施来防止黑客接触固件、去除ROM芯片以及阅读固件和恢复程序指令(可以知道机器怎样工作)。即使考虑到被入侵的危险,他们也仅天真地认为这样不足以让黑客得逞,因为随机数生成程序的复杂性也会令黑客望而却步的—— 今天可能真的如此,但那个年代绝对不是这样的。 如果你公司的市场硬件产品含有计算机芯片的话,你应该做些什么来对抗那些想非法访问你的数据的竞争对手、某个想仿造机器的外国公司以及那些想入侵的黑客呢? ● 购买防攻击设计的芯片产品。市面上好多芯片产品的入侵风险都很高。 ● 使用单板封装的芯片—— 这种芯片设计时被嵌入电路板中,不能作为独立元件移动。 ● 用环氧封住电路板上的芯片,一旦有人想移动芯片,芯片将受破坏。另一种在此基础上改进的技术是在环氧上面撒上铝粉—— 如果有人想通过加热取走芯片,铝粉将会破坏芯片。 ● 使用球格阵列封装(Ball Grid Array,BGA)设计。在这种设计中,接口没有放在芯片四周,而放在底部,只要将芯片放在电路板的恰当位置,黑客就很难窃取到信号以发现漏洞。 其他可行的对策有:将芯片类型和生产厂家等任何有可能泄露芯片信息的字眼都刮掉,这样黑客就不会通过这些内容获得入侵信息。 生产机器的厂家通常使用的一种方法是校验和(散列)在软件中包含校验例程。一旦程序被更改,校验将会出错,软件将不能操作设备。然而,经验丰富的黑客对这一切非常熟悉,他们只要稍微检测一下软件,就可以知道校验例程是否包含在里面,如果包含了,就中断它。其实保护芯片最好的措施是为它设计一个良好的保护方案。 1.11 小结 如果你的固件是自己所有的,并且非常重要的话,请向最好的安全顾问咨询一下目前黑客可能使用哪些技术;让你的开发人员和编程人员始终掌握最前沿的信息;并确保他们获得报酬时,已采取行动让你的系统进入最安全的状态。

>反入侵的艺术——黑客入侵背后的真实故事

反入侵的艺术——黑客入侵背后的真实故事
作者: (美) 米特尼克(Mitnick, K. D.), (美) 西蒙(Simon, W. L.)
副标题: 世界头号黑客、历史上最令FBI头痛的计算机顽徒、现今全球广受欢迎的信息安全专家米特尼克分享他与小伙伴们的传奇故事
原作名: The Art of Intrusion: the Real Stories Behind the Exploits of Hackers, Intruders and Deceivers
isbn: 7302373582
书名: 反入侵的艺术——黑客入侵背后的真实故事
页数: 260
译者: 袁月杨, 谢衡
定价: 49.80元
出版社: 清华大学出版社
出版年: 2014-8-1