安恆月賽writeup 2019年2月

新年勸退賽,菜的真實,web一題不會,暴風流淚

MISC

玩遊戲

下載附件後,得到一個exe和題目說明,運行exe後,發現題目分爲三個關卡

第一關

看見是解盲文,有在線解盲文的網站,解密後爲下面圖中所示

看見這一串,數了位數後懷疑是一個字符串的md5值,百度之後發現是 hello 的MD5值,第一關通過

第二關

要提交兩個MD5值相同的文件,使用工具fastcoll (下載鏈接: http://www.win.tue.nl/hashclash/fastcoll_v1.0.0.5.exe.zip)生成兩個md5值相同的exe,第二關通過

第三關

通過前面兩關後,會收到郵件內容,通過題目描述中的提示,百度柵格密碼https://book.2cto.com/201407/45251.html(詳細解釋)

然後知道了可以通過http://www.spammimic.com/decode.cgi解密柵格密碼,將郵件內容解密後得到flag

crypt

密碼本

題目描述:這個密碼本本該只使用一次的,但是卻使用了多次,導致密文易被破解

經過一番嘗試發現,祕鑰的首字母很可能是y,剩下的就靠你了

題目中給出了三組加密後的數據

cip1: rlojsfklecby

cip2: ulakqfgfsjlu

cip3: dpaxwxtjgtay

根據題目描述,這個本該使用一次一密加密,但是有密鑰重複使用了,所以猜測這三組密文的密鑰可能是同一個

題目描述給出了密鑰的第一位爲 y

使用y對三組密文進行維吉尼亞解密,發現第三組的明文開頭第一個字母爲 f

構造能夠接觸flag的密鑰,發現前四位是year,經過一波靈性猜測,發現密鑰爲yearofthepig,就是豬年的意思(不知道正常思路是什麼樣的)

然後使用這個密鑰,解密了三組密文,第一組看不出來是什麼,可能不是同一個密鑰,但是第二組解密出了明文

解密第三組密文得到flag

一開始以爲密鑰是flag所以一直提交不對,後面發現,第三組的明文是flag   flagisaccess的MD5值

 

hahaha

下載附件以後解壓,發現壓縮包加密了

看到壓縮包裏面有四個txt 和一個flag.pdf,發現txt的大小都是6,猜測是CRC爆破,CRC32位爆破是在壓縮包進行了加密後,壓縮密碼比較長爆破需要很長時間,相當於爆不出來,但是加密的內容大小很小,我們就可以直接爆破壓縮加密的內容

這個題的思路就是,四個TXT裏面的內容合併就是壓縮包的解壓密碼,解壓後即可查看flag.pdf

使用CRC32爆破腳本(見附件)

使用命令 python crc32.py reverse CRC32值

這樣爆破四個TXT的CRC之後,經過了一頓絕望靈性的排列組合,最終

得到壓縮包密碼爲  tanny_is_very_beautifu1_

解壓打開pdf

可以看出要考sha1碰撞,而且圖中提示給出了明文的範圍【'1','2','e','s','c','h','n','E','S','C','H','N','!','@'】

寫個腳本跑一下

#coding:utf-8
import hashlib
import string

b = ['1','2','e','s','c','h','n','E','S','C','H','N','!','@']

for c in b:
    for d in b:
        for e in b:
            for f in b:
                for g in b:
                    for h in b:
                        for a in b:
                            k = 'flag{' + str(c) + str(d) + str(e) + str(f) + str(g) + str(h) + str(a) + '}'
                            #print k
                            l = hashlib.sha1(str(k)).hexdigest()
                            if 'e6079c5ce56e781a50f4bf853cdb5302e0d8f054' == l:
                                print k + '  ' + l + '  ' + hashlib.md5(str(c) + str(d) + str(e) + str(f) + str(g) + str(h) + str(a)).hexdigest()
                                exit()
print 'none'

跑出flag

隊友做的pwn

filesystem

清單型程序,函數有點多,這裏只挑有用的說。

Create

Edit

Read

 

Checksec

都如字面意思,最後一個一會兒說。

首先看到這個程序,看到system函數,想着是不是能用doublefree或者uaf等控制堆塊來控制system執行,但是並沒有看到free函數,所以一直在糾結。

但是看到最後有一個隱藏選項B4ckd0or,

好像發現了新大陸,但是本地調試,發現:

前兩位會當成system參數,但是後面會略掉。所以想輸入sh。

但是上面的if又限制了字符串不能爲sh,所以卡在這裏。

一直沒搞懂checksec的作用,又回去看了一下:

System函數執行的就是snprint函數的參數,關於這個函數具體的請百度。

這樣只要我們令s中也包括/bin/sh即可,但是要閉合前面的參數。

就是:“;/bin/sh #\

具體如下:

總結一下,創建一個文件,文件路徑輸入“;/bin/sh #\

然後調用checksec來調用system得到shell。

因爲在這裏我們需要控制的剛好可控,自然用不到一些什麼doublefree和uaf。

 

hackmoon

是一個清單型程序,看一下功能。

首先是add:

可以看到,最多創建五個moon,每個大小爲8。

並且有兩個字段(moonlist[i]和moonlist[i+1]),且將第一個字段賦值爲print_moon函數。

而且,第二個字段是存放content的地方,且size自定義。

再看del

Free後並沒有置空指針,所以考慮用UAF(Use After Free)

Print就是對應打印。

Magic函數。

思路如下:

申請moon0,申請moon1,然後free掉前兩個,再申請moon2,令moon2的content部分爲moon0,這樣moon0就可控了。

那麼這樣也要求我們,moon0和moon1的content大小不能和moon0和moon1放在一個bin中,因爲我們要控制的是moon的第一個字段,若放在一個bin中我們再申請moon2時會將content申請作爲內存空間,很明顯那不是我們希望的。

這也是我們爲什麼要先申請兩個moon,free掉後在bin中是(moon0->moon1)這樣的,所以我們申請moon2首先會將moon1的內存空間分配掉,再給moon2的content分配與moon0大小匹配的內存空間,這樣實現了moon0可寫

 

詳細來說,先分配0和1的content大小爲32,這樣free掉後就不會與0和1(大小爲8)

分配到一個bin中(即避免了分配到content)。再申請一個2(實則分配到note1),令content大小爲8,預期就會分配到note0。

這樣就可以將moon0第一個字段的print_moon覆蓋爲magic函數。

exp如下:

 

 

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