解題過程
打開軟件是加殼的,使用010打開,可以看到是魔改的upx,將關(guān)鍵詞改成UPX ,然后脫殼成功,使用IDA打開,可以看到是沒有符號的,分析起來比較難頂,使用go_parser還原符號后打開main_main,
先運(yùn)行一下查看有沒有什么提示
有個(gè)wrong,字符串搜索定位過去,然后查看交叉引用,
可以看到在main 里面對應(yīng)這兩個(gè)地方,應(yīng)該是要走到下面的success 才是正確的flag,然后從上面進(jìn)行分析,有兩個(gè)main_sub的函數(shù),第一個(gè)
有個(gè)aes,直接猜是AES加密,第二個(gè)函數(shù)
這里很多3字節(jié)編碼的操作,看起來像base64,后面引用了一個(gè)外部的字符串off_53D370,應(yīng)該就是編碼表,這個(gè)不是標(biāo)準(zhǔn)的編碼表是變表
再往后面就是一個(gè)數(shù)組的比較了,這里函數(shù)的參數(shù)識別有問題,按Y修改下,查了下這個(gè)panicIndex函數(shù)好像是處理數(shù)組越界的,沒有實(shí)際的含義。
邏輯清楚很多了,這里可以再修正下數(shù)組的定義,這里是對編碼后的base64字符串進(jìn)行操作
然后就是最后的判斷了,這里比較的是編碼后的字符串和encodearray,沒有其他的操作了文章來源:http://www.zghlxwxcb.cn/news/detail-631375.html
所以還原思路,首先對encodearray 還原成base64,然后變表base64 解碼,最后aes解密,aes密鑰動(dòng)調(diào)獲取的和flag的輸入數(shù)據(jù)放一塊,正好16位文章來源地址http://www.zghlxwxcb.cn/news/detail-631375.html
import struct
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
import base64
def decode_custom_base64(data, custom_table):
# 標(biāo)準(zhǔn)Base64編碼表
standard_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
# 使用自定義表將加密數(shù)據(jù)映射回到標(biāo)準(zhǔn)的Base64編碼
trans = str.maketrans(custom_table, standard_table)
decoded_data = base64.b64decode(data.translate(trans))
return decoded_data
custom_table = "456789}#IJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123ABCDEFGH"
encodearray = [
0xC9F5C5CFC889CEE6,
0xCCAC7FCE91C0D9D2,
0x92EAD496C0B7CFE9,
0x93AEA5CB84DFD7E2,
0xC9F0CEDF97BECAA6,
0xDB65B1C46BAEE1B7,
0xC3ED8CD69392EDCE,
0xA7B5B2AAA594DAA3
]
result = []
key=b'wvgitbygwbk2b46d'
for num in encodearray:
bytes_ = struct.pack('<Q', num)
for b in bytes_:
result.append(b)
# print(result)
base=''
for i in range(len(result)):
base+=chr((result[i]-key[i%16])^0x1A)
print(base)
decoded_data = decode_custom_base64(base, custom_table)
print(decoded_data)
aes = AES.new(b"wvgitbygwbk2b46d",mode=AES.MODE_ECB)
print(aes.decrypt(decoded_data))
到了這里,關(guān)于巔峰極客 2023 g0re的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!