一次VB汇编中看-溢出计算
图文记录
一.观察程序特点和运行逻辑
带弹窗
是VB开发的
需要用户名和注册码
有弹框
具备了很简单的特点……
错误弹框,如图

二.定位
弹窗内容入手,搜索关键字定位到关键跳,nop掉或者je改jne就可以实现,即怎么输入都是正确,但不是我们的重点,直接略过

三、研究算法
1.找块入口
从关键跳【0040258B】开始往上浏览,找到push ebp ,上面又是retn的地方(这个找多了下下断试试就有经验了),即【00402310】下断点,运行程序,输入用户名''123456",伪码"654321",程序如期断在断点处

2.F8步过分析反汇编代码
F8步过,关注寄存器,堆栈,注释等的变化,找到敏感函数和信息,这里找到了取字串输入内容的相关函数
004023B6 call dword ptr ds:[eax+0xA0] ; msvbvm50.7407A5B6

F8步过这个call后堆栈变化为输入的用户名"123456"

做个标签,这里需要注意的是:对于VB的反汇编,ollydbg就会出现丢失标签的情况,所以比较操蛋,敏感的入口地址自己还是记录一下,否则重载一次标签就没了,但是注释不丢,可以注释,但是毕竟没标签类似于重命名函数来的方便、直观!
继续F8继续走
3.发现算法
再继续F8发现算法部分,算法是:输入用户名长度*0x17cfb+用户名第一个字符ascii码,再转换10进制,再转字符串
如下图

这里深挖一下jo溢出跳转,增强一下基本功
imul是有符号乘法(即要考虑正负号)
edi是32位寄存器,即最大取址范围是FFFFFFFFF,考虑到符号,则正数是0-7FFFFFFF,负数是80000000-FFFFFFFF
换成十进制就是正数0到20亿多一些,负数是从-1到负20亿左右
我们输入的字符串长度取值乘以常量0x17CFB,所以只用考虑正数即可
自己算一下字符串长度上限应该是多少呢?
答案是0x5602也就是十进制的22018
也就是说你的用户名最长是22018位,再多程序就崩了个球了
有兴趣的可以自己写个Fuzzer来测试一下是不是,当然下断后修改寄存器数值也可以达到效果
题外话,这也是为什么早期的xp系统下的网络游戏端游游戏玩家经验值总是被限制到20亿,再多对于早期的开发就很烦了,当然我妄测一下,这也是早期出现游戏角色转生的技术诱因之一
回到正题,最后拼接”AKA-“给计算好的字符串组成完整激活码,来给输入的激活码比较,最后根据比较结果弹框。


三、写getkey
既然知道了算法开始写注册机,由于XP也想兼容的原因,就用“千年老妖” vc6来写吧,因为笔者vs2017出的程序xp死活是不行的(2015通过xp支持还是可以的,2017似乎全世界已经没人想管他到底xp是否可以搞了),废话不多说核心代码如下图
void CCM002Dlg::OnOK()
{
// TODO: Add extra validation here //CDialog::OnOK(); char szName[]={};
int nKey = ;
char szkey [] = {};
GetDlgItemText(IDC_EDIT1,szName,);
if (strlen(szName)>)
{
nKey = strlen(szName) * 0x17CFB + szName[];
sprintf(szkey,"AKA-%d",nKey);
SetDlgItemText(IDC_EDIT2,szkey);
}
else
{
const char * szTitle="逆向驿站提示您";
const char * szText="用户名不能为空!";
MessageBoxA(szText,szTitle);
} }
一次VB汇编中看-溢出计算的更多相关文章
- 一起talk C栗子吧(第三十四回:C语言实例--巧用溢出计算最值)
各位看官们.大家好,上一回中咱们说的是巧用移位的样例,这一回咱们说的样例是:巧用溢出计算最值. 闲话休提,言归正转.让我们一起talk C栗子吧! 大家都知道,程序中的变量都有一个取值范围,这个范围也 ...
- GNU ARM 汇编基础
ARM GNU汇编基础 0 前言 全文补充提醒: 笔者在阅读ARM官方文档及查阅实际的u-boot源码中的汇编代码后,发现了一些不同于ARM官方文档中的汇编语法,查阅相关资料后,才发现主要由于汇编器的 ...
- 用Regex类计算一个字符串出现次数是最好方法【转载】
我的一个朋友问我,怎么在c#或vb.net中,计算一个字符串中查找另一个字符串中出现的次数,他说在网上打了好多方法,我看了一下,有的是用replace的方法去实现,这种方法不是太好,占资源太大了.其实 ...
- Moran’s I空间统计中出现内存溢出的问题
在经济学.资源管理.生物地理学.政治地理学和人口统计等领域,经常会有如下的研究需求: 研究区域中的富裕区和贫困区之间的最清晰边界在哪里? 研究区域中存在可以找到异常消费模式的位置吗? 研究区域中意想不 ...
- 程序员之---C语言细节20(符号和有符号之间转换、两数相加溢出后数值计算)
主要内容:无符号和有符号之间转换.两数相加溢出后数值计算 #include <stdio.h> /* 这个函数存在潜在漏洞 */ float sum_elements(float a[], ...
- C中整数的溢出
/** * 整数的溢出 */ #include <stdio.h> int main(int argc, char *argv[]) { short i = -24; // 将-24以无符 ...
- Python入门的三大问题和三大谎言
Python广告,铺天盖地,小白们雾里看花,Python无限美好.作为会20几种语言(BASIC Foxbase/pro VB VC C C++ c# js typescript HTML Ardui ...
- 操作系统学习笔记5 | 用户级线程 && 内核级线程
在上一部分中,我们了解到操作系统实现多进程图像需要组织.切换.考虑进程之间的影响,组织就是用PCB的队列实现,用到了一些简单的数据结构知识.而本部分重点就是进程之间的切换. 参考资料: 课程:哈工大操 ...
- 【一月一本技术书】-【Go语言设计与实现】- 9月
Go : 2009.11.10 代表作:Docker.k8s.etcd 模仿C语言,目标:互联网的C语言 讲的晦涩难懂....硬板..放弃了好几次才读完.满分10分,打6分. 下个月:Python数据 ...
随机推荐
- Python学习--打码平台
打码平台介绍 作用:可以通过第三方平台进行智能识别或者人工识别图片. 优点:1. 价格便宜: 2. 使用简单: 3. 识别率高 平台介绍: - 云打码(推荐) [http://www.yundama. ...
- 64位Windows的Dos中取消了edit命令
前段时间在玩dos命令行的时候,用copy con创建了txt文件后想对其进行编辑,然后我又不想用记事本,所以去网上找命令行中对文本文件进行编辑的命令(纯属想装B),结果看到了edit命令. 一敲,就 ...
- MongoDB基础之 用户和数据库基于角色的访问控制
mongod 关键字参数:--auth 默认值是不需要验证,即 --noauth,该参数启用用户访问权限控制:当mongod 使用该参数启动时,MongoDB会验证客户端连接的账户和密码,以确定其是否 ...
- 人工智能——Singleton模式
上次在状态模式中的设计有一个严重的问题,就是如下: voidCTroll::ChageState(CState* pNewState) { deletem_pCurrentState; ...
- Spring Boot 验证表单
在实际工作中,得到数据后的第一步就是验证数据的正确性,如果存在录入上的问题,一般会通过注解校验,发现错误后返回给用户,但是对于逻辑上的错误,很难使用注解方式进行验证了,这个使用可以使用Spring所提 ...
- 团队作业——Beta冲刺1
团队作业--Beta冲刺 冲刺任务安排 杨光海天 今日任务:开会讨论下,Beta阶段主要的冲刺内容 明日任务:根据冲刺内容,具体分配个人任务,对于冲刺内容做准备 吴松青 今日任务:跟新组员熟悉下,联络 ...
- PyQt5---firstwindow
# -*- coding:utf-8 -*- ''' Created on Sep 13, 2018 @author: SaShuangYiBing ''' import sys from PyQt5 ...
- 【洛谷P3410】拍照题解(最大权闭合子图总结)
题目描述 小B有n个下属,现小B要带着一些下属让别人拍照. 有m个人,每个人都愿意付给小B一定钱让n个人中的一些人进行合影.如果这一些人没带齐那么就不能拍照,小B也不会得到钱. 注意:带下属不是白带的 ...
- SQL必知必会摘要
数据检索 2.2 检索单个列 SELECT prod_name FROM Products; SQL语句不区分大小写 2.3 检索多个列 SELECT prod_name,prod_id,prod ...
- Springmvc常见问题
问题一:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userCont ...