本文主要是介绍第四届“长城杯”信息安全铁人三项赛决赛RE-obfuscating,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这里主要是加了混淆
这里要用到IDA的一个插件D810和去混淆脚本deflat.py。值得注意的是deflat.py无法在主逻辑去混淆,这里可以参考这篇文章的脚本利用angr符号执行去除控制流平坦化 - 0x401RevTrain-Tools (bluesadi.github.io)。在使用deflat.py和这文章中的脚本轮流使用后,再使用D810查看
刚刚使用文章中脚本去混淆后
这里还有一些永真永假分支
可以先用D810化简一下
这样逻辑还是感觉有点乱
在27行看
dov13 = 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 = 0v5 = 0for i in range(len(xorkey)):v6+=1v5 = (s_box[v6] + v5)%256s_box[v6], s_box[v5] = s_box[v5], s_box[v6]v4 = (s_box[v5] + s_box[v6])%256if xorkey[i]^s_box[v4] !=enc[i]:return Falsereturn Trueimport string
table=string.digits
table+=string.ascii_lettersfor s1 in table:for s2 in table:for s3 in table:for s4 in table:x=s1+s2+s3+s4key=[ord(i) for i in x]s_box=[0]*256for i in range(256):s_box[i]=ia3=0for i in range(256):a3=(key[i % 4] + a3 + s_box[i])%256s_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]^=0x58flag+=chr(enc[i])
flag+='}'
print(flag)#flag{6EB3EEE652DD230D999E1221351D97D9}
这篇关于第四届“长城杯”信息安全铁人三项赛决赛RE-obfuscating的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!