CTF記憶體高階利用技術

Ox9A82發表於2016-10-01

起了一個比較屌的標題,233。想寫這篇文章主要是看了kelwya分析的議題,於是準備自己動手實踐一下。藍蓮花的選手真的是國際大賽經驗豐富,有很多很多的思路和知識我完全都沒有聽說過。這篇文章會寫一些不常見但是確實出現過Pwn解題思路。

1.fastbin的第三種方式?

我們知道fastbin一般有兩種利用方式,透過這兩種利用可以實現任意地址分配堆。現在來談一談第三種利用方式

  • 概述:基本思路是透過覆寫一些值,使本來不在fastbin範圍的堆塊也被作為fastbin被處理
  • 原理:fastbin在32位下被規定為16~64,在64位下被規定為32~128。但是事實上這個值由一個被稱為global_max_fast全域性變數控制。只有能夠覆寫這個全域性變數就可以實現讓本來不在fastbin範圍的堆塊被當作fastbin塊處理
  • 步驟:
    1. 透過任意地址寫,覆寫global_max_fast為一個很大的值
    2. 分配兩個堆塊(大於64byte)
    3. 釋放掉高地址的堆塊
    4. 透過低地址處的堆塊溢位掉高地址堆塊的fd指標
    5. 連續分配兩次堆塊
  • 效果:實現任意大小chunk的任意地址堆分配
  • 例項:PlaidCTF 2014的datastore、HITCON 2015的fooddb、0CTF 2016的Zerostorage
  • Demo:

2.基於堆的off by one

堆的off by one是指當向一個堆塊中寫入時,因為沒有考慮好大小問題。導致一個空位元組覆蓋到下一個堆塊的頭部。發生這種情況的原因通常是複製一個字串到一塊堆記憶體時,如果字串和堆的大小正好相等,那麼就會發生off by one。

  • 概述:一個'\x00'位元組溢位導致覆蓋掉下一個堆頭的size域的最低一個位元組。  
  • 原理:堆分配時,往往會少分配4個位元組(32位下)。比如使用者申請1020個位元組,如果按照常理應該是分配1028個位元組的,但是實際上卻只分配了1024個字      節。1024個位元組裝不下1028個位元組的內容,所以要借用下一個塊的prev_size結構的四個位元組。這個也就是為什麼說,當前一個空閒時,prev_size是前一塊的大  小,當前一塊使用時,pre_size是前一塊的結尾內容。因為這種特殊的記憶體分配導致了off by one多出的一個'\x00'位元組可以覆蓋到下一塊的size域。
  • 利用:這種漏洞可以導致各種各樣、花式花樣的overlap

 

3.待續

相關文章