-
-
[原创]TX2017游戏安全知识竞赛第二轮第一题
-
发表于:
2017-7-28 10:28
4415
-
TX2017游戏安全知识竞赛第二轮第一题
一、整体轮廓
IDA载入,发现关键位置函数sub_401694(),如下,其中的注释已经很清楚。重点就是sub_4011D4、sub_4014B8和sub_401634三个函数。
其中sub_4011D4处理通过调用zapus_get得到的16字节数据。
结果与如下16字节数据依次比较。
sub_4014B8和sub_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使用的表。
下图处理输入
因为表固定,不做重点分析,输入处理过程可化简为:
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)