发布于: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 还真是个 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,再次打开 出题的叔叔真厉害~~~真累 |
最新评论
发表评论