发布于:2017-8-4 17:58 | 121468次阅读 作者: 管理员 | 原作者: 罗煜璇 | 来自: 原创
感谢学生组PC参赛者罗煜璇分享的解题过程 与其说是逆向,其实更像是数学题。 程序尝试加载名为 zapus_dll.dll 的 Dll 文件,获取名为 zapus_get 的导出函数 向该导出函数输入 0x10 个 Byte 的 Buffer,zapus_get 写入 0x10 个 Byte 之后 0x10 个 Byte 进入函数 q_calxxxx 做运算,运算得到的 0x10 个字节与 “GSLab17\x00\x00\x00\x00\x00” 0xc 个 Byte 加当前进程 PID 0x4 个 Byte 一共 0x10 个 Byte 做比较,相同进入下一步 接下来就是重点了,看了整整一天这段代码,发现了 0x800 = 0x80 x 0x80 的二进制拆分 运算都是二进制位的 &和^,推测为 GF(2)上的数学问题 最后分析,这个问题就成了一个单纯的数学问题 一个在 GF(2)上的 128 阶的矩阵,求解行列式 算法也很简单,原矩阵,即 0x40F0D0 处那 0x800Byte 先高斯消元,求得逆矩阵,之后将要求得的 0x10Byte 按照高位到低位排列,做矩阵乘法, 就能得到要输入的 0x80 位,高低位拼合为 0x10 个 Byte 之后程序读取 zapus_dll.dll,计算了一个 DWRD 值与’aLSG’比较,相同就是 win 此处是计算了文件的 CRC32,判定很简单 00401950 函数 00401950 明显是生成 CRC32Table 于是推测 00401454 是个 CRC32,最简单方法,Patch 前面的过程到这一步比较 输入是读入的文件 0x13000 F8 看 eax 剩下的问题就是碰撞个 CRC32 看雪帖子 http://www.pediy.com/kssd/pediy06/pediy6937.htm 直接用,取文件 size-4 的大小计算 crc32,pc2.exe 程序计算得出最后 4 个 crc32 的碰撞值, 将该值写在文件最后 4 个字节 任务完成 通过 Google 发现了更加方便的 crc32 碰撞 Python 脚本 forcecrc32.py 原理相同 点击下方“阅读原文”下载赛题 |
最新评论
发表评论