逆向project实战--Acid burn

0x00 序言

这是第二次破解 crackme 小程序,感觉明显比第一次熟练。破解过程非常顺利,差点儿是分分钟就能够找到正确的 serial,可是我们的目标是破解计算过程。以下将具体介绍。

0x01 初次执行

刚開始拿到 crackme 先执行程序。看看有哪些明显的特征。或者有哪些任务须要完毕:
这里写图片描写叙述
双击程序后弹框,显然第一个任务就是把这个框框弄掉,我们继续执行:
这里写图片描写叙述

这个小程序比上次的要复杂,有两个 serial ,我们先看看左边的:

这里写图片描写叙述
不出意外。猜错了,有明显的弹框和失败字符串作为特征。我们接着看右边的:
这里写图片描写叙述

不出意外,再次失败,依旧是弹框。

0x02 開始调试

1、明白目标
通过上面的执行分析,我们须要干掉第一个弹框,以及兴许的两个 serial 。同一时候我们发现三者的共同特征为弹框。所以首先拦截弹框函数:
右键代码区选择 “serach for” => “All intermodules calls”:
这里写图片描写叙述

在新窗体中输入 messageboxa,右键。选择”Set breakpoint on every call to MessageBoxA”:
这里写图片描写叙述

这样我们就给全部调用弹框函数的地方下了断点,接着回到代码区执行程序。

2、调用者
按 F9 执行到弹框函数处,我们发现此时的栈顶就是第一次弹框时的字符串的地址,于是我们须要找到那个调用弹框函数的函数。叫做调用者。

这里我们往上看,找到当前这个函数的入口并下断点:
这里写图片描写叙述

然后我们 Ctrl + F2 又一次加载程序。F9 执行到刚才下断点的入口:
这里写图片描写叙述
此时栈顶就是调用者执行call指令时保存的返回点。我们在代码区中查找这个地址(42F79C),注意单击代码区,按 Ctrl + G 进行查找:
这里写图片描写叙述

看见了吗,就是这个函数,仅仅有几句代码。以下我们就来消灭它。

3、去掉弹框
调用了函数才会弹框,我们的想法就是让它不调用函数,那么直接让函数返回是最简单的方式。于是我们把函数入口处的第一条指令改成RETN 就可以:
单击指令,按一下空格键能够改动:
这里写图片描写叙述

此时我们能够把改动保存到文件里:
右键指令,选择 “Copy to executable” => “selection”:

这里写图片描写叙述

在新窗体中右键选择 “Save file”:
这里写图片描写叙述

然后保存:
这里写图片描写叙述

执行新的程序发现第一次的弹框成功消失。

4、破解右側serial
接下来我们转到右边的 serial,输入随意字符串。然后点击button:
我们发现程序停在了弹框函数的入口:
这里写图片描写叙述

此时栈顶的值就应该是上级函数的返回地址:
这里写图片描写叙述

我们继续在代码区搜索此地址(42F509):
这里写图片描写叙述

发现了吗,有推断条件。能够看出是字符串比較函数,我们设置断点。F9 执行究竟后又一次点击button:
这里写图片描写叙述

程序停在了断点处。看看栈区。发现给函数的參数中的字符串:
这里写图片描写叙述

破解起来确实非常轻松,字符串是固定的:Hello Dude!
这里写图片描写叙述

5、破解左側 serial
我们继续执行,转到左側。输入随意字符串后点击button:
依据刚才的方式找到调用者返回地址:42FB37
这里写图片描写叙述

查找代码区:
这里写图片描写叙述

发现字符串比較函数并下断点。此时查看栈区:
这里写图片描写叙述

再往上看代码区:
这里写图片描写叙述

我们能够猜測出 serial 是 “CW-” + 某个数 + “CRACKED”,中间的数是我们须要找的目标。

6、真实的目标
我们给 serial 生成函数的入口下一个断点,然后又一次点击button执行到断点处 F8 单步走:
这里写图片描写叙述

中间发现两段代码:

EAX = name[0] * 7 + name[1] * 0x10;
EAX = name[3] * 0xB + name[2] * 0xE

继续向下执行,发现另外一段代码:
这里写图片描写叙述
函数入口的以下有一句不起眼的代码:
这里写图片描写叙述

两个结合起来就是:

EAX = name[0] * 0x29 * 2;

后面我们发现调用字符串输出函数之前 EAX 的值被置为那个内存单元的值:
这里写图片描写叙述

继续往下调试结果就非常明显了,第三段代码才是我们要的。

0x03 双重检測

1、简单粗暴的 C语言
代码例如以下:

#include <stdio.h>int main()
{char name[1024];printf("Input your name: ");scanf("%s", name);printf("Serial: CW-%d-CRACKED\n", name[0] * 0x29 * 2);return 0;
}

执行结果:
这里写图片描写叙述

2、原程序检验
这里写图片描写叙述

0x04 总结

这个小程序左边的 serial 和 name 的第一个字符有关,而且字符串长度不能小于4.

转载于:https://www.cnblogs.com/yangykaifa/p/7396298.html

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

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

相关文章

PyCharm使用技巧(六):Regullar Expressions的使用

2019独角兽企业重金招聘Python工程师标准>>> PyCharm v2018.2最新版本下载 使用正则表达式查找和替换文件中的文本 示例代码 使用正则表达式查找和替换字符串 假设您想用扩展标记<title> </title>替换元素&#xff08;title&#xff09;中的属性&#x…

内核中_init,_exit中的作用

__init&#xff0c; __initdata等属性标志&#xff0c;是要把这种属性的代码放入目标文件的.init.text节&#xff0c;数据放入.init.data节──这一过程是通过编译内核时为相关目标平台提供了xxx.lds链接脚本来指导ld完成的。 对编译成module的代码和数据来说&#xff0c;当模…

jQuery笔记总结

来源于&#xff1a;http://blog.poetries.top/2016/10/20/review-jQuery/ http://www.jianshu.com/p/f8e3936b34c9 首先&#xff0c;来了解一下jQuery学习的整体思路 第一节 jQuery初步认知 jQuery概述 JQuery概念 javascript概念 基于Js语言的API和语法组织逻辑&#xff0c;通…

芯片生产流程

每个半导体产品的制造都需要数百个工艺&#xff0c;泛林集团将整个制造过程分为八个步骤&#xff1a;晶圆加工-氧化-光刻-刻蚀-薄膜沉积-互连-测试-封装。 一、晶圆加工 所有半导体工艺都始于一粒沙子&#xff01;因为沙子所含的硅是生产晶圆所需要的原材料。晶圆是将硅(Si)或砷…

GRE Sub math 报名

Step1 注册ETS帐号 Step2 登录帐号&#xff0c;点击Register/Find Test Centers, Dates Step3 按照提示查询考场 如果没有结果而是出现了如下提示&#xff0c;意味着这个地方没有考位了&#xff0c;需要选择其他地方的考位 Step 4 接下来就和GRE general test的过程一样了&…

platform_device_系列函数及其设备注册的作用

platform_device_系列函数&#xff0c;实际上是注册了一个叫platform的虚拟总线。使用约定是如果一个不属于任何总线的设备&#xff0c;例如蓝牙&#xff0c;串口等设备&#xff0c;都需要挂在这个虚拟总线上。 driver/base/platform.c //platform设备声明 struct device pla…

示例解读 Python 2 和 Python 3 之间的主要差异

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; 每门编程语言在发布更新之后&#xff0c;主要版本之间都会发生很大的变化。 在本文中&#xff0c;Vinodh Kumar 通过示例解释了 Python 2 和 Python 3 之间的一些重大差异&#xff0c;以帮助说明…

数字后端——布局

由于I / O单元和模块的布放已经在布图规划时完成&#xff0c;因此布局的剩余任务主要是对标准单元的布局。布局方案在布图规划时就已经做了决定&#xff0c;要么选择展平式布局&#xff0c;要么就是层次化布局。 一、布局目标 布局的目标也即布局内容实施之后所要达到的预期值…

python基础 函数 (四)

一 函数基本 def func1():print("hello world")return 1, "hello", ("wo", "ai"), ["ni", "da"], {"you": "xi"} # return 可以返回任意# 结果&#xff1a; (1, hello, (wo, ai), [ni, da…

c#注释

c#的注释分为&#xff1a;这里不能不说一下什么是注释。 注释本身不会执行&#xff0c;只是说明性文字&#xff0c;只供程序员阅读。 注释又分为&#xff1a;单行注释&#xff0c;多行注释&#xff0c;文档注释。 单行注释&#xff1a;//开始 多行注释&#xff1a;/*开始&#…

嵌入式linux字符设备驱动

1. 我们需要先调用register_chrdev_region()或 alloc_chrdev_region()来向系统申请设备号int register_chrdev_region( dev_t first, unsigned int count, char *name ); //函数通过已知的设备号first来注册字符设备区域。 int alloc_chrdev_region( dev_t *dev, unsigned int…

数字后端——时钟树综合

在数字集成电路设计中&#xff0c;时钟信号是数据传输的基准&#xff0c;它对于同步数字系统的功能、性能和稳定性起决定性作用&#xff0c;所以时钟信号的特性及其分配网络尤被人们关注。时钟信号通常是整个芯片中有最大扇出、通过最长距离、以最高速度运行的信号。时钟信号必…

52次课(mysql用户管理、常用sql语句、 mysql数据库备份恢复)

MySQL创建用户以及授权 默认用户是root用户&#xff0c;不可能所有人员都用root用户&#xff0c;创建用户防止误删除&#xff0c;因为mysql里边有多个库每个库里有很多表&#xff0c;所以需要给单独的用户做一些授权我只需要它对某一个数据库有权限&#xff0c;或者说对某个数据…

线程池的种类,区别和使用场景

newCachedThreadPool&#xff1a; 底层&#xff1a;返回ThreadPoolExecutor实例&#xff0c;corePoolSize为0&#xff1b;maximumPoolSize为Integer.MAX_VALUE&#xff1b;keepAliveTime为60L&#xff1b;unit为TimeUnit.SECONDS&#xff1b;workQueue为SynchronousQueue(同步队…

20145225 《信息安全系统设计基础》第14周学习总结

第九章 虚拟存储器 虚拟存储器是计算机系统最重要的概念之一&#xff0c;它是对主存的一个抽象 三个重要能力&#xff1a; 它将主存看成是一个存储在磁盘上的地址空间的高速缓存&#xff0c;在主存中只保存活动区域&#xff0c;并根据需要在磁盘和主存之间来回传送数据&#xf…

数字后端——布线

布线是继布局和时钟树综合之后的重要物理实施任务&#xff0c;其内容是将分布在芯片核内的模块、标准单元和输入输出接口单元( I /O pad&#xff09;按逻辑关系进行互连&#xff0c;其要求是百分之百地完成它们之间的所有逻辑信号的互连&#xff0c;并为满足各种约束条件进行优…

动态加载和静态加载及其编译步骤

在类unix操作系统中&#xff0c;驱动加载方式一般分为&#xff1a;动态加载和静态加载&#xff0c;下面分别对其详细论述。 一、动态加载 动态加载是将驱动模块加载到内核中&#xff0c;而不能放入/lib/modules/下。 在2.4内核中&#xff0c;加载驱动命令为&#xff1a;ins…

streamsets 集成 minio s3测试

具体streamsets crate 集成可以参考 streamsets crate 以下文档只关注minio 集成的配置 minio 服务 搭建 具体搭建参考&#xff1a; https://www.cnblogs.com/rongfengliang/p/9197315.html 创建bucket &#xff08;crate 集成使用&#xff09; 测试的csv 文件从https://www.s…

sqlite性能优化

1、数据库性能上 1.1 批量事务插入&#xff0c;提升数据插入的性能 由于sqlite默认每次插入都是事务&#xff0c;需要对文件进行读写&#xff0c;那么减少事务次数就能简书磁盘读写次数从而获得性能提升。 1.2 单条sql优于多条sql 实测发现&#xff0c;对于几十条sql插入当你替…

【codecombat】 试玩全攻略 第十四关 已知敌人

第十四关 已知敌人 在这一关里&#xff0c;我们的英雄获得了一副可以看见敌人的眼镜&#xff0c;所以他很强势的学会了“发现敌人”的技能。 hero.findNearestEnemy()命令&#xff0c;单词多了&#xff0c;首字母都要大写了&#xff0c;不然分不出来。玩过wow的小伙伴用过 宏命…