網鼎杯2020 朱雀部分writeup

Reverse –go

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述
替換了base64字典

解題思路:
程序將我們輸入的key,經過換了編碼字典的base64加密後,去掉最後==,計算key加密後的長度,長度爲0x16,就開始解密。那麼我們只需要輸入正確的key就有flag了,知道了base64加密字典XYZFGHI2+/Jhi345jklmEnopuvwqrABCDKL6789abMNWcdefgstOPQRSTUVxyz01,和密文nRKKAHzMrQzaqQzKpPHClX==,解密如下:

在這裏插入圖片描述
在這裏插入圖片描述

Reverse –tree

在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述
解題思路:
先找到根節點,上面內存塊爲子節點,還原二叉樹結構,通過調試器在內存中定位到根節點,依次還原每個子節點,當然也可以拷出來使用。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
最後需要得到zvzjyvosgnzkbjjjypjbjdvmsjjyvsjx,按圖索驥在二叉樹中獲取查找方向,得到如下字符串- -:
10101111101001000001111111001000010101110100111100010010010010000001101010000100100111010111111101110001001000001111100010011100
轉ascii:
afa41fc8574f12481a849d7f7120f89c
整理下格式:
flag{afa41fc8-574f-1248-1a84-9d7f7120f89c}

flag{afa41fc8-574f-1248-1a84-9d7f7120f89c}
解密代碼:
在這裏插入圖片描述
在這裏插入圖片描述

Pwn-Magic

題目邏輯:
在這裏插入圖片描述
1是創建多大空間 並保存你輸入的字符串
2根據索引釋放空間
3 根據索引打印對應的字符串

解題思路:
在忘記魔法的函數裏,釋放空間是根據給定的索引來釋放對應的空間。但是刪除的時只free,而沒有設置爲 NULL,這裏是存在 Use After Free 的情況的。

在這裏插入圖片描述
同時還提供了這個函數:
在這裏插入圖片描述
可以修改的輸入字段爲 magic 函數的地址,從而實現在執行“使用魔法”即調用輸入的字符串的時候執行 magic 函數。
也可以自己構造一個system(/bin/sh),我這裏採用的是後者。

學習魔法創建的內存結構如下

Magic
Name ptr

我們通過寫name的時候,覆蓋magic:

原理:
對於大小爲(16 Bytes~ 64 Bytes)的堆塊來說則是使用fastbin,在fastbin中,是由單項鍊表連接起來的,每個chunk的pre_chunk指向之前回收的chunk,即回收的chunk出於鏈表頭部,此時分配時也會從頭部分配。
這裏的magic分配空間爲0x10,顯然是一個 fastbin chunk(大小爲 16 字節)。
我們通過連續申請空間,形成一個鏈表,釋放鏈表頭的空間後,再次申請內存會從頭部分配。
即我們最後申請magic2的而空間保存到chunk0中,由於沒有將釋放的指針置空,我們再次調用第0個magic,就會將最後magic2填入的name給執行了。

步驟:
學習魔法,申請空間0,0x100,大小要不同於0x10 maigc的大小
學習魔法,申請空間1,0x100
忘記魔法,釋放空間0
忘記魔法,釋放空間1
學習魔法,申請空間2,大小爲 0x10,和magic申請的一樣大,那麼根據堆的分配規則
空間2 其實會分配空間1 對應的內存塊,這時name對應的是magic 0地址。
如果我們這時候向magic 2 的name寫入 需要執行的地址(system啥的),那麼由於沒有置magic 0爲NULL。當我們再次嘗試輸出magic 0 的時候,程序就會調用magic2處的代碼。

代碼:

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章