第四届“长城杯”信息安全铁人三项赛决赛RE-obfuscating

 

这里主要是加了混淆
这里要用到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}



 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值