2016腾讯安全挑战赛第一轮-PC游戏方向
0x00 查壳
无壳的VC程序
0x01 测试
没有消息弹窗,尝试对函数下断点。
OD载入后,Ctrl+N查找函数,找到GetDlgItem
程序运行起来,等输入完后点击确定后程序断下。一路F8就来到这里
00401EED . E8 6A5B0000 call Tencent2.00407A5C
00401EF2 . 8B40 20 mov eax,dword ptr ds:[eax+0x20] ; |
00401EF5 . 8B3D 24334200 mov edi,dword ptr ds:[<&USER32.SendMessa>; |USER32.SendMessageA
00401EFB . 50 push eax ; |hWnd
00401EFC . FFD7 call edi ; \SendMessageA
00401EFE . 8D8C24 A0010000 lea ecx,dword ptr ss:[esp+0x1A0]
00401F05 . 51 push ecx
00401F06 . 6A 40 push 0x40
00401F08 . 6A 0D push 0xD
00401F0A . 68 E9030000 push 0x3E9
00401F0F . 8BCE mov ecx,esi
00401F11 . E8 465B0000 call Tencent2.00407A5C
00401F16 . 8B50 20 mov edx,dword ptr ds:[eax+0x20]
00401F19 . 52 push edx
00401F1A . FFD7 call edi
00401F1C . 8D8424 9C000000 lea eax,dword ptr ss:[esp+0x9C]
00401F23 . C64424 74 D7 mov byte ptr ss:[esp+0x74],0xD7
00401F28 . C64424 75 A2 mov byte ptr ss:[esp+0x75],0xA2
00401F2D . C64424 76 B2 mov byte ptr ss:[esp+0x76],0xB2
00401F32 . C64424 77 E1 mov byte ptr ss:[esp+0x77],0xE1
00401F37 . 885C24 78 mov byte ptr ss:[esp+0x78],bl
00401F3B . 885C24 79 mov byte ptr ss:[esp+0x79],bl
00401F3F . 885C24 7A mov byte ptr ss:[esp+0x7A],bl
00401F43 . 885C24 7B mov byte ptr ss:[esp+0x7B],bl
00401F47 . 885C24 7C mov byte ptr ss:[esp+0x7C],bl
00401F4B . C64424 7D CA mov byte ptr ss:[esp+0x7D],0xCA
00401F50 . C64424 7E A7 mov byte ptr ss:[esp+0x7E],0xA7
00401F55 . C64424 7F B0 mov byte ptr ss:[esp+0x7F],0xB0
00401F5A . C68424 80000000 DC mov byte ptr ss:[esp+0x80],0xDC
00401F62 . C68424 81000000 B3 mov byte ptr ss:[esp+0x81],0xB3
00401F6A . C68424 82000000 C9 mov byte ptr ss:[esp+0x82],0xC9
00401F72 . C68424 83000000 B9 mov byte ptr ss:[esp+0x83],0xB9 ; 这里是填好显示的内容,注册失败,注册成功
00401F7A . C68424 84000000 A6 mov byte ptr ss:[esp+0x84],0xA6
这里是将显示内容存起来,等下计算完后使用。
函数在401E60位置,IDA打开程序后查看代码
if ( (unsigned int)(v4 - 6) > 0xE ) // 用户名长度要求goto LABEL_24; // 注册失败···do{ // 将用户名进行运算v6 = v5 % v4;v7 = &v44[v5++];*v7 += v4 * ((_DWORD)v7 + 20160126 - (_DWORD)v44) * lParam[v6];} ···sub_401960((int)&v17, v9, (int)&v32); //计算输入的serial···if ( v19 - (_DWORD)v18 != 20 ) //这里是由上面的401960算出来的,不满足就注册失败{v52 = -1;sub_4022C0(&v17);
LABEL_24:v14 = 0;goto LABEL_25;}···do{v12 = *(_DWORD *)&v44[v11] / 10; // 这里是将上面的用户名运算结果看作是有符号数,然后除以10v13 = v19 - (_DWORD)v10;*(int *)((char *)&v21 + v11) = v12;if ( v11 >= v13 ){_invalid_parameter_noinfo(v12);v10 = (char *)v18;}*(int *)((char *)&v26 + v11) = *(_DWORD *)&v10[v11]; //这里是serial算出来的值v11 += 4;}while ( v11 < 20 );if ( v30 + v21 != v28 || v28 + v22 != 2 * v30 || v29 + v23 != v26 || v26 + v24 != 2 * v29 || v25 + v27 != 3 * v23 )// 这里比较是否满足条件,满足条件就成功
这样大致可以看出程序的流程了。
具体流程得出后,可以逐一分析了。
0x02分析
1 对用户名进行运算
do{ // 将用户名进行运算v6 = v5 % v4; //v4是用户名长度v7 = &v44[v5++];*v7 += v4 * ((_DWORD)v7 + 20160126 - (_DWORD)v44) * lParam[v6];}while ( v5 < 16 );
这个v7的地址-v44的地址等于v5,故可以转化为
*v7 += v4*(20160126+v5)*lParam[v6];
2 调用sub_401960
··· //省略v8 = v14 + 1;v32 = v15 + 1;v31 = v8;if ( v15 == 3 ) //意味着每4个字符就在进入这个判断里进行运算{v16 = 0;do{v26 = *((_BYTE *)&v30 + v16);*((_BYTE *)&v30 + v16++) = sub_402420(&v26);// 计算字符在42E040表中的位置}while ( v16 < 4 );v27 = 4 * v30 + ((BYTE1(v30) >> 4) & 3);v17 = BYTE2(v30) << 6;v28 = 16 * BYTE1(v30) ^ HIBYTE(v17) & 0xF;v29 = BYTE3(v30) + v17;v18 = 0;
···//省略
//如果说输入的serial长度不为4的倍数,那就到这里来继续进行运算do{v26 = *((_BYTE *)&v30 + v21);*((_BYTE *)&v30 + v21++) = sub_402420(&v26);}while ( v21 < 4 );v27 = 4 * v30 + ((BYTE1(v30) >> 4) & 3);v29 = BYTE3(v30) + (BYTE2(v30) << 6);result = v32 - 1;v22 = 0;v28 = 16 * BYTE1(v30) ^ (BYTE2(v30) >> 2) & 0xF;
这个也很好理解
看到v27,v28,v29就可以看出这里的运算时将输入的serial每4个字符转成3个值。
3 比较serial长度
刚刚说到是将serial的每4个字符转为3个值,所以说当转化的值的个数为20个时才允许继续往下,测试几次就知道是只有当输入的serial长度为27时,转化得到的个数才为20
4 满足条件比较
注意到输入的用户名需要进行两次运算,第一是计算出值。第二次是将这些值除以10
这里假设对用户名进行两次运算后储存在U中,而对serial计算的结果储存在K中,当满足下面条件时才能注册成功
- U1U_1U1 + K5K_5K5 == K3K_3K3
- U2U_2U2 + K3K_3K3 == 2K52K_52K5
- K4K_4K4 + U3U_3U3 == K1K_1K1
- U4U_4U4 + K1K_1K1 == 2K42K_42K4
- U5U_5U5 + K2K_2K2 == 3U43U_43U4
变换一下位置,就能通过U来计算出K了,然后可以枚举一下所有可能,也就是0-63,就能找出满足K的字符串
2016腾讯安全挑战赛第一轮-PC游戏方向相关推荐
- [译] Facebook杯2013年编程挑战赛——第一轮题目及答案
原文 https://www.facebook.com/notes/facebook-hacker-cup/2013-round-1-solutions/606859202663318 第一题 纸牌游 ...
- 这次漂亮!2016斯巴鲁跨界挑战赛大造赛事IP
随着国家政府的号召,5万亿元的梦想开始照进了现实,体育产业俨然成为创新的秀场,其中的体育赛事更是众多公司争相布局的热点,他们一方面在加速布局国际体育赛事IP,另一方面也在着力打造国产精品体育赛事IP. ...
- Java 9进入第一轮问题修复阶段
Java 9功能特性正式完成,这意味着第一个问题修复阶段已经开始.HTTP/2客户端没有在截止日期前完成,现已降级为孵化器功能.由于现在的目标是在7月准备好可发布的Java 9,所以目前不太可能添加任 ...
- 【408】计算机组成原理第一轮强化笔记
计算机组成原理第一轮强化笔记 根据天勤高分笔记所做 1 计算机系统概述 计算机的发展历程 冯·诺依曼体系结构 第一代计算机(1946-1957年) 电子管时代,机器语言 第二代计算机(1958-196 ...
- 2016华为软件精英挑战赛:赛题及其答疑汇总
注:本文文字均摘自官方指定网站和论坛,权威且可信,答疑见中间部分,非常全,众玩家可放心阅读. 同时文末给出了包括自己在内的诸多玩家的解法. 前言 赛题源自"未来网络"业务发放中的路 ...
- 数据库周刊36丨2020年8月数据库排行;云厂商腾讯云增速第一;OceanBase集群安装;Oracle RAC调整网卡MTU值;不改代码解决sql性能问题;Mysql索引研究;TiDB电子书……
热门资讯 [1.2020年8月数据库排行:PolarDB.GoldenDB发力,云数据库和自主可控成主流] [摘要]2020年8月号的国产数据库流行度排行榜发布.本月的前9位排序依旧没有任何变化.达梦 ...
- 热门计算机游戏排名,十大pc游戏排行榜 英雄联盟位居第一,第三游戏体验感很强...
说起电脑网络游戏大家可能会想到英雄联盟和穿越火线以及吃鸡等游戏,这些游戏的人气是很高的赢得很多男生的喜爱.今天排行榜123网为大家盘点了十大pc游戏排行榜,一起来了解一下. 十大pc游戏排行榜 1.英 ...
- 腾讯将发布第一款区块链游戏,快播称未参与任何区块链项目 | 区块链日报
[腾讯将发布第一款区块链游戏] 4月12日,在"互联网+"数字经济峰会金融分论坛上,腾讯区块链业务总经理蔡弋戈表示,腾讯将于4月23日发布腾讯第一款区块链游戏. 另外,在今日 ...
- 网络游戏排行榜计算机,十大pc游戏排行榜 英雄联盟位居第一,第三游戏体验感很强...
说起电脑网络游戏大家可能会想到英雄联盟和穿越火线以及吃鸡等游戏,这些游戏的人气是很高的赢得很多男生的喜爱.今天排行榜123网为大家盘点了十大pc游戏排行榜,一起来了解一下. 十大pc游戏排行榜 1.英 ...
最新文章
- Kubernetes的十大使用技巧
- 贝叶斯、香农、奥卡姆合写博客「机器学习是什么」
- 企鹅帝国的疯狂反扑!
- css: transform导致文字显示模糊
- VTK:IO之ReadDICOMSeries
- 02_pyplot.plot函数、回顾第一个例子、格式字符串、plot函数、线型风格字符、标记(marker)字符、颜色字符
- Python 直接赋值、浅拷贝和深度拷贝解析
- 计算机二级mysql是什么_计算机二级mysql考什么内容?
- ssl1692-魔板【HSAH,bfs】
- 关于java25个学习要点
- 2017-12-07 socket 读取问题
- 瑞幸:现在卖24元一杯已经很便宜了 以后还要降价
- 1.(单选题) HTML是指,《计算机应用基础》第五阶段在线作业(自测).doc
- 提高mysql性能_提升MySQL性能值得借鉴的几个简易方法
- Q版周鸿祎:带你2分钟看懂互联网+
- 渗透之——Nmap+Zenmap+Amap+Zmap
- 树莓派安装和使用kodi
- 电脑安装win10系统
- 基于python实现仿探迹和天眼
- 智能音箱大战全面开火,那么问题来了:如何成为一名全栈语音识别工程师?