CTFSHOW Reverse re2


前幾天去了趟青海搞培訓,下課的時候有個老哥問了這道題,之前一直沒時間搞,今天突然想起來了就看了看。

 

有兩個文件,雙擊運行exe。

運行之后輸入程序閃退,直接拖進ida,32位程序無殼。

邏輯比較簡單,可以看到有兩個分別對文件進行讀取和寫入的操作,我們跟進第一個關鍵函數

一個簡單的異或腳本可以算出str1

str = "DH~mqqvqxB^||zll@Jq~jkwpmvez{"
str2 = ''
for i in str:
    str2 += chr(ord(i)^31)
print(str2)
[Warnning]Access_Unauthorized

然后跟進下一個函數

進去分析四個函數之后看出是rc4加密,很明顯剛剛我們算出的字符串就是密鑰,這道題的整體邏輯就是,

有flag和enflag兩個文件,程序會讀取flag文件里面的內容並進行rc4加密,然后寫入到enflag文件里面,從最開始我們已經知道了

密文,也就是enflag文件里面的內容,也知道密鑰,我們對密文進行rc4解密就可以得到flag。

在這里有一個問題,enflag文件里面的密文是ANSI編碼之后的數據,要想辦法把數據轉化為可以進行計算的數據,這里有一個辦法

就是把文件直接拖進ida,利用ida將密文轉化為一個個的十六進制的數據,這樣就可以進行計算了。

附上腳本

key3 = [ 0xC3,0x82,0xA3,0x25,0xF6,0x4C,0x36,0x3B,0x59,0xCC,0xC4,0xE9,0xF1,0xB5,0x32,0x18,0xB1,0x96,0xAe,0xBF,0x08,0x35]

c = key3
t = []
key = '[Warnning]Access_Unauthorized'
ch = ''
j = 0  # 初始化
s = list(range(256))  # 創建有序列表
for i in range(256):
    j = (j + s[i] + ord(key[i % len(key)])) % 256
    s[i], s[j] = s[j], s[i]
i = 0  # 初始化
j = 0  # 初始化
for r in c:
    i = (i + 1) % 256
    j = (j + s[i]) % 256
    s[i], s[j] = s[j], s[i]
    x = (s[i] + (s[j] % 256)) % 256
    ch += chr(r ^ s[x])
print(ch)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM