【信息安全基礎】整數溢出漏洞


整數溢出實驗報告

 

一、實驗原理

(1)計算機中,整數用補碼來表示,分為有符號整數和無符號整數。有符號整數最高位為符號位,1表示負數,0表示整數。無符號數沒有符號位,只表示整數。將一個負的有符號數賦給無符號數,可能會變成一個很大的數。

(2)一個整數通過運算(加減、賦值等),超出了它的數據類型所能表示的范圍,就會發生溢出。如:一個整數存入比它小的存儲空間時,超出了類型所能表示的范圍,就會發生溢出,高位會被丟棄(即截斷)。

 

各種整數類型占有的字節數和表示范圍如下。

 

 

 

 

 

 

 

二、intof的利用

.1..查看反匯編代碼

畫出棧圖:

 

2. 說明

head_len是16,buf區長度是68字節,程序讓用戶輸入data_len,然后檢查hean_len和data_len的和是否小於等於64,不超過64則接收data_len個字節輸入,寫入到buf處(從buf [head_len]開始寫)。然后程序檢查v9所在的起始字節是否為空,若不為空,則輸出Your win。

 

3. 利用整數溢出漏洞

表面上看,用戶只能輸入64-16=48字節的內容,但其實,read函數的第三個參數是無符號數,因而給它傳一個負的有符號數,會變成較大的正整數。而data_len和head_len都是有符號的int類型。head_len與一個負的data_len相加,結果必然小於64,程序必然會調用read,且可接收超過48個字節的輸入。

 

如先輸入-1(補碼為0xffffffff),傳給read函數,則read的第三個參數會變成它的數據類型所能表示的最大值。再輸入超過48字節的內容,按回車,寫入棧的內容就可溢出buf區了,就可修改v9所在的字節了。(實際上輸入48個字節再按回車就可以了,因為換行符也會被寫入)。

 

 

 

 

 

 

 

 

二、int_overflow0的利用

 

通過整數溢出修改變量,使其輸出You get 20 points!

 

查看反匯編代碼

 

畫出棧圖

 

用戶先輸入size的大小,程序再接收size字節的輸入,然后檢查v7和v6的值,若v7等於-558907665,v6等於195951310,則輸出You get 20 points!

 

V7和v6都是有符號int類型,有符號int類型下,-558907665的補碼表示是0xdeafbeef,195951310的補碼表示是0xbadface。

 

利用腳本(my0.py)

先發送32給size,讓程序能接收32個字節。

再發送字符串給read函數接收:發送24個A填充buf區、size所在的4字節,發送0xbadface填充v6,發送0xdeafbeef填充v7,就能通過判斷了。

運行結果:

三、int_overflow1的利用

 

1. 通過整數溢出修改變量,使程序輸出You get another 20 points

 

查看源代碼:

 

程序先接收一個有符號int型存到size,然后調用check函數檢查size是否小於100,若不是,告知用戶size太大,退出程序。若size小於100,則接收size字節的內容寫到buf,最后檢查magic的值是否等於0xdeadbeef,若等於,輸出You get another 20 points。

 

main的部分反匯編代碼:

 

 

畫出棧圖:

 

運行結果:

 

 

 

 

2. 利用整數溢出和緩沖區溢出,使程序執行backdoor函數。

 

size的輸入和上一題一樣,使程序能進入read函數。

關鍵是修改main函數的ret_addr處的值,使其為backdoor函數的起始地址(0x804855a)。

 

 

main函數的部分反匯編代碼:

 

注意到,函數最后將old_ebx的值彈出給ebx寄存器,再將ebx-4的值賦給esp,故存放main函數返回地址的棧起始地址為old_ebx-4。

 

可以在read(0,buf,size)函數處下斷點,查看buf的地址,進而通過x /28xw buf地址查看buf,magic,old_ebx的內容,進而推算存放main函數返回地址處的地址。

 

 

利用過程使用交互模式。

先輸入python開啟一個python進程,再依次輸入下面的命令

按下回車后,在gdb窗口鍵入c,回車,程序停在read函數處。

 

0000處的內容是0, 0004處(紅圈標記)是buf的起始地址,0008處是size的值。

查看從buf開始,28個4字節單元存放的內容。

 

再輸入conn.interactive(),回車。gdb窗口輸入c,回車。

結果如下。出現了You get another 20 points! (有嘆號的是backdoor里的)

gdb窗口顯示進入了/bin/dash

gdb窗口鍵入q退出gdb。

則終端進入了shell,可輸入ls,cat,exit等shell命令。

 

 

 

 

四、實驗總結

通過本次實驗,了解了整數溢出漏洞的原理基礎及利用。

遇到的問題及解決:

1.做int_overflow0的利用,寫了gdb.attach,sendline的內容不能正確寫入size,buf,conn.interactive()后不能正確輸出。

解決方法:去掉gdb.attach一句。

 

2.int_overflow1的利用,用了各種方法不能進入backdoor函數。

解決方法:查看反匯編代碼,發現程序最后將ebx-4賦給了esp,這里的ebx其實是前面壓入的old_ebx,ebx-4處才是存放返回地址的。而前面有esp的對齊操作,故buf起始地址和存放ret_addr處的間隔不是固定的。要查看棧里old_ebx的值,需知道buf的地址,而buf的地址可通過在read函數處設斷點,查看出來。然后據此推斷需要用多少字符填充ret_addr存放處前面的內容,再修改ret_addr。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM