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 )// 这里比较是否满足条件,满足条件就成功

这样大致可以看出程序的流程了。

Created with Raphaël 2.2.0开始输入用户名长度是否小于21且大于6?对用户名进行运算调用sub_401960比较计算serial结果长度是否等于20?计算出来的serial结果是否满足条件显示注册成功结束显示注册错误yesnoyesnoyesno

具体流程得出后,可以逐一分析了。

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中,当满足下面条件时才能注册成功

  1. U1U_1U1 + K5K_5K5 == K3K_3K3
  2. U2U_2U2 + K3K_3K3 == 2K52K_52K5
  3. K4K_4K4 + U3U_3U3 == K1K_1K1
  4. U4U_4U4 + K1K_1K1 == 2K42K_42K4
  5. U5U_5U5 + K2K_2K2 == 3U43U_43U4

变换一下位置,就能通过U来计算出K了,然后可以枚举一下所有可能,也就是0-63,就能找出满足K的字符串

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376335.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavascriptDOM(三)

简介 今天学习第二天的知识,js和BOM对象,再接再厉,fighting~学习原则 脚踏实地的走好每一步,要想学好高级部分,基础知识必须扎实呀 掌握基本语法,完成小案例,写博客作总结,基本就是这个节奏,下面我们一起快速入门吧JavaScript快速入门 1. js简介 1.js基于对象和事件驱动的脚本语…

看雪 2016CrackMe 攻防大赛 - 1-Crack_Me-凉飕飕

环境&#xff1a; Windows xp 工具&#xff1a; IDA EXEINFOPE OD 0x00 查壳 EXEINFOPE查壳&#xff0c; 无壳 0x01 分析 if ( (unsigned __int16)wParam 0x40B ) // 成功{*(_OWORD *)v22 xmmword_41DB98;v25 0;v23 xmmword_41DBA8;v24 xmmword_41DBB8;memset_4039D0…

使用CSDN-markdown编辑器

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

C++ vector类详解

转自http://blog.csdn.net/whz_zb/article/details/6827999 vector简介 vector是STL中最常见的容器&#xff0c;它是一种顺序容器&#xff0c;支持随机访问。vector是一块连续分配的内存&#xff0c;从数据安排的角度来讲&#xff0c;和数组极其相似&#xff0c;不同的地方就是…

ViewPager的使用方法和实现过程

看图先&#xff1a; 页面中填充内容是随机关键词飞入和飞出动画效果&#xff0c;随后会更新&#xff0c;现在请先无视吧 首先是 导入jar包 下载地址&#xff1a; android-support-v4.jar 布局文件里添加viewPager布局 [html] view plaincopyprint?<android.support.v4.vi…

如何通过浏览器在所有响应内容中查找文本

使用浏览器的开发者工具查找响应文件的内容 ** Chrome ** 版本&#xff1a; 快捷键&#xff1a;CtrlShiftF 可以看到已经查找出来了 ** firefox ** 版本

【Leetcode】【Easy】Implement strStr()

Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack. 解题&#xff1a; 本题为典型的KMP算法考察题&#xff0c;KMP算法描述为&#xff1a; 设主串S&#xff0c;匹配串P&#xff0c;i为S的索引下…

Jenkins入门指南

新手学习使用Jenkins 安装好Jenkins后如何运行脚本 1.新建item 2.输入任务名称&#xff0c;选择项目类型&#xff0c;点击确定 3.填个描述就好了&#xff0c;新手学jenkins&#xff0c;其他都不看&#xff0c;跑起来再说 4.点这个高级&#xff0c;选择你要运行的脚本所在…

Sublime Text 3 史上最性感的编辑器

↑ ↑ ↑ ↑ ↑ 请看文件夹 ↑ ↑ ↑ ↑ ↑ 下载 / 安装 windows / MAC OS 官网下载&#xff0c;双击安装&#xff0c;这个都会吧&#xff5e; linux linux下安装&#xff0c;一种办法是从官网下载 tar.bz &#xff0c;手动安装。 这里介绍用 apt-get 自己主动安装方法&#xf…

swift入门之TableView

IOS8更新了&#xff0c;oc还将继续但新增了swift语言&#xff0c;能够代替oc编写ios应用&#xff0c;本文将使用swift作为编写语言&#xff0c;为大家提供step by step的教程。 工具 ios每次更新都须要更新xcode&#xff0c;这次也不例外&#xff0c;但使用xcode6&#xff0c;须…

Jmeter BeanShell学习(一) - BeanShell取样器(一)

通过利用BeanShell取样器设置请求发送的参数。 第一步&#xff1a;添加BeanShell取样器 第二步&#xff1a;在BeanShell中输入执行的代码 log.info("脚本开始执行"); //意思是将字符串输出到日志消息中 vars.put("username","123163.com");//…

Jmeter BeanShell学习(一) - BeanShell取样器(二)

利用BeanShell取样器获取接口返回的JSON格式的结果&#xff0c;并将该结果写入到文件。 第一步&#xff1a;添加BeanShell取样器 前面几个取样器的内容查看&#xff1a; https://blog.csdn.net/goodnameused/article/details/96985514 第二步&#xff1a;查看返回的结果格式 …

160 - 50 DueList.5

环境&#xff1a; Windows xp sp3 工具&#xff1a; Ollydbg exeinfope 0x00 查壳 可以看出程序有加壳&#xff0c;那么我们下一步就是脱壳了。 0x01 脱壳 看上去没什么特别的地方&#xff0c;就直接 单步跟踪法 来脱壳吧 近call F7&#xff0c;远call F8 来到这里 哈&…

关键路径的概念和算法

AOE网&#xff1a;在一个表示工程的带权有向图中&#xff0c;用顶点表示事件&#xff0c;用有向边表示活动&#xff0c;边上的权值表示活动的持续时间&#xff0c;称这样的有向图叫做边表示活动的网&#xff0c;简称AOE网。AOE网中没有入边的顶点称为始点&#xff08;或源点&am…

160 - 51 DueList.6

环境&#xff1a; Windows xp sp3 工具&#xff1a; Ollydbg exeinfope 0x00 查壳 发现程序没有加壳&#xff0c;那么我们可以直接分析了。 0x01 分析 运行程序看一看 看到错误信息的字符串后我们可以直接搜索了。 可以看到程序会比较输入的长度是否为8位&#xff0c;如…

160 - 52 egis.1

环境&#xff1a;windows xp 工具&#xff1a; 1、OllyDBG 2、exeinfo 3、IDA 0x00 查壳 加了UPX壳&#xff0c;那么就要脱壳了。可以使用单步法来脱壳。 UPX壳还是比较简单的&#xff0c;开头pushad&#xff0c;找个popad&#xff0c;然后就是jmp了。 然后就可以用OD来…

玩转MySQL之Linux下的简单操作(服务启动与关闭、启动与关闭、查看版本)

小弟今天记录一下在Linux系统下面的MySQL的简单使用&#xff0c;如下&#xff1a; 服务启动与关闭 启动与关闭 查看版本 环境 Linux版本&#xff1a;centeros 6.6&#xff08;下面演示&#xff09;&#xff0c;Ubuntu 12.04&#xff08;参见文章末尾红色标注字体&#xff09; M…

实验八第二题

转载于:https://www.cnblogs.com/huangsilinlana/p/3411550.html

敏捷自动化测试(1)—— 我们的测试为什么不够敏捷?

测试是为了保证软件的质量&#xff0c;敏捷测试关键是保证可以持续、及时的对软件质量情况进行全面的反馈。由于在敏捷开发过程中每个迭代都会增加功能、修复缺陷或重构代码&#xff0c;所以在完成当前迭代新增特性测试工作的同时&#xff0c;还要通过回归测试来保证历史功能不…

ios 程序学习

马上着手开发iOS应用程序&#xff1a;五、提交应用与寻找信息 2013-01-11 15:36 佚名 apple.com 我要评论(0) 字号&#xff1a;T | T本文介绍了您已经学习完如何开发一个优秀的iOS应用之后&#xff0c;应该掌握的内容&#xff0c;包括将您的应用提交到App Store让其他人下载&am…