最近因为工作需要在看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. (转)GitHub Desktop 拉取 GitHub上 Tag 版本代码

    转自:GitHub Desktop 拉取 GitHub上 Tag 版本代码 一直在使用 GitHub Desktop 图形化 git 管理工具,统一项目框架版本时需要切换到ThinkPHP Tag 分 ...

  2. Add an Editor to a Detail View 将编辑器添加到详细信息视图

    In this lesson, you will learn how to add an editor to a Detail View. For this purpose, the Departme ...

  3. 查找 oracle 数据库中包含某一字段的所有表的表名

    select table_name from DBA_TAB_COLUMNS where COLUMN_NAME='字段名'; 字段名需要大写

  4. ifconfig|grep eth0|awk '{print $5}' 命令详解

    因需要将linx下获取某个网中的MAC地址,可以使用如下命令获取: ifconfig|grep eth0|awk '{print $5}' ifconfig: 输出linux下所有网口的信息(包括IP ...

  5. 删除Word中出现的空白页

    删除Word中出现的空白页 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ Word中出现空白页,怎么删都删不掉,Backspace与Delete键不管 ...

  6. Linux驱动中的platform总线分析

    copy from :https://blog.csdn.net/fml1997/article/details/77622860 概述 从Linux2.6内核起,引入一套新的驱动管理和注册机制:pl ...

  7. <Array> 54 (高频+hard )45

    55. Jump Game 希望知道能否到达末尾,也就是说我们只对最远能到达的位置感兴趣,所以维护一个变量 reach,表示最远能到达的位置,初始化为0.遍历数组中每一个数字,如果当前坐标大于 rea ...

  8. seq参数 RANDOM 参数 openssl参数 cut参数

    #seq命令用于以指定增量从首数开始打印数字到尾数 语法: [2] seq [选项] 首数 尾数 [3] seq [选项] 首数 增量 尾数选项: seq 实例 一 存入数据库 然后 输出数据库的代码 ...

  9. xml模块(了解)

    目录 一.xml简介 二.Python使用xml 三.自己创建xml文档 一.xml简介 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在 ...

  10. Java连载53-单例模式初步、final关键字补充、回顾知识点

    一.回顾 1.类和对象的区别 2.UML(uniform makeup language) 3.方法区存储静态变量.常量(static final修饰) 4.堆内存中存储对象 5.栈存储变量 6.th ...