中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

緩沖區溢出-printf格式化輸出漏洞

發布時間:2020-04-09 21:07:10 來源:網絡 閱讀:1589 作者:Margin_51cto 欄目:安全技術

0x00本文視頻:

????如果文字過于枯燥可觀看在線視頻:https://edu.51cto.com/sd/16514

0x01基礎知識:

在c語言中printf的使用方法為printf(format,<參量表>),printf是c語言中少見的可變參數的庫函數,printf在調用前無法知道傳入的參數到底有多少個(在32位匯編中參數都是壓入棧中,也就是說printf不知到有多少個參數入棧了),例如printf("My name is %s,%s"),這里format指定了要傳遞2個參數,但我們并沒有傳,這時候printf就會去棧中高地址四字節數據來填充%s,也就是:format+4,format+8的值進行填充。

下面舉個例子:

緩沖區溢出-printf格式化輸出漏洞

編譯:gcc -m32 -O0 base.c -o ./base 編譯為32位。

這是我們的測試代碼,在printf里沒有給printf傳遞%s對應的值,我們一起來看下執行效果:

緩沖區溢出-printf格式化輸出漏洞

你會發現,我們沒有傳遞str變量,但還是打印了,我們使用GDB來調試下,看是否和我們前面說的使用format+4地址來填充.

匯編代碼執行到printf的時候我們暫停,看看棧中的數據:

緩沖區溢出-printf格式化輸出漏洞

format數據是0x8048580,對應在棧空間的位置:0xffffd5c0,按照之前的計算format+4對應的值為Margin,這樣我們便驗證成功了。

利用這個思路,我們可以考慮下,既然可以使用%s來打印棧空間的內容,那是不是所有棧空間的內容都可以打印,我使用%s時打印的是format+4,那我使用兩個%s%s打印的是不是format+4,format+8的內容,以此類推我們可以將棧空間所有值都可以打印出來。接下來我們用一個實驗來驗證下我們的想法。

下面我們要做的是使用printf的格式化漏洞來泄漏canary的值來達到繞過的目的。

第一步:我們先分析下c語言代碼

緩沖區溢出-printf格式化輸出漏洞

代碼中的func函數是有一個printf函數,存在格式化字符串漏洞,正常寫法應該是printf("My name is %s",name)。

編譯:gcc -fstack-protector -m32 -o0 c.c -o ./c

第二步:確認canary的位置(偏移量)

思路是:先找到我們輸入內容的位置x,在找到canary位置y,然后x-y得到偏移量

在printf位置打斷點:b printf

在gdb里執行r運行程序,然后輸入aaaa(這里隨意寫,寫aaaa的意義在于在棧空間里好找,都是61616161)

1.打印ebp的值,在函數運行時要保存ebp的值,所以,我們只要在函數運行的時候找到即可。執行命令disass func查看func函數匯編代碼,在0x080484ea的位置打斷點,因為gs:0x14的值就是Canary的值。

緩沖區溢出-printf格式化輸出漏洞

打斷點:b *0x080484ea,執行到此處,在輸入兩次n,執行完mov dword ptr [ebp-0xc],eax后canary的值就在eax中了

緩沖區溢出-printf格式化輸出漏洞

可以看到canary的值為0xb26f7f00

我們在打斷點b printf,然后執行c,執行到該斷點(中間我們輸入margin)

1.找到canary在棧中的位置:p $ebp (因為canary在ebp附近)

緩沖區溢出-printf格式化輸出漏洞

在棧中找到ebp的位置,執行:stack 0x28(意思是要看四十行棧數據)

我們知道在棧幀空間中布局如下:

緩沖區溢出-printf格式化輸出漏洞

可以看到canary在0xffffd5ec的位置,我們輸入的margin字符串在0xffffd5b0位置,但是指向的是0xffffd5cc,所以我們可以計算我們輸入的margin字符串距離canary:0xffffd5ec - 0xffffd5cc = 32,所以,我們如果要覆蓋canary需要32個字符。

第三部:動態獲取canary

現在我們知道了canary的偏移量,但是我們還不知道canary的動態值,這里我們就需要用到printf函數的格式化漏洞(回憶下前面講的format+4),上面截圖我們可以看到printf第一個參數距離canary有15所以我們可以輸入%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x來得到canary的值(最后8位是canary),或者簡化寫法%15$08x.

第四步:獲取shell

在程序中我們已經知道了有一個exploit函數可以讓我們直接獲取shell,所以我們就把func函數的返回地址直接覆蓋為exploit即可

從上面步驟截圖中我們可以看到canary到ebp是12,所以payload為:

'a' * 32 + canary + 'a' * 12 + exploit地址

python代碼為:

緩沖區溢出-printf格式化輸出漏洞

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

静乐县| 美姑县| 松溪县| 新乡县| 台南市| 巴林右旗| 迁安市| 阿拉善右旗| 论坛| 阳新县| 兴和县| 彭州市| 迁西县| 长沙县| 布尔津县| 大丰市| 五华县| 奉化市| 大悟县| 工布江达县| 和龙市| 延边| 沙雅县| 沧源| 鹿泉市| 乌审旗| 榆树市| 桃园市| 湄潭县| 溧阳市| 且末县| 英德市| 新巴尔虎右旗| 海安县| 商洛市| 潮州市| 新宾| 马鞍山市| 图木舒克市| 普格县| 洪洞县|