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

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

发布于:2017-8-4 17:58   |    115660次阅读 作者: 管理员    |   原作者: 罗煜璇   |   来自: 原创

​感谢学生组PC参赛者罗煜璇分享的解题过程





与其说是逆向,其实更像是数学题




程序尝试加载名为 zapus_dll.dll  Dll 文件,获取名为 zapus_get 的导出函数

向该导出函数输入 0x10  Byte  Bufferzapus_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 的二进制拆分

运算都是二进制位的 &^,推测为 GF2)上的数学问题

最后分析,这个问题就成了一个单纯的数学问题

一个在 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 的大小计算 crc32pc2.exe 程序计算得出最后 4  crc32 的碰撞值,

将该值写在文件最后 4 个字节


任务完成



通过 Google 发现了更加方便的 crc32 碰撞 Python 脚本

forcecrc32.py

原理相同






点击下方“阅读原文”下载赛题


↓↓↓ 
分享到:
踩2 赞0

收藏

上一篇:【答案推荐】复赛第一题学生组android

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

相关阅读
最新评论
B Color Image Link Quote Code Smilies

发表评论

top 问题反馈

返回顶部