2018 腾讯TP游戏安全技术竞赛-资格赛

1. 调试分析

x32dbg载入,运行命令 bp GetDlgItem下断点,输入任意用户名和密码后点击Go

程序顺利断下,可以看到程序使用SendMessage方式获取UserName和RegCode,并且判断是标准版or进阶版
1.png
之后,程序在call 0x00B25510之内进行详细的验证,将结果显示在Label上
1.png

进入func_verify函数,可以看到首先程序对UserName格式进行检查
1.png
然后检查UserName长度是否等于39
4.png
将输入的UserName转换大写
5.png
将输入的UserName末尾添加#字符并用#分割, 判断分割之后数目
6.png

将UserName分割后的得到的vector进行运算, 得到t1-t5
7.png
算法具体如下
8.png

用户名部分处理完毕, 进入RegCode处理部分
首先将RegCode进行一个类base64的解码
9.png
具体算法如下
10.png

判断解码后的RegCode的24-27位是否为’2018’, 28-31是否为0, 因此可以知道解码后至少为32位,
11.png
解码操作类似Base64, 四字节合并为三字节, 因此 RegCode 长度根据Base64算法
33/3 * 4 = 44位 
最后的验证函数, 将UserName运算得到的t1-t5与解码后的RegCode进行运算
12.png

这实际是一个三元方程组, 需要根据t1-t5解出RegCode, 验证以及解密算法如下:
13.png

2. 算法流程

通过对验证流程的分析, 注册码验证流程如下
输入的UserName -> t1 t2 t3 t4 t5
输入的RegCode -> Base64(伪)解码得到32位 ->
a) 验证25-32 位是否为 “2018 x0x0x0x0”
b) 剩余24位看做三个int64整数, 与t1-t5运算

3. 程序实现

a) 输入合法用户名(39位) , 4位一组, “#”号分割, 计算出t1-t5,
b) 解方程算出xyz (3*int64, 共24位),
14.png
c) 实现此程序中Base64的Encode部分, 将xyz+2018+0编码, 得到RegCode
15.png

标签: none

添加新评论