今天做了一道之前師傅給的題目定血,因為之前缺dll沒法動態(tài)調(diào)試墅茉,所以一直卡著沒做(還是我太菜了愈魏,靜態(tài)分析實在看不懂)筹淫,在網(wǎng)上搜到解決方法,裝了VS 2015的依賴庫和動態(tài)鏈接庫就可以運行這個程序了划栓,如果電腦上安裝了VS 2015也是可以直接運行的。那么進入正題蒋歌,首先運行下這個程序:
輸入后回車素标,可以看到輸入錯誤的flag后,程序會自動退出计维,直接扔到IDA里,進行靜態(tài)分析欠母,通過字符串找到關(guān)鍵位置:
找到關(guān)鍵位置后啄清,可以看到程序會將輸入字符進行判斷。長度滿足長度為5將繼續(xù)睛榄,所以我們的輸入就是5個字符,這里可以通過爆破程序的方式來解題憎乙,可以看下我之前寫的筆記:
記一次CTF比賽中,使用python對exe程序中交互爆破flag
https://www.dongzt.cn/?p=268
繼續(xù)分析阵谚,發(fā)現(xiàn)在過了長度判斷后,會將輸入的字符串進行加密操作嗡午,在加密函數(shù)里根據(jù)特征很快發(fā)現(xiàn)其實是一個sha1的哈希算法,也可以用IDA的插件Findcrypt來快速找到各種加密算法的位置:
之后僻他,就是一個異或的操作,這里很明顯可以得到v11和v16腊尚,讓之前加密后的字符串滿足v11和v16按位異或就可以吨拗,代碼如下所示:
a=[0x25,0x5B,0x00,0x00,0x94,0x93,0x70,0x00,0x33,0x33,0x02,0x00,0x12,0xD3,0x0A,0x00,0x76,0x5E,0xDF,0x01]
b=[0x59,0xCB,0x29,0x89,0x3B,0xD5,0xE4,0xC6,0x10,0xAB,0x68,0xC5,0x19,0x66,0x50,0xCC,0xA5,0xFD,0xD2,0x0B]
c=[]
for i in range(len(a)):
c.append(hex(a[i]^b[i])[2:])
print c
flag=''
for i in range(len(c)):
flag+=c[len(c)-i-1].rjust(2,'0')
print flag
輸入的字符經(jīng)過sha1后的字符如果為0a0da3d3cc5ab50bc56a9823c69446af8929907c,就可以通過校驗婿斥。
當(dāng)然這些只是猜想劝篷,在動調(diào)后才能確認(rèn)受扳,在簡單的靜態(tài)分析后勘高,進入動調(diào)坟桅,來驗證下之前的猜想,輸入99999后蕊蝗,經(jīng)過加密函數(shù),查看內(nèi)存:
可以看到紧显,這兩個結(jié)果是一致的篙程,所以現(xiàn)在只需要把sha1解出來就可以郭厌,先試試能不能直接在線解:
有點真實,那我自己爆破總可以吧寂屏,直接去google硬盤上薅羊毛秘豹,利用GPU跑hash:
于是輸入字符凄贩,得到flag: