他深吸一口气,平复了一下激动的心情,然后从口袋里掏出仅有的一枚皱巴巴的一元硬币。这是他最后的“启动资金”。
他没有立刻投币,而是再次集中精神,“看”向售货机的支付处理代码流。他需要找到那个负责累加amountPaid变量的关键代码段,并锁定它。
找到了!
//EventHandler:CoinInsertedfunctiononCoinInserted(coinValue){currentTransaction.amountPaid+=coinValue;//AccumulateamountupdateDisplay(currentTransaction.amountPaid);//...waitforitemselectionortimeout...}
就是这里!currentTransaction.amountPaid+=coinValue;这一行!每次投币,都会在这里进行累加。
苏晨的计划是:投入一元硬币,让amountPaid先变成1。然后,不等他选择商品,立刻用意念修改这个amountPaid变量,把它改成一个天文数字,比如999999!最后,再选择一个价格最低的商品。
这样一来,calculateChange(999999,1.5)在计算时,极有可能因为整数溢出,导致changeDue变成一个同样巨大的正数或者一个负数,取决于溢出方式,但无论如何都会出错,如果设计不完善的机器的物理找零模块可能会因此卡死,或者疯狂吐币?!
当然,也可能直接报错死机,或者找零模块有物理上限,只吐出有限的硬币。
但不试试怎么知道?
苏晨眼中闪过一丝疯狂。他感觉自己的血液都在燃烧,疲惫感似乎都被这股刺激和期待冲淡了不少。
他再次确认了一下周围没人,然后将那一元硬币,郑重地投进了投币口。
“哐当”一声,硬币落入机器内部。
售货机的显示屏上,金额从0.00跳到了1.00。
就是现在!
苏晨屏住呼吸,将全部残余的精神力聚焦,如同烧红的烙铁般,狠狠地“烫”向那段代码中代表amountPaid的内存地址!
他的脑海中只有一个念头——“赋值!999999!!!”
嗡!熟悉的剧痛再次袭来,甚至比上一次更加猛烈!苏晨闷哼一声,身体晃了晃,几乎站立不稳,脸色瞬间变得惨白。
但他强忍着眩晕,死死盯着售货机的代码流。
他“看”到,代表amountPaid变量的那段内存代码,剧烈地扭曲、闪烁,原本存储的数值1.00被一股无形的力量强行抹除,然后,一个庞大到几乎溢出显示区域的数字999999.00被硬生生塞了进去!
成了!
苏晨心中狂喜,顾不上剧痛和虚弱,颤抖着伸出手指,按向了面板上一瓶标价1.5元的矿泉水按钮。
“嘀。”
按钮按下,选择确认。
接下来,就是见证奇迹……或者见证失败的时刻!
找零计算模块开始运行……读取被篡改的amountPaid……进行减法运算……
苏晨的心提到了嗓子眼,死死盯着售货机的出币口和显示屏。
下一秒,会发生什么?
是机器崩溃?是警报大作?还是……
他期待的“奇迹”?
时间,仿佛在这一刻被无限拉长。