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

有兩個文件,雙擊運行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)
