这里主要是加了混淆
这里要用到IDA的一个插件D810和去混淆脚本deflat.py。值得注意的是deflat.py无法在主逻辑去混淆,这里可以参考这篇文章的脚本利用angr符号执行去除控制流平坦化 - 0x401RevTrain-Tools (bluesadi.github.io)。在使用deflat.py和这文章中的脚本轮流使用后,再使用D810查看
刚刚使用文章中脚本去混淆后
这里还有一些永真永假分支
可以先用D810化简一下
这样逻辑还是感觉有点乱
在27行看
do
v13 = i < 5;
while ( dword_603280 >= 10 && dword_603280 < 10 );
if ( !v13 )
break;
dword_603280是全局变量,一般固定为0
dword_603280 >= 10 && dword_603280 < 10
语句必为0,这里是do while句式,到看汇编
这里改jmp
这里就恢复了一部分。
后面恢复同理
这里发现有4位不知道
这里是利用正确的4位为RC4的key,检查最后异或的流秘钥是不是对应的位数
这里采用爆破的思路
xorkey=[0xC7, 0x3C, 0x12, 0x09, 0x07, 0x8E, 0x88, 0xB9, 0x18, 0x94, 0x4B, 0x6D, 0x13, 0x15, 0x81, 0x5C, 0xA5, 0xC7, 0x0D, 0x23, 0xEF, 0x45, 0xEC, 0xC9, 0xB1, 0x05, 0xB6, 0x84, 0x37, 0x63, 0xDE, 0xA5,]
enc=[0x53, 0xB9, 0x93, 0x80, 0x49, 0xD7, 0x6F, 0xAB, 0xAA, 0x9E, 0xED, 0x32, 0x18, 0x43, 0xEA, 0xF5, 0x60, 0xCB, 0xED, 0xD6, 0x3A, 0x68, 0x73, 0x07, 0xDD, 0x56, 0xF5, 0xBC, 0xE4, 0xFA, 0x14, 0xEE,]
def check(s_box):
v6 = 0
v5 = 0
for i in range(len(xorkey)):
v6+=1
v5 = (s_box[v6] + v5)%256
s_box[v6], s_box[v5] = s_box[v5], s_box[v6]
v4 = (s_box[v5] + s_box[v6])%256
if xorkey[i]^s_box[v4] !=enc[i]:
return False
return True
import string
table=string.digits
table+=string.ascii_letters
for s1 in table:
for s2 in table:
for s3 in table:
for s4 in table:
x=s1+s2+s3+s4
key=[ord(i) for i in x]
s_box=[0]*256
for i in range(256):
s_box[i]=i
a3=0
for i in range(256):
a3=(key[i % 4] + a3 + s_box[i])%256
s_box[a3],s_box[i]=s_box[i],s_box[a3]
if check(s_box):
print(key)
#[54, 69, 66, 51]
enc=[0x1D, 0x1D, 0x1D, 0x6E, 0x6D, 0x6A, 0x1C, 0x1C, 0x6A, 0x6B, 0x68, 0x1C, 0x61, 0x61, 0x61, 0x1D, 0x69, 0x6A, 0x6A, 0x69, 0x6B, 0x6D, 0x69, 0x1C, 0x61, 0x6F, 0x1C, 0x61,0x66, 0x6C, 0x61, 0x67
,0x7B, 0x7D
]
enc1=[0x53, 0xB9, 0x93, 0x80, 0x49, 0xD7, 0x6F, 0xAB, 0xAA, 0x9E, 0xED, 0x32, 0x18, 0x43, 0xEA, 0xF5, 0x60, 0xCB, 0xED, 0xD6, 0x3A, 0x68, 0x73, 0x07, 0xDD, 0x56, 0xF5, 0xBC, 0xE4, 0xFA, 0x14, 0xEE,]
xorkey=[0xC7, 0x3C, 0x12, 0x09, 0x07, 0x8E, 0x88, 0xB9, 0x18, 0x94, 0x4B, 0x6D, 0x13, 0x15, 0x81, 0x5C, 0xA5, 0xC7, 0x0D, 0x23, 0xEF, 0x45, 0xEC, 0xC9, 0xB1, 0x05, 0xB6, 0x84, 0x37, 0x63, 0xDE, 0xA5,]
for i in range(len(xorkey)):
enc1[i]^=xorkey[i]
flag='flag{6EB3'
for i in range(28):
enc[i]^=0x58
flag+=chr(enc[i])
flag+='}'
print(flag)#flag{6EB3EEE652DD230D999E1221351D97D9}