第一百三十九章 棧緩沖區(qū)溢出
第一百三十九章棧緩沖區(qū)溢出
第二天,學(xué)校食堂。
sam三人組又聚在了一起共同進(jìn)餐。
亞瑟和馬修兩人臉上的傷痕如果不注意看的話已經(jīng)看不出來,浮腫也完全消失,他們都稱贊林鴻的“云南白藥”非常神奇。
在他們的桌子上,擺放著三個(gè)ti-82型計(jì)算器,他們一邊吃飯,一邊不時(shí)地看看桌上的計(jì)算器,有時(shí)候還互相對視而笑,臉上雖然疲倦,但眉目之間卻露出非常興奮和自豪的神色。
這三個(gè)計(jì)算器,正是已經(jīng)被成功破解了的計(jì)算器!
迅速吃完之后,馬修馬上拿起了自己的那個(gè)計(jì)算器,在上面按了幾下,調(diào)出一個(gè)目錄,然后運(yùn)行其中的程序,整個(gè)計(jì)算器液晶屏頓時(shí)一刷新,只見一個(gè)右邊一個(gè)小小的黑色長條開始慢慢從右至左開始移動,馬修將計(jì)算器側(cè)了過來,開始津津有味地玩了起來。
昨天,竟然有直接在bbs上就將ti-82計(jì)算器的電路圖紙直接發(fā)布在上面,所以,德州儀器郵寄的資料,實(shí)際上已經(jīng)意義不大了。那個(gè)人就是德州儀器公司的工程師,他在上面回答了許多用戶提出的問題,并且說歡迎大家提出改進(jìn)建議,他會向公司提交反饋內(nèi)容。
由于提前拿到了圖紙,破解的事情立刻提上了日常,興奮之下的三人根本沒有心思睡覺,他們做了一個(gè)重要決定,那就是一定要趕在返校舞會到來之前,將計(jì)算器破解出來。
他們分工合作,馬修和亞瑟負(fù)責(zé)設(shè)計(jì)出一個(gè)有意思的軟件或者游戲,而林鴻則負(fù)責(zé)計(jì)算器的破解,等破解出來之后,就移植到計(jì)算器上面,給大家來一個(gè)巨大的驚喜。
由于有了bbs上那些帖子的基礎(chǔ),林鴻已經(jīng)對破解計(jì)算器有了非常大的把握,他最終讓亞瑟拿出工具箱,將計(jì)算器給拆了開來,對照電路圖仔細(xì)研究了計(jì)算器的硬件結(jié)構(gòu)。
最終林鴻確定,并不需要對計(jì)算器進(jìn)行硬件方面的修改,就完全可以突破德州儀器公司在固件上設(shè)置的限制枷鎖。
這是因?yàn)樵谄渲幸粋€(gè)帖子中,有一個(gè)用戶描述了他發(fā)現(xiàn)的一個(gè)現(xiàn)象,按照他給出的幾個(gè)按鍵順序和方式,就可以讓計(jì)算器進(jìn)入一個(gè)特殊的模式——“debug-n”。不過那個(gè)用戶的這個(gè)回復(fù)貼很快就被緊接而來的其他回復(fù)給淹沒了,只有很少人才注意到了他的這個(gè)回復(fù)。
因?yàn)榱著櫺枰獙τ?jì)算器進(jìn)行破解,所以他對立面的所有回復(fù)都比較關(guān)注。這個(gè)用戶的回帖他非常重視,專門用自己的計(jì)算器按照對方描述的順序,完整地操作了一番,然后再將計(jì)算器連接到計(jì)算機(jī)上面進(jìn)行了一系列測試,結(jié)果驚喜地發(fā)現(xiàn),這個(gè)模式似乎是德州儀器公司的工程師在開發(fā)過程中用來調(diào)試用的,在這個(gè)模式下,用戶對計(jì)算器的操作擁有很大的權(quán)限。
這絕對是個(gè)好消息,原本林鴻還以為需要對硬件進(jìn)行改動,現(xiàn)在有了進(jìn)入這個(gè)模式的方式,他完全可以直接不通過硬件,僅從軟件上的漏洞就可以直接對這個(gè)計(jì)算器進(jìn)行破解。
經(jīng)過一個(gè)晚上的奮戰(zhàn),林鴻最終成功了。
他找到了一個(gè)計(jì)算器里面的棧緩沖區(qū)溢出,從而成功地往里面寫入了自己的代碼,突破了固件系統(tǒng)對用戶操作空間權(quán)限的限制。
程序在運(yùn)行過程中,為了臨時(shí)存取數(shù)據(jù)的需要,一般都要分配一些內(nèi)存空間,通常稱這些空間為緩沖區(qū)。
這個(gè)區(qū)域一般是可以進(jìn)行數(shù)據(jù)存儲和刪除操作的,保護(hù)級別并不嚴(yán)格。而在緩沖區(qū)之外,在存在著其他一些系統(tǒng)內(nèi)核數(shù)據(jù)區(qū)域,存放的數(shù)據(jù)都是系統(tǒng)中非常重要的數(shù)據(jù),一旦那些數(shù)據(jù)被修改,整個(gè)系統(tǒng)就可能發(fā)生崩潰,當(dāng)然,也有可能出現(xiàn)其他意想不到的結(jié)果。
所以這些系統(tǒng)內(nèi)核數(shù)據(jù)區(qū)域是被嚴(yán)格限制和保護(hù)的,用戶不能對其進(jìn)行操作。
棧是一種特殊的數(shù)據(jù)結(jié)構(gòu),特點(diǎn)是先入后出。就像一條死胡同,大家排隊(duì)進(jìn)去,滿了之后停止進(jìn)入,然后再一個(gè)一個(gè)排著隊(duì)出來,先進(jìn)去的那個(gè)人,最后才出來。這種數(shù)據(jù)結(jié)構(gòu)生活中也有不少例子,例如交試卷,先交的人一般要到最后才會被老師看到,還有就是以前ktv里面點(diǎn)歌系統(tǒng),先點(diǎn)歌的人,反而排在最后面唱。
按理說,德州儀器的工程師在編寫程序的時(shí)候,是需要對壓入棧里面的數(shù)據(jù)長度進(jìn)行檢查的,一旦這個(gè)棧已經(jīng)滿了,就必須停止對其再進(jìn)行壓入,否則就會產(chǎn)生溢出。
而林鴻找到的這個(gè)棧緩沖區(qū),正是那些工程師編寫代碼的時(shí)候不嚴(yán)謹(jǐn),忘記對這個(gè)棧進(jìn)行長度檢查,于是林鴻一直往其中壓入數(shù)據(jù),等它滿了也不管,繼續(xù)壓入,于是便發(fā)生了棧內(nèi)存溢出。
溢出便意味著棧緩沖區(qū)之外的單元會被改寫,而假如這些數(shù)據(jù)單元里面存儲的數(shù)據(jù)是有用數(shù)據(jù)的話,就會產(chǎn)生意想不到的后果,最常見的后果就是程序崩潰,通常情況(求魔最新章節(jié))下,這只能算是程序的一個(gè)bug,但是當(dāng)向這些棧中壓入經(jīng)過進(jìn)行設(shè)計(jì)的數(shù)據(jù),就不僅僅是bug了,而是成為了可供黑客利用的漏洞。
林鴻正是精心設(shè)計(jì)好了一個(gè)小程序,然后將其編譯成機(jī)器碼,先是向他找到的那個(gè)棧中壓入一些無效的數(shù)據(jù),精確計(jì)算這些數(shù)據(jù)的長度,等達(dá)到一定長度之后,再將他設(shè)計(jì)好的數(shù)據(jù)給壓入進(jìn)去,讓其發(fā)生溢出,覆蓋緩沖區(qū)之外的區(qū)域,這樣當(dāng)固件系統(tǒng)運(yùn)行到這里的時(shí)候,就會成功地調(diào)用執(zhí)行他的這個(gè)程序……
于是,這個(gè)嚴(yán)密的堡壘便被林鴻給成功攻克了。
這個(gè)過程,說起來看似簡單,實(shí)際上卻是經(jīng)過林鴻無數(shù)次測試才找到的,為了精確計(jì)算棧的長度,他至少反反復(fù)復(fù)重復(fù)了五十遍以上的數(shù)據(jù)壓入過程,而為了能夠讓自己的這個(gè)程序能夠順利接管固件的運(yùn)行流程,其中所花費(fèi)的時(shí)間和精力,也是無法三言兩語描述得清楚的。
林鴻將其成功破解之后,興奮之下,忘記了別人不像自己根本不用睡覺,當(dāng)時(shí)就立刻敲響了亞瑟的房門,幸好他們剛剛睡下不久,聽到他這么快就將計(jì)算器給破擊出來了,原本已經(jīng)瞌睡得睜不開眼睛的兩人頓時(shí)精神一振,將睡意拋到了九霄云外。
立刻想要看一下破解之后的成果,可是接下來難題又來了——沒有合適的可以運(yùn)行在上面的軟件。
之前他們兩個(gè)討論了很久,始終無法確定第一個(gè)軟件該編寫什么功能。亞瑟比較傾向于做一個(gè)實(shí)用性的軟件,例如可以輔助學(xué)生在學(xué)校的學(xué)習(xí),而馬修則傾向于編寫一個(gè)有意思的游戲。
兩個(gè)人的意見不能統(tǒng)一,時(shí)間就在他們不斷地爭辯中流逝,結(jié)果什么東西都沒做出來。
現(xiàn)在機(jī)器已經(jīng)出來了,卻沒有合適的軟件,真是夠郁悶的。
這個(gè)時(shí)候,馬修提出,先編寫一個(gè)相對比較簡單的游戲跑起來再說,得到了林鴻和亞瑟的一致認(rèn)可。
三人商量了一下,最終決定將俄羅斯方塊這個(gè)游戲移植到計(jì)算器中。
俄羅斯方塊是蘇聯(lián)科學(xué)家阿列克謝*帕基特諾夫一個(gè)經(jīng)典游戲,它看似簡單但卻變化無窮,令人上癮。1988年在美國上市之后,立刻獲得了巨大的商業(yè)成功,受到了男女老少所有人的歡迎,成為一款極為經(jīng)典的大眾游戲,沒有任何一款游戲能夠與其媲美。
亞瑟之前在學(xué)習(xí)編程的時(shí)候,曾經(jīng)獨(dú)立開發(fā)過這個(gè)游戲,有現(xiàn)成的源代碼,移植起來的難度并不大。
于是,他們又將陣地轉(zhuǎn)移到了林鴻房間,因?yàn)樗@臺機(jī)器可以模擬z80cpu的運(yùn)行環(huán)境,將亞瑟之前編寫的那個(gè)源程序進(jìn)行簡單的修改和優(yōu)化之后,就將其編譯成為了一個(gè)可在計(jì)算器里面執(zhí)行的文件,然后通過數(shù)據(jù)線傳輸?shù)搅擞?jì)算器存儲空間中。
剛開始的幾次運(yùn)行都出了點(diǎn)問題,但是這是很正常的情況(求魔最新章節(jié)),移植到另外一個(gè)平臺,如果能一次性就成功,那就太夸張了,就算是再牛逼的程序員,有時(shí)候也是會犯一些低級錯(cuò)誤的,例如變量名稱寫錯(cuò),忘記寫分號之類的,這是很正常的情況(求魔最新章節(jié))。只要根據(jù)調(diào)試信息,有針對性地進(jìn)行修改就行了。
編寫程序就是這樣,調(diào)試、運(yùn)行、再調(diào)試……
不斷地和各種錯(cuò)誤和bug做這斗爭,直到最終順利通過的那一刻!
在進(jìn)行過十幾次不斷地來回調(diào)試和傳輸程序的過程之后,亞瑟的俄羅斯游戲終于順利地在ti-82上運(yùn)行了!
馬修第一時(shí)間將計(jì)算器搶了過來,然后開始玩了起來。
玩俄羅斯方塊游戲,只需要至多五個(gè)按鍵就可以,三個(gè)方向鍵,一個(gè)鍵用來變換,另外一個(gè)鍵則用來加速。而計(jì)算器上有幾十個(gè)按鍵,足夠了。
馬修在玩了一會兒就發(fā)現(xiàn),由于計(jì)算器顯示屏高度太低,很容易就會被撐到頂,最終掛掉。
于是,他提出了改進(jìn)意見,將顯示方式向順時(shí)針方向旋轉(zhuǎn)90度,這樣方塊下落的路程就可以大大加長,可以降低難度。
于是,亞瑟又開始對游戲的源程序進(jìn)行修改……
在整個(gè)過程中,林后都沒再插手,他只是在旁邊觀看著亞瑟編寫程序。
亞瑟的這個(gè)俄羅斯方塊程序是用c語言進(jìn)行編寫的,林鴻來美國之后才開始接觸這門編程語言,用得還不是很熟,今天看到亞瑟不斷修改調(diào)試,也學(xué)到了不少東西。
他發(fā)現(xiàn),亞瑟編寫程序的時(shí)候,有一些細(xì)小的編程習(xí)慣值得借鑒和學(xué)習(xí),例如在關(guān)鍵的地方給點(diǎn)注釋、給代碼語句多分行縮進(jìn),提高代碼的可讀性……等等。
在將近凌晨五點(diǎn)的時(shí)候,他們終于將最終版的俄羅斯方塊游戲給確定下來。
此刻,除了林鴻,亞瑟和馬修都疲憊不堪,直接倒在床上呼呼大睡。
這天早晨的晨練,亞瑟和馬修都沒能去,只有林鴻一人。
第一百三十九章棧緩沖區(qū)溢出
第一百三十九章棧緩沖區(qū)溢出,到(圣王txt下載)去
,