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

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

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


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

先分析下文件,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


还真是个 imagemono这代码可以的……

直接 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 导出工程 encryptdllDll 不方便调试,于是新建个控制台程序

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 问题反馈

返回顶部