安洵杯 2023 RE 感觉有点点简单 WP

虽然不知道sys是什么东西,但是反正可以放进IDA分析

64位无壳,没有故意藏主函数

安洵杯 2023 RE 感觉有点点简单 WP_第1张图片

大致能看到在30、31行进行了加密

先是一个魔改RC4

安洵杯 2023 RE 感觉有点点简单 WP_第2张图片

循环的轮数改成了64,最后的异或也有些变化

安洵杯 2023 RE 感觉有点点简单 WP_第3张图片

然后是魔改的base64

安洵杯 2023 RE 感觉有点点简单 WP_第4张图片

与传统的base64算法不同,这里取二进制数值的时候有一些变化

安洵杯 2023 RE 感觉有点点简单 WP_第5张图片

都是三字符转四个字符,但是取的位数发生了如上图的变化

=判断应该是base64魔改加密后的结果

根据以上分析构建脚本

先逆向出魔改base64的脚本,然后由于RC4是可逆的,魔改rc4基本上抄一遍IDA再跑一下就可以

enc="6zviISn2McHsa4b108v29tbKMtQQXQHA+2+sTYLlg9v2Q2Pq8SP24Uw"
b64map="4KBbSzwWClkZ2gsr1qA+Qu0FtxOm6/iVcJHPY9GNp7EaRoDf8UvIjnL5MydTX3eh"
index=[b64map.index(i) for i in enc]+[0]
temp=[]
for i in range(0,len(index),4):  #b64将三个字符变成四个,逆向时每次截取4个字符,转化为三个原文
    get=index[i:i+4]   #每次取四个字符变成三个,每个字符对应一个6位二进制数
    temp.append(get[0]|((get[1]&0b11)<<6))
    temp.append((get[1]>>2)|((get[2]&0b1111)<<4))
    temp.append((get[2]>>4)|(get[3]<<2))

hex_list = [hex(num) for num in temp]  
print(hex_list)

#5c 21 7b 33 51 33 38 28 3a 2b 30 40 16 2c 33 25 36 4 38 46 51 3c 25 4a 13 33 39 3b 69 27 4d 29 33 14 33 46 30 31 32 40 6c 00
#RC4再跑一遍

key="the_key_"
S=[]
K=[]
for i in range(64):
    S.append(i)
for j in range(64):
    K.append(ord(key[j % len(key)]))
v6=0
for k in range(64):
    v6=(K[k]+S[k]+v6)%64
    S[k],S[v6]=S[v6],S[k]

v5=0
v6=0
for i in range(len(temp)):
    v5=(v5+1)%64
    v6=(S[v5]+v6)%64
    S[v5],S[v6]=S[v6],S[v5]
    temp[i]^=(v6^v5)&S[(((v6 ^ v5) + S[v6] + S[v5]) % 64)]
print("".join(map(chr,temp)))

运行后得到

D0g3{608292C4-15400BA4-B3299A5C-704C292D}

你可能感兴趣的:(python,windows,c语言,汇编)