这次依然是Windows的C#逆向,相比上一篇(【CTF训练】ISC2016 —— Classical CrackMe)来说难度增加了不少,本文记录了这类软件的分析思路,包括脱壳反混淆、静态分析逻辑、动态调试获取关键字符串、编写解密程序和在线工具解密。
01
脱壳反混淆
查壳
使用PEID查壳显示C#语言编写,并没有检测出有什么保护,使用.NET Reflector打开试试
随便打开一个类发现成员变量和成员函数名称是这德行的,反编译器完全解析不出来标识符而且参数也是一团糟。很明显是软件是被加壳混淆过的,这样的情况下我们很难静态分析软件逻辑,怎么办呢?
de4dot
这里使用.NET脱壳神器
这个带可视化界面的集成了很多版本的de4dot,拖入文件进来,点击Apply
成功脱壳后原目录会出现xxx-clean.exe的文件,使用Reflector再次打开
可以发现标识符已经被重命名了,参数列表也恢复正常了(我们当然不能指望它能把标识符还原成见名知意的程度)。总算可以正常分析了
02
静态分析
Reflector静态分析
这一节简单的记录下如何使用.NET Reflector快速定位到关键函数。首先我们尝试搜索字符串“密码错误”,但是并没有上一次那么幸运,搜索不到,推测程序对字符串进行加密
那么只能从入口函数开始慢慢分析了
由入口函数Main()得到WinForm窗口由GForm0类实现,那么这个类下必然有个按钮单击事件函数
那这个函数里面必然有关键的验证逻辑了?
果不其然验证逻辑都在这里,大致就是在输入框内容不为空的情况下,取输入内容进行一下加密(调用smethod_0()函数),最后与某个固定字符串比较。这里刚好也印证了之前字符串加密的猜想(smethod_4 5 8函数的作用都是接收一个整数进行处理后返回对应的字符串)
看到这里只需要研究下smethod_0()的加密算法和smethod_5()解密字符串代码就可以了
这个函数的功能就是对参数进行AES加密,但最关键的key竟然也被加密了
到目前为止发现4 5 7 8函数分别为不同的字符串解密函数
smethod_0
smethod_5
进行的一系列的位运算,其中byte_0数组尤为重要
实际上byte_0是经过好几个函数运算生成的
这么一折腾我们发现,smethod_0对输入内容进行AES加密,但key需要smethod_7进行解密
smethod_4 5 7 8都是进行字符串解密的,我们至少要研究5和7(分别解密出对比结果的字符串和key)
但是还需要实现好几个函数才能解密byte_0,再分别实现5和7未免太麻烦了,反正是固定值,能不能直接得到呢?
03
动态调试
想偷懒自然想到动态调试,有了以上静态分析的工作,定位到关键函数也是分分钟的事情,这里就不介绍详细OD的调试步骤了(使用暂停法,或者MessageBox断点及堆栈回溯均可)
直接给出从内存中拿到的结果:
result="x/nzolo0TTIyrEISd4AP1spCzlhSWJXeNbY81SjPgmk="
key="pctf2016pctf2016pctf2016pctf2016"
04
解密程序
已经得到了所需的全部信息,使用key对result字符串进行AES解密即可,其中模式ECB、填充PKCS7
使用C#实现
最后懒人必备 在线AES解密
领取专属 10元无门槛券
私享最新 技术干货