最近因为工作需要在看0day的软件漏洞分析,发现这本《0day安全软件漏洞分析技术(第2版)》真是本好书,唯一缺点就是书上的环境是Windows XP 32Bit的,基于现状难以进行实践,于是笔者打算使用紧跟潮流但又尽量满足书上的环境——Windows 10 Profession 32Bit,希望对大家学习有所帮助。

一、环境以及要用的软件

系统:Windows 10 Profession

软件:UltraEdit、LordPE、OllyDBG、VC++ 6.0、IDA Pro

下图作者的系统信息,就是一个虚拟机而已:

二、实验目的

本次实验的目的是通过更改软件的十六进制值达到输入任何密码都能突破验证。

三、实现过程

首先我们用VC++ 6.0编写一个可供此次实验的C语言程序,代码如下:

#include<stdio.h>

#include<string.h>

#define PASSWORD "1234567"

int verify_password(char *password)

{

 int authenticated;

 authenticated = strcmp(password, PASSWORD);

 return authenticated;

}

void main()

{

 int valid_flag = 0;

 char password[1024];

 while(1)

 {

 printf("please input password: ");

 scanf("%s", password);

 valid_flag = verify_password(password);

 if(valid_flag)

 {

 printf("No, your password is False!\n\n");

 }

 else

 {

 printf("Yes, your password is True!\n");

 break;

 }

 }

}

上述代码的具体意思不作解释,若想看懂请自行翻阅C语言的相关书籍,比如C语言编程兵书等等。

上述代码经过编译运行会形成如下的运行结果:

从运行结果与我们程序的代码不难发现,这个软件的密码只会是1234567,那么现在关闭它,开始我们的破解之路吧。先用IDA Pro打开这个名为Crack的exe文件,作者的exe文件在C:\MyProjects\Debug\Crack.exe此目录下,大家请找到自己的文件所在位置,打开之后会出现如下图的样子:

某些时候打开会是一个一个的图片,请仔细看上图中的红框对应你软件的位置,那里有个黄色的小箭头,鼠标点住它往左拖就可以看到上面这种样式。

在上图黑框中有我们程序中出现的一句话,这里是输入错误密码时才会出现的,那么前面的“JE short_loc xxxxxx”这句话其实就代表了程序中的if语句,请将这句话前面的号码记住复制下来,我这里是004010D5,如下图:

为啥要记住这个呢?因为我们就要从if语句下手,分析程序可以知道if...else...语句其实就是用来判断我们输入密码正确错误的关键,所以要对症下药。

当我们找到004010D5时就可以关闭上一步的软件了,接下来打开OllyDBG,动态调试这个程序可以更好的为下面的步骤做准备,打开之后应该会出现下图所示:

按Ctrl+G,在弹出的窗口中输入刚刚复制的十六进制地址。如下图:

点击OK之后会跳转到前面第二步中我们看到的代码上。如上图红框,注意红框中的数字“74”哦!点击之后按F2,打个断点,接下来按F8进行单步调试,在Crack程序的运行框中出现“please input password”字样后输入一个错误的密码,再返回到上图,点击“JE short_loc xxxxxx”字样的代码句,下面一个小框中会出现“Jump is NOT taken”的字样。如下图:

这本身是一个错误的密码,按照程序的逻辑,它会给我们打印“No, your password is False!”,但别忘记我们的初心是想让它给我们打印“Yes, your password is True!”,这时候我们双击“JE short_loc xxxxxx”字样的代码句,在弹出的框中将“JE”改成“JNE”,后面保持原状,之后点击Assemble按钮,注意看这句话它前面的数字变成了“75”哦,最后点击Olly DBG软件最上面的倒三角按钮。如下图:

这时候再转回去看输出的结果,会惊奇的发现,打印的是“Yes, your password is True!”这样我们的目的就达到了,可这并不是我们的终极目标,我们是想要修改自己编的软件,从根源上修改它!于是进入下一步。

在这一步中我们需要用到第四个软件——LordPE,在打开之前请关闭OllyDBG软件,LordPE打开之后界面如下图所示:

点击PE Editor按钮打开Crack.exe之后会出现如下图所示:

这里主要是记住ImageBase后面的十六进制数字,用前面得到的十六进制数字减这个十六进制数字得到004010D5 - 00400000 = 0x10D5。

得到0x10D5后就可以关闭这个软件了,如果你用的是Windows10 64Bit的系统,就会发现你的ImageBase与我的完全不一样,如下图是64位Windows10的ImageBase:

这是最后一步,我们打开UltraEdit,将Crack.exe拖入UltraEdit中,会出现一大片数字和字母,打开之后按Ctrl + G,在弹出的框中输入0x10D5之后回车,会跳转到一个地方,如下图:

在上图中箭头指向的地方有一个醒目的74,还记得前面第3步说过的数字“74”么?对,没错,这里的74就是第3步中的74!还记得我们将“JE”改成“JNE”之后数字变成了“75”么?最后一步就是将这个“74”改成“75”,然后Ctrl + S保存即可哦,如下图:

这时候我们再用OllyDBG打开Crack.exe测试发现,如果输入的密码为1234567,反而是错的了,其余的则是正确。测试如下图:

以上是今天要学习的内容,后面作者会持续更新这一系列的内容,希望大家多多关注哦!

参考书籍

《0day安全软件漏洞分析技术(第2版)》 王清 主编

《0day安全软件漏洞分析技术》学习笔记的更多相关文章

  1. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  2. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  3. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  4. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  5. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  6. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  7. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  8. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

  9. DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记

    今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...

  10. ucos实时操作系统学习笔记——任务间通信(消息)

    ucos另一种任务间通信的机制是消息(mbox),个人感觉是它是queue中只有一个信息的特殊情况,从代码中可以很清楚的看到,因为之前有关于queue的学习笔记,所以一并讲一下mbox.为什么有了qu ...

随机推荐

  1. Linux-打包压缩命令

    内容总结自<鸟哥的Linux私房菜>http://cn.linux.vbird.org/linux_basic/0240tarcompress.php 一.打包/压缩文件常见扩展名 *.g ...

  2. 更改组织属性-以更改maxrecordsforexporttoexcel为例

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复232或者20161101可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  3. 在标准实体特殊消息上注册插件及Dynamics CRM 2015中计算字段的使用

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复157或者20151005可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 前面的 插件系列博客教程 讲述了 ...

  4. 网络编程~~~ socket(套字节)

    一 socket (套接字) socket处于应用层与传输层之间,提供了一些简单的接口,避免与操作系统之间的对接,省去了相当繁琐复杂的操作. socket在python中属于一个模块,通过调用模块中已 ...

  5. 7.jenkins 按标签发布

    jenkins 如果要按标签发布,需要安装下, Git Parameter Plug-In   的 插件. 之前我们的jar包项目.  我们运行的时候是以下内容. 现在我们对这个jar进行小范围修改. ...

  6. go 创建自己的区块

    package main import ( "time" "crypto/sha256" "bytes" ) //区块体 type Bloc ...

  7. Eviews作时间序列分析的一个实例

    时间序列分析是作时间序列数据预测的一个重要部分,由于此次实验室竞赛也用到了时间序列分析,就在此说一下平稳性分析以及非平稳处理的方法:   1.判断平稳性         1.1平稳性的定义       ...

  8. typing模块

    目录 一.引言 二.typing模块的作用 三.使用typing模块 四.typing常用类型 一.引言 前言:很多人在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么 ...

  9. 用OC基于数组实现循环队列

    一.简言 使用数组实现循环队列时,始终会有一个空余的位置预留着,作为一个判决队列已满的条件(当然也可以采用其他方式).在前面已经用C++介绍了基本的算法,可以去回顾一下https://www.cnbl ...

  10. 《转》sql处理百万级以上的数据提高查询速度的方法

    处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考 ...