0x00本文視頻:
站在用戶的角度思考問題,與客戶深入溝通,找到金華網(wǎng)站設(shè)計與金華網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站設(shè)計、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋金華地區(qū)。
????如果文字過于枯燥可觀看在線視頻:https://edu.51cto.com/sd/16514
0x01基礎(chǔ)知識:
在c語言中printf的使用方法為printf(format,<參量表>),printf是c語言中少見的可變參數(shù)的庫函數(shù),printf在調(diào)用前無法知道傳入的參數(shù)到底有多少個(在32位匯編中參數(shù)都是壓入棧中,也就是說printf不知到有多少個參數(shù)入棧了),例如printf("My name is %s,%s"),這里format指定了要傳遞2個參數(shù),但我們并沒有傳,這時候printf就會去棧中高地址四字節(jié)數(shù)據(jù)來填充%s,也就是:format+4,format+8的值進(jìn)行填充。
下面舉個例子:
編譯:gcc -m32 -O0 base.c -o ./base 編譯為32位。
這是我們的測試代碼,在printf里沒有給printf傳遞%s對應(yīng)的值,我們一起來看下執(zhí)行效果:
你會發(fā)現(xiàn),我們沒有傳遞str變量,但還是打印了,我們使用GDB來調(diào)試下,看是否和我們前面說的使用format+4地址來填充.
匯編代碼執(zhí)行到printf的時候我們暫停,看看棧中的數(shù)據(jù):
format數(shù)據(jù)是0x8048580,對應(yīng)在棧空間的位置:0xffffd5c0,按照之前的計算format+4對應(yīng)的值為Margin,這樣我們便驗證成功了。
利用這個思路,我們可以考慮下,既然可以使用%s來打印??臻g的內(nèi)容,那是不是所有??臻g的內(nèi)容都可以打印,我使用%s時打印的是format+4,那我使用兩個%s%s打印的是不是format+4,format+8的內(nèi)容,以此類推我們可以將??臻g所有值都可以打印出來。接下來我們用一個實驗來驗證下我們的想法。
下面我們要做的是使用printf的格式化漏洞來泄漏canary的值來達(dá)到繞過的目的。
第一步:我們先分析下c語言代碼
代碼中的func函數(shù)是有一個printf函數(shù),存在格式化字符串漏洞,正常寫法應(yīng)該是printf("My name is %s",name)。
編譯:gcc -fstack-protector -m32 -o0 c.c -o ./c
第二步:確認(rèn)canary的位置(偏移量)
思路是:先找到我們輸入內(nèi)容的位置x,在找到canary位置y,然后x-y得到偏移量
在printf位置打斷點:b printf
在gdb里執(zhí)行r運(yùn)行程序,然后輸入aaaa(這里隨意寫,寫aaaa的意義在于在??臻g里好找,都是61616161)
1.打印ebp的值,在函數(shù)運(yùn)行時要保存ebp的值,所以,我們只要在函數(shù)運(yùn)行的時候找到即可。執(zhí)行命令disass func查看func函數(shù)匯編代碼,在0x080484ea的位置打斷點,因為gs:0x14的值就是Canary的值。
打斷點:b *0x080484ea,執(zhí)行到此處,在輸入兩次n,執(zhí)行完mov dword ptr [ebp-0xc],eax后canary的值就在eax中了
可以看到canary的值為0xb26f7f00
我們在打斷點b printf,然后執(zhí)行c,執(zhí)行到該斷點(中間我們輸入margin)
1.找到canary在棧中的位置:p $ebp (因為canary在ebp附近)
在棧中找到ebp的位置,執(zhí)行:stack 0x28(意思是要看四十行棧數(shù)據(jù))
我們知道在棧幀空間中布局如下:
可以看到canary在0xffffd5ec的位置,我們輸入的margin字符串在0xffffd5b0位置,但是指向的是0xffffd5cc,所以我們可以計算我們輸入的margin字符串距離canary:0xffffd5ec - 0xffffd5cc = 32,所以,我們?nèi)绻采wcanary需要32個字符。
第三部:動態(tài)獲取canary
現(xiàn)在我們知道了canary的偏移量,但是我們還不知道canary的動態(tài)值,這里我們就需要用到printf函數(shù)的格式化漏洞(回憶下前面講的format+4),上面截圖我們可以看到printf第一個參數(shù)距離canary有15所以我們可以輸入%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x來得到canary的值(最后8位是canary),或者簡化寫法%15$08x.
第四步:獲取shell
在程序中我們已經(jīng)知道了有一個exploit函數(shù)可以讓我們直接獲取shell,所以我們就把func函數(shù)的返回地址直接覆蓋為exploit即可
從上面步驟截圖中我們可以看到canary到ebp是12,所以payload為:
'a' * 32 + canary + 'a' * 12 + exploit地址
python代碼為:
當(dāng)前題目:緩沖區(qū)溢出-printf格式化輸出漏洞
網(wǎng)頁路徑:http://www.rwnh.cn/article34/jgpcse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、網(wǎng)站導(dǎo)航、關(guān)鍵詞優(yōu)化、微信小程序、定制開發(fā)、網(wǎng)站設(shè)計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)