二子從周 作品

第兩千三百五十一章 空操作雪橇

這個功能可以簡化一些運算,比如邏輯上要給一個數字乘以2然後輸出,在有些時候都不需要運算,只需要將這些數字輸出完後,再在後面填上一個nop,讓等待填裝的接收區在數字後因此自動填上一個0,就可以實現乘2進位的目的。

還有一個重要的作用,就是通過nop指令可以產生一定的延遲功能。

雖然沒有輸出,但是nop指令同樣是需要佔用計算機的執行時間的,加上循環次數,就可以在相應次數的指令執行時間,讓程序實際上實現“暫停”的功能。

計算機在執行程序的時候,經常是在共用緩衝區內存儲數據,這個緩衝區常常需要清空操作,等待總線恢復成無數據運行的狀態,巧用nop指令,就能夠實現這樣的功能。

然而就是這麼有用的一條指令,被有心人發現了新“用處”。

在操作系統當中,指令的輸入與返回,是通過堆棧來進行的。

堆棧大體來講好像一個倉庫,倉庫分作了幾個區域,每個區域用來存放一堆“門牌號”,這樣的門牌號,在單片機系統裡叫做“寄存器”,程序調用時,工作方式就是挨著讀取這些門牌號,將這些地址對應的寄存器中內容讀入到棧中,最後將計算結果存放到返回地址當中去。

這時候就有人想到使壞了,因為堆棧的內容填充是從低地址向高地址進行的,最高的位置就是結果地址。

要是在低地址區,比如變量區,給變量填充一個巧妙構造的超長字符串,讓這個長字符串超過高地址區,其實就會拿這個變量的後半部分內容,替換掉了返回地址的“門牌”。

將這個“門牌”設置成某個變量的地址,那麼現在的返回地址就變成了指向這個變量,如果這個變量當中盛放的是惡意代碼,於是這個惡意代碼就被成功地讀取進了系統裡。

這個方式,叫做“堆棧緩衝區溢出”,通過緩衝區溢出,我們能改變程序原有的正常執行流程,去改為執行黑客準備好的惡意代碼。

這套操作在windows系統上一用一個準,也是周至他們研發的防火牆和殺毒軟件所保護的重點。

但是這個問題在unix為基礎的系統上卻並不存在,因為unix系統對於結果緩衝區的地址分配是隨機的,也就是說其返回結果的地址並不一定就在變量地址的後面,可以被黑客輕易推測到,並且利用緩衝區溢出功能輕易替換。