游戏安全实验室 › 首页 ›活动 › 查看内容

【答案推荐】复赛第二题学生组PC

发布于:2017-8-10 15:02   |    162404次阅读 作者: 管理员    |   原作者: 罗煜璇   |   来自: 原创


根据描述,应该是找一个解密算法。

先分析下文件,3个文件,一个 EXE,一个 Dll是 C# .net的库,还有一个就是个待解密的

文件。

所以一个正常的思路,估计是写了个 C程序调用 C#

对 main.exe进行分析,分析下字符串



据此可以判断是 mono框架做的了,所以其调用 C#的外部库也不足为奇。

https://github.com/mono/mono

去 Github上下一份源码,然后就是对着源码标 idb的函数,过程比较艰辛,这完全是体力

活。

Tips:标函数过程不多说了,部分程序里有特定字符串可以搜索,g_assert 函数更是可以

直接对应上文件了

好的,标记完库函数之后,程序结构就十分清晰了

此时的 main函数一目了然

重点关照了下函数 mono_image_open_from_data_internal

字面意思就是从内部数据载入了一个镜像

数据是异或加密的 0x1600个数据

值得注意的是异或有两轮……第一次漏了没看见……导致疑惑了半天

第二轮异或在函数 mono_image_open_from_data_internal中

这个明显是出题者自己加的……源码里没有……

好了,将数据取出来,经过两轮异或,得到的数据明显是个 PE


还真是个 image,mono这代码可以的……

直接 16进制看了下,明显是个 C# .net的程序

直接想用神器 Telerik JustDecompile打开,但是却失败了

应该是 PE格式有损坏,尝试修复 PE格式

修复格式当时想了很多的思路,先是找了个正常的 C# .net程序研究下结构对着修复

这时修复了三处,还有最后有个 overlay去掉了

首先是 PE 00 PE头

其次应该是一个类的名称


#String,应该修改为 Strings


由 01改成 00

下面是正常的对比文件

修完了之后还是加不起来,于是肯定还是有错误,在这里想了很多方法

一个比较正统的方式应该是去看那个

mono_image_open_from_data_internal函数

看是怎么修正镜像加载起来的,估计也是出题者的本意

但是跟了下这个函数,还是很麻烦的,最近心情不好,看不动,于是换思路了

找了开源的 dnspy,打算用这个尝试去加载这个镜像,看哪里报错就修正哪里

或者说找个正确的镜像进一步的对比数据结构进行修复

这里通过 patch让程序强制加载起来


错误的镜像

正常的镜像

明显是这两个 rows溢出了。。。于是尝试把高位去掉。。。

这里是


1改成0

这里的 E3改成 00

算上之前的一共修正 5处

修复完成 encrypt.dll,成功的打开了这个镜像,dnspy好强大

好了,用反编译软件打开,我们成功的看到了两个方法

回头看下 C代码的调用

明显的是调用了 Hello方法里面的 SayHello()函数

可以把精力转移到 MyClass这个类上了

因为里面是我想要的加密解密相关

很明显的是,里面只有加密函数,想要获取解密方法就要分析这个加密函数,求逆函数

使用 JustDecompile 导出工程 encryptdll,Dll 不方便调试,于是新建个控制台程序

EnDecrypt,把对应的函数粘过去

分析调试一下,首先尝试执行 EncryptDataFile加密个文件,跟踪下看看

于是在跟进 Code函数里

这里变量是我重名过的,这个值一看 0x9e3779b9,拿去一搜,果然是 TEA

http://blog.csdn.net/gsls200808/article/details/48243019

再仔细分析下,确认就是 XTEA

于是

解密函数也很简单,就是加密的换下位置运算符就是,轮数就是 32

简单的写个验证调试下没问题

再看下 Encrypt函数

uint[] numArray = new uint[] { 363609949, 512121596, 1703126449, 1423373290 };

这个明显就是 Key了

后面的就是加密流程

这个流程明显是个分组密码的 CBC加密模式,用上一轮的密文异或

最后写文件会多 8个字节,是因为前 8个字节是 IV

还是不习惯写 C#,做个 C++工程 XTEA写个解密代码

解出来的数据(那个 89是我后来补得)

看到了 PNG开头,心中大喜,补了个 0x89,以为正解了,打开一看就伤心了


好吧,我不懂,你们懂,行了吧~~真是生气~~还有完没完

接下的跟逆向没有一毛钱的关系,围绕这个图片进行了各种尝试,貌似此时完全变成了一个

CTF的解密题

这里使用 010Editor帮助解析文件格式

接下来就是惨无人道的各种尝试

首先是 gslb那个地方,修成了 crc32,无果……把 IDAT里的 zilb抠出来 Python解了……

反正就是各种无果

折腾好久~~

最后回过头来发现,sRBG 有两块,第二块好像很多余的样子,并且最后那些数据很像个像

素排列,因为我把 IDAT里的 zlib解了,觉得数据比较像……于是用 zlib加了做了个 IDAT

还是不对

最后觉得是不是方法不对,翻了翻其他图片格式,最后看到 BMP……

把数据区的前两个 GG改成 BM,再次打开


出题的叔叔真厉害~~~真累


分享到:
踩1 赞0

收藏

上一篇:【答案推荐】复赛第一题社会组PC

下一篇:【答案推荐】复赛第二题学生组Android

最新评论
B Color Image Link Quote Code Smilies

发表评论

top 问题反馈

返回顶部