欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

網(wǎng)絡(luò)安全滲透測試之musl堆利用技巧

 更新時間:2022年02月19日 14:29:38   作者:kali_Ma  
這篇文章主要為大家介紹了網(wǎng)絡(luò)安全滲透測試之musl堆利用技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

最近比賽出的musl題型的越來越多,不得不學習一波musl的堆利用來應對今后的比賽。這里要講的是musl1.22版本的利用,因為網(wǎng)上可以找到很多審計源碼的文章,所以這篇文章是通過一道題目來debug去學習堆的利用技巧,這里用到的是2021第五空間線上賽的notegame題目。

題目分析

1、首先是add函數(shù),使用了calloc,申請的最大size是0x90

image.png

2、接著是delete函數(shù),free之后將指針清空了

image.png

3、然后是edit函數(shù),漏洞就出現(xiàn)在這里,這里存在溢出空字節(jié)的漏洞,可以對index清零指向 fake_meta

image.png

4、最后來看這個update函數(shù),這個realloc函數(shù)會將原來chunk的內(nèi)容復制到新的chunk里面,我們可以用這個來進行泄露libc地址

image.png

調(diào)試分析

musl的chunk跟glibc的區(qū)別就是,chunk頭的結(jié)構(gòu)存放了比較少的堆塊信息,沒有像glibc那樣存放了一些指針地址信息,所以我們?nèi)绻孤秎ibc地址的話也是要特定的條件,就是要chunk里面保存著另外一個chunk的指針地址或者其他指針地址的信息,而且也再不能直接改指針去達到任意分配的效果,而是要改chunk頭僅有的信息去偽造meta進行任意分配。

malloc_context

add(0x20,'a'*0x20)

image.png

1、secret是用來校驗meta域的一個key

2、free_meta_head存放著釋放掉的meta,是個單鏈表結(jié)構(gòu),這里還沒有釋放,所以為空

3、active是根據(jù)size大小分出來的不同的meta

4、usage_by_class是對應meta的數(shù)量

meta

add(0x20,'a'*0x20)
add(0x20,'a'*0x20)
add(0x20,'a'*0x20)
add(0x20,'a'*0x20)
free(3)

image.png

1、prev和next分別是上一個和下一個meta頁,這里都指向本身,表示只有一個meta頁

2、 mem表示group的地址,它是由多個chunk組成

3、avail_mask表示可以分配的chunk情況,0x3f0=0b01111110000,因為我們已經(jīng)分配了4個堆塊,所以這里表示前四個不可分配。

4、freed_mask表示已經(jīng)釋放的chunk情況,因為我們釋放掉了第一個chunk,所以這里的0x1表示的是free掉的第一個chunk

5、last_idx表示最后一個chunk的下標,這里是0x9,總數(shù)是0xa個

6、freeable表示已經(jīng)釋放的堆塊個數(shù)

7、sizeclass表示管理的group的大小

8、maplen如果不為零表示mmap分配的內(nèi)存頁數(shù)

chunk

add(0x20,'a'*0x20)
add(0x20,'a'*0x20)
add(0x20,'a'*0x20)
add(0x20,'a'*0x20)
free(3)

image.png

1、表示距離group首地址的偏移分別為0x0、0x30、0x60,系統(tǒng)是根據(jù)這個偏移來找到對應的meta地址,所以我們?nèi)绻芨倪@個偏移比如把chunk1的偏移置零的話,就能在chunk1-0x10的地方偽造一個meta的指針,而這個地方又是我們可以控制的chunk0的data域,于是我們就可以在任意地方偽造一個meta,不過這個地址必須是跟0x1000對齊的。

2、表示當前chunk的下標,當chunk被free之后會變成0xff

3、表示剩下用戶空間的大小,chunk頭后面的4個字節(jié)跟glibc的prev_size那樣可以被上一個chunk復用, 所以我們就可知道我們分配的大小跟chunk大小的關(guān)系

0x10:0-0xc
0x20:0xd-0x1c
0x30:0x1d-0x2c
0x40:0x2d-0x3c
...

chunk的分配釋放

add(0x50,'a'*0x50)
add(0x50,'a'*0x50)
add(0x50,'a'*0x50)
free(0)
add(0x50,'a'*0x50)

image.png

avail_mask = 0x10=0b10000

freed_mask = 0x1 =0b00001

musl的chunk釋放了之后并不會馬上分配,這里group里面有5個chunk,先是申請了3個chunk,然后free掉第一個,再次申請的時候并不會把第一個chunk分配出來,而是把group的第四個chunk申請出來,然后對應的avail_mask置零

add(0x50,'a'*0x50)
add(0x50,'a'*0x50)
add(0x50,'a'*0x50)
add(0x50,'a'*0x50)
free(0)
free(1)
free(2)
add(0x50,'a'*0x50)
add(0x50,'a'*0x50)

image.png

avail_mask = 0x6 =0b0110

freed_mask = 0x0 =0b0000

耗盡group的chunk的時候,musl會把釋放掉的申請出來,并把其他chunk對應的avail_mask置1

meta的釋放

add(0x50,'a'*0x50)
free(0)

image.png

當只有一個chunk是被分配出去的,而freed_mask=0,我們把這個chunk給free掉之后,系統(tǒng)會回收整塊meta空間

add(0x50,'a'*0x50)
add(0x50,'a'*0x50)
add(0x50,'a'*0x50)
add(0x50,'a'*0x50)
add(0x50,'a'*0x50)
free(0)
free(1)
free(2)
free(3)
free(4)

image.png

總結(jié)起來,就是說avail_mask |freed_mask的結(jié)果是滿狀態(tài)的時候,就會釋放這個meta。

總結(jié)

本篇先通過debug的方法來簡單闡述musl堆塊的結(jié)構(gòu),后續(xù)再講如何對它進行利用。

更多關(guān)于網(wǎng)絡(luò)安全滲透測試musl堆的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論