附件下载下来,并没有壳,直接拖入IDA,进行分析,F5一按,发现函数非常的短,被花指令干扰了,进入汇编查看

上面就是废话语句
下面就是错误语句
上面的nop掉,下面的就Uncode

其实这里就能发现第一条mov语句的操作数并不是和下面一样,推测也是识别错误
除开0E8h进行组合,就能恢复原样:

在把0E8h nop掉就好
反汇编就恢复正常了:
1 | if ( Size == 40 ) |
查看代码逻辑可以知道,输入flag,进行rc4加密后与v5进行比较,那么反过来,v5就是flag加密后的数据。
rc4是对称加密,因此可以自己把v5输入再取出flag
现在来看KeyGen函数,猜测应该是生成的密码
毫不意外这个函数也是花指令干扰了的:

汇编代码的长度比较短
主要的代码废话在这里:

上面两句直接nop掉,下面取消编码,之后除开0e8h 再进行编码:

这个48h其实是蛮奇怪的,但是观察可以看到,上下操作的都是rax,中间出现了一个eax,尝试将其合并:

本质上就是返回这个字符串
后面就是一个rc4_init 和 rc4_encrypt ,里面也是混淆,也可以直接去除

然后就得到了正常的代码:

这个和普通的rc4还是有所区别的,就是在S表的填充上。
加密函数也是有所区别的,就是后面进行了加的操作(花指令去除比较简单就不写了):

这个就很坑爹啊,后面解密的时候要先把flag_encode进行一次自减操作,然后再来进入解密,然后再来一次自减操作
我们先把函数原封不动拖入Vs进行编译尝试,发现实现的结果跟源程序是一样的


那么加密就很简单了:
1 | int64_t key_stream[32] = { NULL }; |
解出flag