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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

软件安全与脆弱性分析-对于freenote小程序的Poc分析

發布時間:2023/12/20 编程问答 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 软件安全与脆弱性分析-对于freenote小程序的Poc分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近上軟件安全與脆弱性分析課程,對freenote小程序(貌似是某一年的CTF題)進行了依次Poc分析。感覺很有意思,在這里對分析過程進行一個總結。

1.程序功能介紹


給定的程序運行界面如上圖所示,大體上分為五個模塊他們分別為:(1)列出已經存儲的記錄、(2)添加新的記錄、(3)編輯指定的記錄、(4)刪除已經存儲的記錄、(5)退出程序。

將note程序加載到ida中,可以得到程序的匯編代碼部分,動態調試后可以得到程序初始化后的開始位置:

在ida中進入到不同的功能函數中,利用反匯編可以得到功能函數的偽代碼部分分別如下:

(1)列出已經存儲的記錄功能函數的偽代碼:

(2)新建記錄功能函數的偽代碼:



(3)編輯已經存儲記錄功能函數的偽代碼:

(4)刪除已有記錄功能函數的偽代碼:


(5)退出程序功能函數僅調用庫函數puts()實現字符串“bye”的輸出;

同時,根據note初始化函數,分析note存儲結構我們可以推斷其大致如下:

??????? 所有note都存儲在堆中,塊大小四舍五入到0x80字節的下一個倍數

??????? 有一個表存儲指向note的指針,以及它們的大小和一個表示它們當前是否正在使用的標志

??????? 該表最多可以存儲256個note,并且在程序初始化期間也被分配到堆上

??????? 在刪除一個note時,相應的塊被釋放,并且在表中清除了in_use標志

其中n表示表格中可用槽的數量(256)(8字節),m表示已使用槽的數量(在上例中為兩個)(8字節)。Note entry包括(8字節)標識(是否被使用),(8字節)長度,(8字節)指針。

2.Poc分析

通過上一部分的分析,我們對note程序的框架有了一個基本的了解,接下來利用動態分析,對程序的崩潰點進行分析;

我們按照Poc提示的輸入內容,對程序進行實驗,在輸入第二次刪除已有記錄操作的時候,可以發現程序發生了崩潰,實驗分析截圖如下:

輸入:

2

6

aaaaaaaaaaaaaaaaa

分析:

qword_6020A8地址如下:

?

查看該地址:

note該結構共有256(0000 00000000 0100)個可使用空間,已使用1(0000 0000 0000 0001)個空間,第一個note在使用中,標志符為1(0000 0000 0000 0001),長度為6(0000 0000 0000 0006),地址為(0000 0000 0154 2830)。查看如下:

?

輸入:

2

8

bbbbbbbbbbbbbbbbbbb

分析同上:

?

?

輸入:

2

10

cccccccccccccccc

分析同上:

?

輸入:

4

1

分析:

?

輸入:

4

1

分析:

程序crash,刪除時沒有檢查該note是否被使用。

根據Poc的輸入我們發現在對同一個記錄進行兩次刪除操作,而導致了程序崩潰,所以我們判斷對記錄進行刪除的功能函數里面出現了錯誤從而導致程序崩潰,在刪除記錄函數部分設置斷點,進行動態調試的過程中可以發現,程序在第二次刪除與第一次擁有相同記錄號的記錄時,發生了錯誤,錯誤的位置為調用庫函數free();

找到程序錯誤位置后,我們再利用ida反匯編功能,進入到刪除記錄函數的偽代碼中去仔細觀察,發現程序在刪除記錄的時候并沒有檢查記錄號對應的記錄的狀態,即并沒有檢查所要刪除的記錄是否已經被刪除過,所以當再次刪除已經刪除的記錄時,庫函數free()將對已經釋放的空間再次釋放,從而產生double free的錯誤,導致程序崩潰,至此我們對note程序的崩潰有了一個完整認識。



3.漏洞利用

???????? 通過對漏洞位置的確定,我們可以針對漏洞產生的函數free()來構造漏洞的利用手段,大體上分為兩個部分,一是對程序存放堆中note起始的位置的確定,二是通過構造虛假的chunk塊達到更改GOT表項free()函數對應的地址位置,來實現攻擊。

3.1Linux下的堆內存管理基礎

想要根據free函數進行漏洞利用,我們需要了解Linux對堆塊管理的基本知識,Linux中對堆塊使用malloc_chunk的數據結構進行管理,數據結構的定義如下圖所示:

其中prev_size指連續虛擬地址中當前塊即chunk相鄰的前一塊,它占據的存儲空間大小;size指當前塊占據的存儲空間大小;fd和bk指針只有在數據塊沒有被使用時才有效,他們分別指向前一塊沒有被使用的數據塊和后一塊沒有被使用的數據塊,這里涉及到了Linux下對空閑chunk的管理,利用bins鏈表將空閑的存儲塊按照存儲空間的大小進行分類管理。當程序釋放一個chunk塊的時候,操作系統將會在在釋放快的前后連續的虛擬地址空間進行判斷,看是否其前后的塊已經是被釋放的塊,如果是則會將該塊從空閑鏈表隊列即bins隊列中刪除(unlink),與當前釋放塊進行合并后再次放入對應的bins鏈表中,在進行unlink操作的過程中,若對P進行刪除,則會進行P->bk->fd=P->fd與P->fd->bk=P->bk這兩個操作,具體的unlink函數定義如下。

在了解了Linux下的堆內存存儲管理后,我們還需要了解GOT表項,簡單來說在Linux下,如果一個程序執行的過程中需要調用外部庫函數,則會去GOT表項中尋找對應的外部庫函數的地址,例如本程序在執行free操作的時候,就會去GOT表項中尋free函數對應的地址,拿到對應的地址之后便可以執行free操作。

3.2note堆首地址確認

這一部分,主要實現對存儲note的堆的基址的確認,只有確認了基址我們才能在后面的步驟中進行chunk的偽造。確認地址的步驟如下:

(1)新建四個note,分別記為note0、note1、note2、note3存儲“a”或任意其他字符,得到的note表已經具體的chunk布局如下:


(2)依次將note0與note2進行free操作,此時可以在bins鏈表中找到note0與note2對應的地址,表示他們已經作為未被使用的chunk被系統所回收,且note0的bk指針將會指向note2;

(3)再次創建一個新的note,使其滿足8字節的內容大小如“12345678”,系統根據FIFO原則會將首次釋放的note0空間分配給新的note,且note0中fd指針的位置會被新note的數據內容所覆蓋,而bk指針因為新存note的長短則不會被覆蓋,又因為新存入的字符串沒有結束符,則在讀取字符串的過程中會將其后面的bk內容也讀出,根據bk所指向的地址空間位置,進行簡單地計算后我們便能夠得出存儲note0的位置;

3.3構造偽chunk替換GOT中的free函數地址

在上一小節中,我們得到了存儲note的首地址,根據首地址我們重新建立三個note,第一個note包含我們偽造的chunk,其中這個偽造的chunk我們使其狀態為已經釋放,且fd指向chunk的bk與bk指向chunk的fd相同(滿足后面所述的unlink條件),第二個note為真chunk,將其內容存為“/bin/sh”,第三個note存儲若干偽chunk,內容可以用字符串“a”代替,在進行了上述操作后,我們得到了兩個chunk組,一個為真一個為假,他們布局分別如下圖所示:

接下來我們要進行的操作就是修改GOT表項中free函數的地址使其被我們想要執行函數的地址所替代。

由上圖可知,一開始創建的四個note中note3地址為0X6049d0,所以首先對note3進行釋放操作,此時操作系統會檢測當前地址前一個chunk所處的狀態,而其前一個chunk,根據size與pre_size計算得出剛好就是我們新建的note0中的偽造的那部分chunk,由于當前釋放的chunk中0x90字段的最低位表示了前一個chunk為釋放狀態,且它的fd與bk在構造時滿足unlink條件(fd->bk=bk->fd=p)則會對其進行unlink后與當前請求釋放chunk進行合并操作。

??

合并前note表部分布局如下圖所示,其中note0的地址是正常的存儲note0內容的地址。

?

在進行unlink的過程中,設unlink的對象為P,P結構如下所示。

則會進行P->bk->fd=P->fd與P->fd->bk=P->bk的操作,那么P->bk指向的地址為0X603020,它所表示的chunk的fd指針的地址為0X603030,其內容0X604830將會被改寫為P->fd即0X603018。同理p->fd所指向的地址為0X603018,它表示的chunk的bk指向的地址也為0X603030,其中內容將會被改寫為P->bk即0X603018,得到note表如下圖:


此時如果我們對note0記錄進行編輯操作,系統會按照note0對應的地址對note0進行修改(實際上已經在修改note表項),那么我們可以將note0對應的地址改為GOT表項的地址,當我們查看note0時,系統將會根據note0在note表中的地址(此時已經是GOT表項)打印給我們,這時,我們可以根據free字段去修改free函數對應的函數地址,將其改為我們想要程序執行的函數如system,這是如果我們再次釋放note1,則程序會利用GOT表項中的free字段對應的函數地址(此時已經為system函數地址)來調用system(“/bin/sh“)了。

至此,我們通過利用Linux堆內存管理體制中unlink操作下的漏洞成功攻擊了程序,實現了note程序的漏洞利用。

參考資料:

http://rk700.github.io/2015/04/21/0ctf-freenote/
https://kitctf.de/writeups/0ctf2015/freenote
https://www.cnblogs.com/alisecurity/p/5520847.html



總結

以上是生活随笔為你收集整理的软件安全与脆弱性分析-对于freenote小程序的Poc分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 蜜臀av性久久久久av蜜臀妖精 | 动漫av一区二区三区 | 在线h网站 | 亚洲a中文字幕 | 成人午夜免费电影 | 狠狠干夜夜干 | 香蕉人妻av久久久久天天 | 亚洲AV无码成人精品国产一区 | 国产区免费 | 看毛片网站 | 人妻在客厅被c的呻吟 | 亚洲狠狠| 免费看片亚洲 | 日韩视频免费在线 | 在线观看欧美一区二区 | 日韩成人av一区二区 | 日本xxx在线观看 | 熟妇高潮喷沈阳45熟妇高潮喷 | 人人操日日干 | 一级特黄aa大片免费播放 | 日本亚洲黄色 | 国产视频黄色 | 午夜毛片视频 | 在线免费视频一区 | 一呦二呦三呦精品网站 | 五月婷婷中文 | 亚洲精品国产成人 | 日本少妇aaa | 1000亚洲裸体人体 | 午夜精品导航 | 91丨porny丨中文| 亚洲男人在线天堂 | 亲子乱子伦xxxx | 亚洲午夜毛片 | 免费成人黄色av | 国产精品男同 | 一个人在线观看www软件 | 无码人妻丰满熟妇区毛片18 | 人人爽爽爽 | 日韩毛片一级 | 18深夜在线观看免费视频 | 牛牛视频在线观看 | 国产美女作爱全过程免费视频 | 国产 日韩 欧美在线 | av在线电影网站 | 精品福利在线 | 日本欧美国产一区二区三区 | 毛片基地免费 | 一级黄色大片视频 | av网址免费 | 日本人六九视频 | 国产成人精品女人久久久 | 日韩爱爱网 | 久久久久99精品国产片 | h片免费观看| 久久中文字幕无码 | 日韩一区二区在线观看视频 | 国语对白一区二区三区 | 97久久国产亚洲精品超碰热 | 四虎色| 亚洲区 欧美区 | 三级a毛片 | 黄色片视频播放 | 日韩精品视频免费播放 | 丰满人妻熟妇乱偷人无码 | aa黄色大片 | 91sex国产| 四虎影院一区 | 国产精品无码无卡无需播放器 | 久久久男人天堂 | 国产日日日 | 少妇欧美激情一区二区三区 | 黄色片网战 | 午夜精品久久久久久久蜜桃 | 色偷偷亚洲 | 成年人免费黄色片 | 在线美女av | 国产一二三 | 日韩第一页在线 | 超碰最新网址 | 动漫玉足吸乳羞免费网站玉足 | 欧美91精品| 国模精品视频 | 女女互慰揉小黄文 | 欧美日韩午夜精品 | 黄色理论片| 日韩av区 | 手机av网站| 成人综合久久 | 亚洲精品国产精品国自产 | 日本在线观看一区 | 韩国三级中文字幕hd浴缸戏 | 超碰成人av | 成人在线视频一区二区三区 | www.在线看 | 亚洲AV无码久久精品国产一区 | 日本天堂免费a | 又色又爽又高潮免费视频国产 | 国产精品毛片va一区二区三区 |