緩沖區(qū)溢出-printf格式化輸出漏洞-創(chuàng)新互聯(lián)

0x01基礎(chǔ)知識(shí):

創(chuàng)新互聯(lián)公司長(zhǎng)期為上1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為望江企業(yè)提供專(zhuān)業(yè)的成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作,望江網(wǎng)站改版等技術(shù)服務(wù)。擁有10余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

在c語(yǔ)言中printf的使用方法為printf(format,<參量表>),printf是c語(yǔ)言中少見(jiàn)的可變參數(shù)的庫(kù)函數(shù),printf在調(diào)用前無(wú)法知道傳入的參數(shù)到底有多少個(gè)(在32位匯編中參數(shù)都是壓入棧中,也就是說(shuō)printf不知到有多少個(gè)參數(shù)入棧了),例如printf("My name is %s,%s"),這里format指定了要傳遞2個(gè)參數(shù),但我們并沒(méi)有傳,這時(shí)候printf就會(huì)去棧中高地址四字節(jié)數(shù)據(jù)來(lái)填充%s,也就是:format+4,format+8的值進(jìn)行填充。

下面舉個(gè)例子:

緩沖區(qū)溢出-printf格式化輸出漏洞

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

這是我們的測(cè)試代碼,在printf里沒(méi)有給printf傳遞%s對(duì)應(yīng)的值,我們一起來(lái)看下執(zhí)行效果:

緩沖區(qū)溢出-printf格式化輸出漏洞

你會(huì)發(fā)現(xiàn),我們沒(méi)有傳遞str變量,但還是打印了,我們使用GDB來(lái)調(diào)試下,看是否和我們前面說(shuō)的使用format+4地址來(lái)填充.

匯編代碼執(zhí)行到printf的時(shí)候我們暫停,看看棧中的數(shù)據(jù):

緩沖區(qū)溢出-printf格式化輸出漏洞

format數(shù)據(jù)是0x8048580,對(duì)應(yīng)在棧空間的位置:0xffffd5c0,按照之前的計(jì)算format+4對(duì)應(yīng)的值為Margin,這樣我們便驗(yàn)證成功了。

利用這個(gè)思路,我們可以考慮下,既然可以使用%s來(lái)打印??臻g的內(nèi)容,那是不是所有棧空間的內(nèi)容都可以打印,我使用%s時(shí)打印的是format+4,那我使用兩個(gè)%s%s打印的是不是format+4,format+8的內(nèi)容,以此類(lèi)推我們可以將??臻g所有值都可以打印出來(lái)。接下來(lái)我們用一個(gè)實(shí)驗(yàn)來(lái)驗(yàn)證下我們的想法。

下面我們要做的是使用printf的格式化漏洞來(lái)泄漏canary的值來(lái)達(dá)到繞過(guò)的目的。

第一步:我們先分析下c語(yǔ)言代碼

緩沖區(qū)溢出-printf格式化輸出漏洞

代碼中的func函數(shù)是有一個(gè)printf函數(shù),存在格式化字符串漏洞,正常寫(xiě)法應(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位置打斷點(diǎn):b printf

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

1.打印ebp的值,在函數(shù)運(yùn)行時(shí)要保存ebp的值,所以,我們只要在函數(shù)運(yùn)行的時(shí)候找到即可。執(zhí)行命令disass func查看func函數(shù)匯編代碼,在0x080484ea的位置打斷點(diǎn),因?yàn)間s:0x14的值就是Canary的值。

緩沖區(qū)溢出-printf格式化輸出漏洞

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

緩沖區(qū)溢出-printf格式化輸出漏洞

可以看到canary的值為0xb26f7f00

我們?cè)诖驍帱c(diǎn)b printf,然后執(zhí)行c,執(zhí)行到該斷點(diǎn)(中間我們輸入margin)

1.找到canary在棧中的位置:p $ebp (因?yàn)閏anary在ebp附近)

緩沖區(qū)溢出-printf格式化輸出漏洞

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

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

緩沖區(qū)溢出-printf格式化輸出漏洞

可以看到canary在0xffffd5ec的位置,我們輸入的margin字符串在0xffffd5b0位置,但是指向的是0xffffd5cc,所以我們可以計(jì)算我們輸入的margin字符串距離canary:0xffffd5ec - 0xffffd5cc = 32,所以,我們?nèi)绻采wcanary需要32個(gè)字符。

第三部:動(dòng)態(tài)獲取canary

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

第四步:獲取shell

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

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

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

python代碼為:

緩沖區(qū)溢出-printf格式化輸出漏洞

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)站欄目:緩沖區(qū)溢出-printf格式化輸出漏洞-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)路徑:http://bm7419.com/article42/cedihc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)外貿(mào)建站、軟件開(kāi)發(fā)、商城網(wǎng)站、服務(wù)器托管電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)