一直很驚歎,駭客是如何利用緩衝區溢位,達到入侵,破解系統的。就如IE瀏覽器上曾出現的圖片格式病毒一樣,這次對PSP的破解,正是藉助一個TIFF格式圖片完成的。由於對PSP有愛,決定去瞭解一下這裡面都發生了什麼事情。一個神奇的圖片是如何破解系統的?
緩衝區溢出,學名是memory overflow,實際上就是記憶體越界。其結果大致表現為,程式死機,系統崩潰。這本來是軟體編寫的bug,很常見。為什麼這個現象能夠被駭客們利用呢?
仔細翻查資料發現,崩潰(死機)的現象,是由於機器執行一個不正確的(非法的)指令造成的。原因可能有:(1)、無效的運算條件,比如除零錯誤;(2)、資料定址錯誤,比如越界或資料受保護;(3)、指令定址錯誤(類似2);(4)、指令無效或無法識別;(5)、……等等。駭客指出,並不是所有的緩衝區溢位都會引發崩潰(死機),同樣並不是所有的崩潰(死機)都是由(3)、(4)情況引起的。大多數緩衝區溢位,對破解都沒有協助。只有緩衝區溢位導致(3)、(4)情況出現時,才對破解有價值(也有人專門研究其他情況下的破解,但是過程過於複雜,而且最終總會歸結於3、4情況)。所以,我們來仔細分析一下,3、4情況下到底發生了什嗎?
(3)很好理解,在32位PC系統中,就是CS:IP的值錯誤導致越界。原因一般是由於在某些函數中,部分指令越界修改了記憶體棧,導致ret(或retf)指令在返回地址時得到了錯誤CS:IP。這些值一般存放於[ebp]-4(或[ebp]-8),而且很容被修改,訪問任何一個local變數都可能越界修改到它。
(4)也不難理解,微機原理的機器語言中,詳細描述了這個問題。簡單來說,一條指令就是一個位元,所有CPU能支援的指令集合,就是一個位元集合。如果某個指令(位元)不在這個集合,就屬於無效指令。如果在,當然就是有效指令啦。值得一提的是,這個指令的位元和資料的位元是同樣的。就是說,在某些情況下,資料和指令是可以互相轉換的。我們來看,組合語言的指令mov ax,4C00h等於機器語言的位元B8004C,mov sp,16等於BC1000。而這個位元B8004C等於圖片象素資料的RGB(184,0,76),BC1000等於RGB(188,16,0)。這樣,指令與映像資料之間就建立了聯絡。
下面來瞭解,緩衝區溢位破解流程。
1、駭客要有個類比環境,用以不斷監測CPU各個寄存器的狀態。PC系統中,就是自己的電腦。PSP上,就是已暴力破解(一般是改裝硬體)舊型號的PSP1000。
2、不斷嘗試各種系統功能,尋找崩潰(死機)現象。
3、分析機器崩潰(死機)時,CPU各個寄存器的狀態,尋找有價值的線索(一個例子是,某個遊戲要求輸入玩家名稱,但是當長度超過一定數量就會死機。某駭客發現,當他將名字輸入為AAAAAAAA……(反覆),死機時,某寄存器的值為A0A0A0A0,若為BBBBBBBB……(反覆),則寄存器值為B0B0B0B0。由此確定輸入數值對寄存器數值的影響。)。在這次破解中,是研究圖片瀏覽器預讀圖片檔案時的一個崩潰,並分析了檔案中的資料值對寄存器的影響的關係。
4、研究從3中得到的寄存器屬性,如果其為指令地址寄存器(相當於PC中的CS:IP,或ebx),那麼恭喜。離勝利很接近了,這就是上述的(3)、(4)情況。如果不是,那麼還要繼續分析這個寄存器對某個指令地址寄存器的影響,找出之間聯絡。要是實在沒有頭緒,只能放棄這步,從2開始。
5、此時,已經能確定,如果某個輸入資料為X,一定能使某個指令地址寄存器變成Y。大概是Y=f(X)。
6、編寫一組目標指令(就是你想啟動並執行程式,如hello world),將其轉換成位元據,然後匯入一個TIFF圖片格式檔案的某個特定地區中。並在檔案中一個特地的位置放入X值。
7、重複崩潰的過程。當死機發生時,某個指令地址寄存器已經按照事先預想的變成Y,並且圖片檔案的那個特定地區資料已經匯入了記憶體。而這個Y值則正好指向那段記憶體。
8、接下來,就是CPU按照駭客預想的方式,執行他們的程式。破解完成。
結束語:
駭客也是人,只不過是聰明一點並且勤奮很多的人。