首页
社区
课程
招聘
[原创]TX2017游戏安全知识竞赛第二轮第一题
发表于: 2017-7-28 10:28 4391

[原创]TX2017游戏安全知识竞赛第二轮第一题

loudy 活跃值
10
2017-7-28 10:28
4391

TX2017游戏安全知识竞赛第二轮第一题

 

一、整体轮廓

IDA载入,发现关键位置函数sub_401694(),如下,其中的注释已经很清楚。重点就是sub_4011D4sub_4014B8sub_401634三个函数。


其中sub_4011D4处理通过调用zapus_get得到的16字节数据。

结果与如下16字节数据依次比较。

sub_4014B8sub_401634都是对zapus_dll.dll文件求hash,结果都与0x614C5347比较。

二、重点函数sub_4011D4的逆向

IDA进入该函数,


转化为C代码如下,其中fcode是固定值,具体见代码,inbuf是测试数据,v5是处理结果。

分析易知,在已知处理结果的情况下求输入,实际上就是解异或方程组,代码如下。

然而,由于zapus_get返回值没有限制长度,且返回值紧贴预设的比较字符串,导致可以直接覆盖预设字符串达到目的,进而跳过此步验证。

由于编写的zapus_get和题目预设的返回方式不一样,预设为“retn 4”返回(可能为delphi或者Borland C++),而VC++默认为“retn”返回,导致堆栈不平衡,出现错误。


手动修改程序的返回方式为“retn 4”如下,即可完美实现该函数。

二、重点函数sub_4014B8的逆向

该函数实际就是crc32,核心如下,下图生成CRC32使用的表。

下图处理输入

因为表固定,不做重点分析,输入处理过程可化简为:


[峰会]看雪.第八届安全开发者峰会10月23日上海龙之梦大酒店举办!

上传的附件:
收藏
免费 1
支持
分享
打赏 + 2.00雪花
打赏次数 1 雪花 + 2.00
 
赞赏  orz1ruo   +2.00 2017/07/28
最新回复 (2)
雪    币: 2946
活跃值: (6659)
能力值: ( LV13,RANK:409 )
在线值:
发帖
回帖
粉丝
2
zapus_get用__stdcall就行了
2017-7-28 13:20
0
雪    币: 2556
活跃值: (945)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
3
感谢提醒,这些不熟
2017-7-28 13:54
0
游客
登录 | 注册 方可回帖
返回
//