首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【CTF训练】ISC2016——Classical CrackMe2

这次依然是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解密

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180329G1VNGT00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券