【津門杯2021】pwn復現

Ch33_1n'
May 13, 2021

1. easypwn

地址泄露

libc2.23的程式,delete 一個 0x80(0x91)的chunk進入unsorted bin就能泄露libc地址。由於show函數加了限制,這裏必須malloc回bin中的chunk才能show。同時由於add函數在content結尾追加 '\x00',得繞過才能打印出地址。根據add的輸入邏輯,輸入size+1時能不追加截斷符,並退出循環:

也就是寫滿size+1的内容,才不會發生'\x00'截斷。爲了main_arena指針殘留在chunk中,可以從unsorted bin中切割最小chunk。如申請0x08,只能寫9個字符,但實際上分配了0x20的空間,bk位置有殘留的main_arena指針。

修改freehook

前面的地址泄露過程已經用了0、1、2三個id,只剩下一次add機會,顯然通過fastbin attack是修改不了的。

到目前爲止只利用了des成員的漏洞,再看下phone number 和 name。list和chunk_list是有重叠的,都是指向同一片空間,只是開始位置不同。

加上name和phone的輸入無限制(add和edit函數中均是如此),可以直接利用溢出漏洞修改chunk_list索引,後續再輸入des info時就會寫到target addr中,相當於任意地址寫。這樣無需消耗add次數,就能達到修改目的了。

exp

2. CTFM

這個題比賽的時候不會做,賽後看Nu1l的wp學的。復現之前已經知道是libc 2.27的環境,比賽時不知道emmm。

漏洞點

off-by-null。并且每次add的時候都會在size+1處追加`\x00`。跟前一題不同的是,這裏的截止符是一定會追加的,不能繞過。不繞過還可以利用嘛,程式除此以外無其他漏洞了。

add函數的其他三個list沒什麽可利用的,不像上一題存在溢出漏洞。不過這裏add的id并非只增不減,每次add的都是free掉的id,也就是可以不斷刪除、申請,只要同時分配的chunk不超過10個就可以了。

地址泄露

主要問題是怎麽構造unsorted bin。size限制為0x1f0,有tcache,那就是得通過consolidate構造了。加上off by null的漏洞,可以將最後一個chunk的prev_size位覆蓋成一個包括前面所有chunk的size、size的標志位置0。這樣free的時候,會把前面幾個chunk合并成一個大chunk,鏈入到unsorted bin中。

注意要繞過unlink的檢查。在上面的八個chunk之前再加一個chunk,先free掉中間的七個,再free chunk 0進入unsorted bin鏈,這時chunk 0的size變爲0x100. 最後free chunk8,能觸發unlink,tcache上的7個chunk都被合并在一起。

再申請回來的時候發現,chunk 6剛好在這個位置:

還在unsorted bin中,直接show就能泄露了。

修改freehook

既然6還在bin中,那就可以通過改chunk 6的fd指針完成修改目的了。

exp

--

--