网鼎杯2020 朱雀部分writeup
Reverse –go
替換了base64字典
解題思路:
程序?qū)⑽覀冚斎氲膋ey,經(jīng)過換了編碼字典的base64加密后,去掉最后==,計算key加密后的長度,長度為0x16,就開始解密。那么我們只需要輸入正確的key就有flag了,知道了base64加密字典XYZFGHI2+/Jhi345jklmEnopuvwqrABCDKL6789abMNWcdefgstOPQRSTUVxyz01,和密文nRKKAHzMrQzaqQzKpPHClX==,解密如下:
Reverse –tree
解題思路:
先找到根節(jié)點,上面內(nèi)存塊為子節(jié)點,還原二叉樹結(jié)構(gòu),通過調(diào)試器在內(nèi)存中定位到根節(jié)點,依次還原每個子節(jié)點,當(dāng)然也可以拷出來使用。
最后需要得到zvzjyvosgnzkbjjjypjbjdvmsjjyvsjx,按圖索驥在二叉樹中獲取查找方向,得到如下字符串- -:
10101111101001000001111111001000010101110100111100010010010010000001101010000100100111010111111101110001001000001111100010011100
轉(zhuǎn)ascii:
afa41fc8574f12481a849d7f7120f89c
整理下格式:
flag{afa41fc8-574f-1248-1a84-9d7f7120f89c}
解密代碼:
Pwn-Magic
題目邏輯:
1是創(chuàng)建多大空間 并保存你輸入的字符串
2根據(jù)索引釋放空間
3 根據(jù)索引打印對應(yīng)的字符串
解題思路:
在忘記魔法的函數(shù)里,釋放空間是根據(jù)給定的索引來釋放對應(yīng)的空間。但是刪除的時只free,而沒有設(shè)置為 NULL,這里是存在 Use After Free 的情況的。
同時還提供了這個函數(shù):
可以修改的輸入字段為 magic 函數(shù)的地址,從而實現(xiàn)在執(zhí)行“使用魔法”即調(diào)用輸入的字符串的時候執(zhí)行 magic 函數(shù)。
也可以自己構(gòu)造一個system(/bin/sh),我這里采用的是后者。
學(xué)習(xí)魔法創(chuàng)建的內(nèi)存結(jié)構(gòu)如下
| Name ptr |
我們通過寫name的時候,覆蓋magic:
原理:
對于大小為(16 Bytes~ 64 Bytes)的堆塊來說則是使用fastbin,在fastbin中,是由單項鏈表連接起來的,每個chunk的pre_chunk指向之前回收的chunk,即回收的chunk出于鏈表頭部,此時分配時也會從頭部分配。
這里的magic分配空間為0x10,顯然是一個 fastbin chunk(大小為 16 字節(jié))。
我們通過連續(xù)申請空間,形成一個鏈表,釋放鏈表頭的空間后,再次申請內(nèi)存會從頭部分配。
即我們最后申請magic2的而空間保存到chunk0中,由于沒有將釋放的指針置空,我們再次調(diào)用第0個magic,就會將最后magic2填入的name給執(zhí)行了。
步驟:
學(xué)習(xí)魔法,申請空間0,0x100,大小要不同于0x10 maigc的大小
學(xué)習(xí)魔法,申請空間1,0x100
忘記魔法,釋放空間0
忘記魔法,釋放空間1
學(xué)習(xí)魔法,申請空間2,大小為 0x10,和magic申請的一樣大,那么根據(jù)堆的分配規(guī)則
空間2 其實會分配空間1 對應(yīng)的內(nèi)存塊,這時name對應(yīng)的是magic 0地址。
如果我們這時候向magic 2 的name寫入 需要執(zhí)行的地址(system啥的),那么由于沒有置magic 0為NULL。當(dāng)我們再次嘗試輸出magic 0 的時候,程序就會調(diào)用magic2處的代碼。
代碼:
總結(jié)
以上是生活随笔為你收集整理的网鼎杯2020 朱雀部分writeup的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Aarch64汇编语言
- 下一篇: Windbg+sos调试.net笔记