日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Blind Return Oriented Programming (BROP) Attack - 攻击原理

發(fā)布時(shí)間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Blind Return Oriented Programming (BROP) Attack - 攻击原理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

0x00 寫在前面


第一次在WooYun發(fā)文章,不知道是否符合眾客官口味,望輕拍。

這篇文章翻譯至我的這篇博客,主要介紹了一種叫做BROP的攻擊,該文章主要介紹原理部分,對該攻擊的重現(xiàn)可以參看我的另外一篇博客。

BROP攻擊基于一篇發(fā)表在Oakland 2014的論文Hacking Blind,作者是來自Standford的Andrea Bittau,以下是相關(guān)paper和slide的鏈接:

paper

slide。

以及BROP的原網(wǎng)站地址:

Blind Return Oriented Programming (BROP) Website

可以說這篇論文是今年看過的最讓我感到興奮的論文(沒有之一),如果要用一個(gè)詞來形容它的話,那就只有“不能更帥”才能表達(dá)我對它的喜愛程度了!

這篇文章假設(shè)讀者已經(jīng)了解Return-Oriented Programming (ROP) 的基本概念,所以只是介紹BROP的實(shí)現(xiàn)原理,如果還不清楚什么是ROP,請先出門左轉(zhuǎn),看看Wiki的相關(guān)介紹。

BROP的實(shí)現(xiàn)真的是讓人感到非常“cool”和“smart”,我希望能夠通過這篇文章把它講清楚。

0x01 BROP攻擊的目標(biāo)和前提條件


目標(biāo):通過ROP的方法遠(yuǎn)程攻擊某個(gè)應(yīng)用程序,劫持該應(yīng)用程序的控制流。我們可以不需要知道該應(yīng)用程序的源代碼或者任何二進(jìn)制代碼,該應(yīng)用程序可以被現(xiàn)有的一些保護(hù)機(jī)制如NX, ASLR, PIE, 以及stack canaries等保護(hù),應(yīng)用程序所在的服務(wù)器可以是32位系統(tǒng)或者64位系統(tǒng)。

初看這個(gè)目標(biāo)感覺實(shí)現(xiàn)起來特別困難。其實(shí)這個(gè)攻擊有兩個(gè)前提條件的:

  • 必須先存在一個(gè)已知的stack overflow的漏洞,而且攻擊者知道如何觸發(fā)這個(gè)漏洞;
  • 服務(wù)器進(jìn)程在crash之后會(huì)重新復(fù)活,并且復(fù)活的進(jìn)程不會(huì)被re-rand(意味著雖然有ASLR的保護(hù),但是復(fù)活的進(jìn)程和之前的進(jìn)程的地址隨機(jī)化是一樣的)。這個(gè)需求其實(shí)是合理的,因?yàn)楫?dāng)前像nginx, MySQL, Apache, OpenSSH, Samba等服務(wù)器應(yīng)用都是符合這種特性的。

0x10 BROP的攻擊流程 1 - 遠(yuǎn)程dump內(nèi)存


由于我們不知道被攻擊程序的內(nèi)存布局,所以首先要做的事情就是通過某種方法從遠(yuǎn)程服務(wù)器dump出該程序的內(nèi)存到本地,為了做到這點(diǎn)我們需要調(diào)用一個(gè)系統(tǒng)調(diào)用write,傳入一個(gè)socket文件描述符,如下所示:

write(int sock, void *buf, int len)

將這條系統(tǒng)調(diào)用轉(zhuǎn)換成4條匯編指令,如圖所示:

所以從ROP攻擊的角度來看,我們只需要找到四個(gè)相應(yīng)的gadget,然后在棧上構(gòu)造好這4個(gè)gadget的內(nèi)存地址,依次進(jìn)行順序調(diào)用就可以了。

但是問題是我們現(xiàn)在連內(nèi)存分布都不知道,該如何在內(nèi)存中找到這4個(gè)gadgets呢?特別是當(dāng)系統(tǒng)部署了ASLR和stack canaries等保護(hù)機(jī)制,似乎這件事就更難了。

所以我們先將這個(gè)問題放一放,在腦袋里記著這個(gè)目標(biāo),先來做一些準(zhǔn)備工作。

攻破Stack Canaries防護(hù)

如果不知道什么是stack canaries可以先看這里,簡單來說就是在棧上的return address下面放一個(gè)隨機(jī)生成的數(shù)(成為canary),在函數(shù)返回時(shí)進(jìn)行檢查,如果發(fā)現(xiàn)這個(gè)canary被修改了(可能是攻擊者通過buffer overflow等攻擊方法覆蓋了),那么就報(bào)錯(cuò)。

那么如何攻破這層防護(hù)呢?一種方法是brute-force暴力破解,但這個(gè)很低效,這里作者提出了一種叫做“stack reading”的方法:

假設(shè)這是我們想要overflow的棧的布局:

我們可以嘗試任意多次來判斷出overflow的長度(直到進(jìn)程由于canary被破壞crash了,在這里即為4096+8=4104個(gè)字節(jié)),之后我們將這4096個(gè)字節(jié)填上任意值,然后一個(gè)一個(gè)字節(jié)順序地進(jìn)行嘗試來還原出真實(shí)的canary,比如說,我們將第4097個(gè)字節(jié)填為x,如果x和原來的canary中的第一個(gè)字節(jié)是一樣的話,那么進(jìn)程不會(huì)crash,否則我們嘗試下一個(gè)x的可能性,在這里,由于一個(gè)字節(jié)只有256種可能,所以我們只要最多嘗試256次就可以找到canary的某個(gè)正確的字節(jié),直到我們得到8個(gè)完整的canary字節(jié),該流程如下圖所示:

我們同樣可以用這種方法來得到保存好的frame pointer和return address。

尋找stop gadget

到目前為止,我們已經(jīng)得到了合適的canary來繞開stack canary的保護(hù), 接下來的目標(biāo)就是找到之前提到的4個(gè)gadgets。

在尋找這些特定的gadgets之前,我們需要先來介紹一種特殊的gadget類型:stop gadget.

一般情況下,如果我們把棧上的return address覆蓋成某些我們隨意選取的內(nèi)存地址的話,程序有很大可能性會(huì)掛掉(比如,該return address指向了一段代碼區(qū)域,里面會(huì)有一些對空指針的訪問造成程序crash,從而使得攻擊者的連接(connection)被關(guān)閉)。但是,存在另外一種情況,即該return address指向了一塊代碼區(qū)域,當(dāng)程序的執(zhí)行流跳到那段區(qū)域之后,程序并不會(huì)crash,而是進(jìn)入了無限循環(huán),這時(shí)程序僅僅是hang在了那里,攻擊者能夠一直保持連接狀態(tài)。于是,我們把這種類型的gadget,成為stop gadget,這種gadget對于尋找其他gadgets取到了至關(guān)重要的作用。

尋找可利用的(potentially useful)gadgets

假設(shè)現(xiàn)在我們找到了某個(gè)可以造成程序block住的stop gadget,比如一個(gè)無限循環(huán),或者某個(gè)blocking的系統(tǒng)調(diào)用(sleep),那么我們該如何找到其他 useful gadgets呢?(這里的“useful”是指有某些功能的gadget,而不是會(huì)造成crash的gadget)。

到目前為止我們還是只能對棧進(jìn)行操作,而且只能通過覆蓋return address來進(jìn)行后續(xù)的操作。假設(shè)現(xiàn)在我們猜到某個(gè)useful gadget,比如pop rdi; ret, 但是由于在執(zhí)行完這個(gè)gadget之后進(jìn)程還會(huì)跳到棧上的下一個(gè)地址,如果該地址是一個(gè)非法地址,那么進(jìn)程最后還是會(huì)crash,在這個(gè)過程中攻擊者其實(shí)并不知道這個(gè)useful gadget被執(zhí)行過了(因?yàn)樵诠粽呖磥碜詈蟮男Ч际沁M(jìn)程crash了),因此攻擊者就會(huì)認(rèn)為在這個(gè)過程中并沒有執(zhí)行到任何的useful gadget,從而放棄它,這個(gè)步驟如下圖所示:

但是,如果我們有了stop gadget,那么整個(gè)過程將會(huì)很不一樣. 如果我們在需要嘗試的return address之后填上了足夠多的stop gadgets,如下圖所示:

那么任何會(huì)造成進(jìn)程crash的gadget最后還是會(huì)造成進(jìn)程crash,而那些useful gadget則會(huì)進(jìn)入block狀態(tài)。盡管如此,還是有一種特殊情況,即那個(gè)我們需要嘗試的gadget也是一個(gè)stop gadget,那么如上所述,它也會(huì)被我們標(biāo)識(shí)為useful gadget。不過這并沒有關(guān)系,因?yàn)橹笪覀冞€是需要檢查該useful gadget是否是我們想要的gadget.

最后一步:遠(yuǎn)程dump內(nèi)存

到目前為止,似乎準(zhǔn)備工作都做好了,我們已經(jīng)可以繞過canary防護(hù),并且得到很多不會(huì)造成進(jìn)程crash的“potential useful gadget”了,那么接下來就是該如何找到我們之前所提到的那四個(gè)gadgets呢?

如上圖所示,為了找到前兩個(gè)gadgets:pop %rsi; ret和pop %rdi; ret,我們只需要找到一種所謂的BROP gadget就可以了,這種gadget很常見,它做的事情就是恢復(fù)那些callee saved registers. 而對它進(jìn)行一個(gè)偏移就能夠生成pop %rdi和pop %rsi這兩個(gè)gadgets.

不幸的是pop %rdx; ret這個(gè)gadget并不容易找到,它很少出現(xiàn)在代碼里, 所以作者提出一種方法,相比于尋找pop %rdx指令,他認(rèn)為可以利用strcmp這個(gè)函數(shù)調(diào)用,該函數(shù)調(diào)用會(huì)把字符串的長度賦值給%rdx,從而達(dá)到相同的效果。另外strcmp和write調(diào)用都可以在程序的Procedure Linking Table (PLT)里面找到.

所以接下來的任務(wù)就是:

  • 找到所謂的BROP Gadget;
  • 找到對應(yīng)的PLT項(xiàng)。

尋找BROP Gadget

事實(shí)上BROP gadgets特別特殊,因?yàn)樗枰樞虻貜臈I蟨op 6個(gè)值然后執(zhí)行ret。所以如果我們利用之前提到的stop gadget的方法就可以很容易找到這種特殊的gadget了,我們只需要在stop gadget之前填上6個(gè)會(huì)造成crash的地址:

如果任何useful gadget滿足這個(gè)條件且不會(huì)crash的話,那么它基本上就是BROP gadgets了。

尋找PLT項(xiàng)

PLT是一個(gè)跳轉(zhuǎn)表,它的位置一般在可執(zhí)行程序開始的地方,該機(jī)制主要被用來給應(yīng)用程序調(diào)用外部函數(shù)(比如libc等),具體的細(xì)節(jié)可以看相關(guān)的Wiki。它有一個(gè)非常獨(dú)特的signature:每一個(gè)項(xiàng)都是16個(gè)字節(jié)對齊,其中第0個(gè)字節(jié)開始的地址指向改項(xiàng)對應(yīng)函數(shù)的fast path,而第6個(gè)字節(jié)開始的地址指向了該項(xiàng)對應(yīng)函數(shù)的slow path:

另外,大部分的PLT項(xiàng)都不會(huì)因?yàn)閭鬟M(jìn)來的參數(shù)的原因crash,因?yàn)樗鼈兒芏喽际窍到y(tǒng)調(diào)用,都會(huì)對參數(shù)進(jìn)行檢查,如果有錯(cuò)誤會(huì)返回EFAULT而已,并不會(huì)造成進(jìn)程crash。所以攻擊者可以通過下面這個(gè)方法找到PLT:如果攻擊者發(fā)現(xiàn)好多條連續(xù)的16個(gè)字節(jié)對齊的地址都不會(huì)造成進(jìn)程crash,而且這些地址加6得到的地址也不會(huì)造成進(jìn)程crash,那么很有可能這就是某個(gè)PLT對應(yīng)的項(xiàng)了。

那么當(dāng)我們得到某個(gè)PLT項(xiàng),我們該如何判斷它是否是strcmp或者write呢?

對于strcmp來說, 作者提出的方法是對其傳入不同的參數(shù)組合,通過該方法調(diào)用返回的結(jié)果來進(jìn)行判斷。由于BROP gadget的存在,我們可以很方便地控制前兩個(gè)參數(shù),strcmp會(huì)發(fā)生如下的可能性:

arg1 | arg2 | result :--: | :--: | :--: readable | 0x0 | crash 0x0 | readable | crash 0x0 | 0x0 | crash readable | readable | nocrash

根據(jù)這個(gè)signature, 我們能夠在很大可能性上找到strcmp對應(yīng)的PLT項(xiàng)。

而對于write調(diào)用,雖然它沒有這種類似的signature,但是我們可以通過檢查所有的PLT項(xiàng),然后觸發(fā)其向某個(gè)socket寫數(shù)據(jù)來檢查write是否被調(diào)用了,如果write被調(diào)用了,那么我們就可以在本地看到傳過來的內(nèi)容了。

最后一步就是如何確定傳給write的socket文件描述符是多少了。這里有兩種辦法:1. 同時(shí)調(diào)用好幾次write,把它們串起來,然后傳入不同的文件描述符數(shù);2. 同時(shí)打開多個(gè)連接,然后使用一個(gè)相對較大的文件描述符數(shù)字,增加匹配的可能性。

到這一步為止,攻擊者就能夠?qū)⒄麄€(gè).text段從內(nèi)存中通過socket寫到本地來了,然后就可以對其進(jìn)行反編譯,找到其他更多的gadgets,同時(shí),攻擊者還可以dump那些symbol table之類的信息,找到PLT中其它對應(yīng)的函數(shù)項(xiàng)如dup2和execve等。

0x11 BROP的攻擊流程 2 - 實(shí)施攻擊


到目前為止,最具挑戰(zhàn)性的部分已經(jīng)被解決了,我們已經(jīng)可以得到被攻擊進(jìn)程的整個(gè)內(nèi)存空間了,接下來就是按部就班了(從論文中翻譯):

  • 將socket重定向到標(biāo)準(zhǔn)輸入/輸出(standard input/output)。攻擊者可以使用dup2或close,跟上dup或者fcntl(F_DUPFD)。這些一般都能在PLT里面找到。
  • 在內(nèi)存中找到/bin/sh。其中一個(gè)有效的方法是從symbol table里面找到一個(gè)可寫區(qū)域(writable memory region),比如environ,然后通過socket將/bin/sh從攻擊者這里讀過去。
  • execve shell. 如果execve不在PLT上, 那么攻擊者就需要通過更多次的嘗試來找到一個(gè)pop rax; ret和syscall的gadget.

歸納起來,BROP攻擊的整個(gè)步驟是這樣的:

  • 通過一個(gè)已知的stack overflow的漏洞,并通過stack reading的方式繞過stack canary的防護(hù),試出某個(gè)可用的return address;
  • 尋找stop gadget:一般情況下這會(huì)是一個(gè)在PLT中的blocking系統(tǒng)調(diào)用的地址(sleep等),在這一步中,攻擊者也可以找到PLT的合法項(xiàng);
  • 尋找BROP gadget:這一步之后攻擊者就能夠控制write系統(tǒng)調(diào)用的前兩個(gè)參數(shù)了;
  • 通過signature的方式尋找到PLT上的strcmp項(xiàng),然后通過控制字符串的長度來給%rdx賦值,這一步之后攻擊者就能夠控制write系統(tǒng)調(diào)用的第三個(gè)參數(shù)了;
  • 尋找PLT中的write項(xiàng):這一步之后攻擊者就能夠?qū)⒄麄€(gè)內(nèi)存從遠(yuǎn)端dump到本地,用于尋找更多的gadgets;
  • 有了以上的信息之后,就可以創(chuàng)建一個(gè)shellcode來實(shí)施攻擊了。

0x100 后記


以上就是BROP攻擊的原理,在這篇博文中重現(xiàn)了這個(gè)攻擊,有興趣的可以去看看。

其實(shí)在整個(gè)攻擊過程中最酷的要數(shù)第一個(gè)步驟:如何dump內(nèi)存,之后的步驟其實(shí)就是傳統(tǒng)的ROP攻擊了。明白了原理之后,其實(shí)最好的了解該攻擊的方法就是看源代碼了,這個(gè)對了解整個(gè)ROP會(huì)有非常大的幫助。


原文地址: http://drops.wooyun.org/tips/3071

總結(jié)

以上是生活随笔為你收集整理的Blind Return Oriented Programming (BROP) Attack - 攻击原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 九一亚洲精品 | 99精品国产成人一区二区 | 69免费| 91精品久久香蕉国产线看观看 | 青青草av在线播放 | 精品久久毛片 | 日韩毛片基地 | 欧美日韩国产在线观看 | 免费无毒av| 免费特黄视频 | 爱逼综合网 | 国产免费一区二区三区四区五区 | 日韩毛片网站 | 欧美一区欧美二区 | 99成人在线观看 | 无码国产精品一区二区免费式直播 | 欧美毛片基地 | 1024久久 | 呦呦av| 日本大尺度吃奶做爰久久久绯色 | 久久综合一本 | 手机在线看黄色 | 成人午夜免费观看 | 久久久久久久久久一区二区三区 | 风流僵尸艳片a级 | 欧美黑人一级 | 麻豆福利影院 | 久草免费新视频 | 69人妻一区二区三区 | 天天综合中文字幕 | 午夜影视av | 国产精品入口麻豆九色 | 国产欧美激情在线观看 | 日韩一级片中文字幕 | 日韩精品一级 | 99re视频 | 涩涩片影院 | 国产精品高清网站 | 日本无遮挡边做边爱边摸 | 久久精品黄 | 91精品欧美一区二区三区 | 在线视频这里只有精品 | www.17c.com喷水少妇 | 天天摸天天摸 | 99热黄色 | 国产又大又黄的视频 | 欧美zozo| 天美视频在线观看 | 老熟妇仑乱一区二区av | 筱田优全部av免费观看 | 午夜激情电影院 | 日本丰满少妇 | 亚洲综合一区二区 | 婷婷中文字幕 | 黄色三级免费 | 国产美女一区 | 欧美性猛交xxxx久久久 | 香蕉在线视频观看 | 手机av不卡| 少妇做爰免费视频播放 | 久草电影在线 | 欧美午夜精品久久久久久浪潮 | 鲁一鲁在线视频 | 1769国产精品视频 | 精品一区二区三区蜜桃 | 国产aⅴ无码片毛片一级一区2 | 国产一区免费 | 香蕉网站在线 | 日韩视频一区二区三区 | 成人第一页 | 搞黄视频在线观看 | 猎艳山村丰满少妇 | 伊人365 | 公肉吊粗大爽色翁浪妇视频 | 啪啪网站免费看 | 国产精品 日韩 | 国产欧美日韩精品一区 | 日本www网站 | 中文在线字幕免费观看 | 伦av综合一区 | 精品3p| 亚洲最大毛片 | 最好看的2019年中文在线观看 | 天天影视综合 | 亚洲AV无码成人精品区麻豆 | 毛片无遮挡高清免费观看 | 午夜色综合 | 岛国av免费看 | 91精品久久人妻一区二区夜夜夜 | 福利在线看 | 国产高清精品软件丝瓜软件 | 亚州男人的天堂 | 最近中文字幕在线免费观看 | 多啪啪免费视频 | 亚洲二区在线视频 | 欧美激情一区二区视频 | 日韩色图在线观看 | 中文字幕一区二区人妻在线不卡 | 亚洲乱码国产乱码精品 |