小甲鱼 OllyDbg 教程系列 (一) :二进制破解科普系列之 ReverseMe

 

 

小甲鱼 视频教程( 4、5 集 ):https://www.bilibili.com/video/av6889190?p=4

实验程序 reverseME.exe 下载地址:https://pan.baidu.com/s/18NDV3rQ_yV_qzUrNRYmqjA    提取码:e91j 

http://www.360doc.com/content/16/0220/00/26186435_535858733.shtml

 

 

0. 前言

 

本系列为二进制破解科普系列教程。教程面向新手爱好者,欢迎大家探讨、建议,大牛轻喷。

 

 

1. 准备工作

 

在学习之前,我们需要了解以下的内容:

 

1.寄存器:

寄存器就好比是CPU身上的口袋,方便CPU随时从里边拿出需要的东西来使用。常见涉及到的九个寄存器:

 EAX : 扩展累加寄存器EBX : 扩展基址寄存器ECX : 扩展计数寄存器EDX : 扩展数据寄存器ESI : 扩展来源寄存器EDI : 扩展目标寄存器EBP : 扩展基址指针寄存器ESP : 扩展堆栈指针寄存器EIP : 扩展的指令指针寄存器

这些寄存器的大小是32位(4个字节),他们可以容纳数据从0-FFFFFFFF(无符号数),除了以下三个寄存器,其他我们都可以随意使用:

 EBP : 主要是用于栈和栈帧。ESP : 指向当前进程的栈空间地址。EIP : 总是指向下一条要被执行的指令。

 

2. 栈:栈是在内存中的一部分,它有两个特殊的性质:

  1. FILO(Fisrt In Last Out,先进后出)
  2. 地址反向增长(栈底为大地址,栈顶为小地址)

图示:

 

3. CALL指令

    call有以下几种方式:

  1. call 404000h ;    直接跳到函数或过程的地址
  2. call eax ;            函数或过程地址存放在eax
  3. call dword ptr [eax]

 

4. 系统API

    Windows 应用程序运行在 Ring3 级别

API 函数,我们也称之为系统提供给我们的接口。因为系统只信任自己提供的函数,所以我们要通过 API 才能实现对内核的操作。

 

5. mov指令

mov 指令格式:mov dest, src。这是一个很容易理解的指令,mov 指令将 src 的内容拷贝到 dest,

mov 指令总共有以下几种扩展:movs/movsb/movsw/movsd edi,esi:这些变体按串/字节/字/双字为单位,将 esi 寄存器指向的数据复制到 edi 寄存器指向的空间。movsx符号位扩展,byte->word,word->dword (扩展后高位全用符号位填充),然后实现mov。movzx零扩展,byte->word,word->dword(扩展后高位全用0填充),然后实现mov。

 

6. cmp指令

cmp 指令格式:cmp dest, src。cmp 指令比较 dest 和 src 两个操作数,并通过比较结果设置 C/O/Z 标志位。

cmp 指令大概有以下几种格式:

  1. cmp eax, ebx             ; 如果相等,Z标志位置1,否则0.
  2. cmp eax, [404000]     ; 将eax和404000地址处的dword型数据相比较并同上置位。
  3. cmp [404000], eax     ; 同上。

 

7. 标志位:在破解中起到的作用是至关重要的。

在逆向中,你真正需要关心的标志位只有三个,也就是 cmp 指令能修改的那三个:Z/O/C。

  1. Z 标志位(0标志),这个标志位是最常用的,运算结果为0时候,Z标志位置1,否则置0。
  2. O 标志位(溢出标志),在运行过程中,如操作数超出了机器能表示的范围则称为溢出,此时OF位置1,否则置0。
  3. C 标志位(进位标志),记录运算时从最高有效位产生的进位值。例如执行加法指令时,最高有效位有进位时置1,否则置为 0 。

 

8. 逻辑运算

如图:

 

9.test 指令

test 指令格式:test dest, src。这个指令 和 and 指令一样,对两个操作数进行按位的 ‘与’ 运算,唯一不同之处是不将 ‘与’ 的结果保存到 dest。即本指令对两个操作数的内容均不进行修改,仅是在逻辑与操作后,对标志位重新置位。

 

10. 条件跳转指令

条件跳转指令,就是根据各种不同标志位的条件判断是否成立,条件成立则跳转。

 

 

2. 破解 ReverseMe

 

按 F3 载入程序:

首先,我们来看看程序图,我们先随便的走一次,顺便介绍对应的名词。

LoadIconA  : 图片的图标
CreateFileA: 创建文件

当 跳转不实现的时候,就执行下面的代码段:

然后弹出消息框,结束进程。

我们的目的是想让他跳转实现,那我们怎么办呢?就得跳过上面的代码段,我们如何来修改对应的代码段,来实现我们所要的效果呢?

要让他跳转实现的话,修改对应的 Z=0 就实现跳转。

这里已经实现跳转了,我们这节课肯定不像上面的课程那么简单了,直接一步到位,我们这节课的话,需要跳转几个位置,要不然我们怎么能突破障碍呢?

那接下来,我们继续走我们的调试文件!

ReadFile:读取一个文件

这里我们要明白为什么要去ReadFile呢?因为这里的话,要去读取一个密钥的文件,所以这里才需要ReadFile。

  •  test 指令格式:test dest, src

  •  test 指令和 and 指令一样,对两个操作数进行按位的‘与’运算,唯一不同之处是不将‘与’ 的结果保存到dest。

  •  jnz条件跳转

  •  jmp:无条件跳转

一般我们想让条件跳转判断的话,看如下图:

我们又遇到一个跳转未实现的值,其实在这里也是一个坑来的,那我们和上面一样,让他跳转的值实现。同样把寄存器区的Z值修改为 Z=0 从而达到跳转的效果。

ebx 的值等于 0 的话可以看看寄存器上的 ebx 的值。

这里看到的是xor的条件判断,对相应的值清0

下面我们走到的密钥区,如下图所示:

我们可以看到这里的跳转已实现,那想想这里是不是我们的第三个障碍呢?

分析到下面的语句,发现这里要是直接走下去的话,会误人程序的陷阱,那我们的目的只能让跳转不实现了,j1的跳转判断的话,可以看我们上面的跳转图。要让jl不实现的话,我们这里需要让SF!=OF,从而达到我们想要的效果。

就可以达到跳转不实现,我们跳过这个障碍之后,我们继续走,继续看我们的程序。

继续走我们的程序,我们又遇到一个跳转已实现的,分析到下面的代码,发现会跳转到密钥区,所以我们继续让他不实现。看他的条件语句:

让SF!=OF的值相等就行,那在这里修改S的值,让S=1变为S=0就可以达到所要的效果。

通过修改后,可以看到跳转未实现。

接下来,我们继续走我们的程序,走到jmp是无条件跳转,就让他跳吧。

我们跳转到这里的话,我们看到text里面的提示:You really did it! Congratz !!! 提示你破解已经成功咯。

是不是有点小小的激动呢?

 

 

以上都是 根据  [鱼C]小甲鱼主讲OD使用教程(第4、5集):https://www.bilibili.com/video/av6889190/?p=4

 

 

 

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

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

相关文章

java将字符串生成图片

java将字符串保存为图片 因为最近接触到的需求是要将指定的字符串内容保存为图片,我知道肯定要用awt相关的东西,但是以前没有接触过awt,所以只能去网上学习相关的东西和找有关的资料,好在最后可以解决,直接上代码&…

AI 综述专栏 | 超长综述让你走近深度人脸识别

来源:人工智能前沿讲习班 作者: 葛政相信做机器学习或深度学习的同学们回家总会有这样一个烦恼:亲朋好友询问你从事什么工作的时候,如何通俗地解释能避免尴尬?我尝试过很多名词来形容自己的工作:机器学习&…

机器人也能拥有人类情感:“情感计算”让机器人学会“读心术”

来源:《情感计算与情感机器人系统》作者:吴敏,刘振焘,陈略峰著随着机器人进入日常生活中的各个方面,人们对其提出了更高的要求,希望它们具有感知人类情感、意图的能力,这类机器人称为情感机器人…

C 语言 函数调用栈

From:https://www.cnblogs.com/clover-toeic/p/3755401.html https://www.cnblogs.com/clover-toeic/p/3756668.html 程序的执行过程可看作连续的函数调用。当一个函数执行完毕时,程序要回到调用指令的下一条指令(紧接call指令)处继续执行。函数调用过…

寒武纪创始人兼CEO陈天石博士的公开信

来源:来源:寒武纪科技摘要:2018年5月3日,寒武纪已在中国上海发布了首款云端智能芯片MLU100及相应的板卡产品。作为寒武纪的创始人和CEO,我非常自豪地与大家分享一个消息:2018年5月3日,寒武纪已在…

压栈, 跳转,执行,返回:从汇编看函数调用

From:https://www.jianshu.com/p/594357dff57e C函数调用过程原理及函数栈帧分析:https://blog.csdn.net/zsy2020314/article/details/9429707 从本篇开始,我们讨论一些高级语言中的基础设施:堆栈,函数调用&#xff0…

IBM AIX 5.3 系统管理 -- 系统启动过程详解

一. 启动过程 启动过程包含下面的一些步骤: 1.1启动一个系统的初始步骤是上电自检(Power On Self Test,POST)。其目的是验证基本硬件是否处于正常的工作状态。同时初始化内存、键盘、通信,以及音频设备。您可以看到在屏…

作弊阴影罩棋盘,人工智能咋避嫌?

来源:奇怪的科学家为什么要写这样一句话,就是为了避免剧情和现实生活中发生的事情万一差不多,会侵犯到别人的隐私,发生侵权,给双方带来不必要的麻烦。这位名为刘超的棋手把手机插在上衣兜里,摄像头正对棋盘…

ubuntu server版本安装指南(1)

ubuntu是基于GNU/Linux 的操作系统,本身是在同样GNU/Linux 架构下的Debian的基础上的一个版本。由于它在桌面环境上的易用性和精细度是许多人认识了他。ubuntu的强大在一定程度上体现在apt包管理系 统。安装软件不必像以前那样幸苦找到下载地址。编译安装。还要非常…

Arm中国合资公司具体布局浮出水面

来源:经济观察报摘要:作为全球最具影响力的芯片技术供应商之一,Arm在中国正迎来新的时代。对于Arm与中国合资公司事宜,5月4日下午,Arm授权的代表邮件回复《经济观察报》称:“合资公司目前刚开始运营”&…

汇编逆向基础

汇编逆向基础:https://www.xmind.net/m/kvJK/

深入理解Nginx~运行中的Nginx进程间的关系

在正式提供服务的产品环境下,部署Nginx时都是使用一个master进程来管理多个worker 进程,一般情况下,worker进程的数量与服务器上的CPU核心数相等。每一个worker进程都 是繁忙的,它们在真正地提供互联网服务,master进程…

哥伦比亚大学AI实验室主任Hod Lipson:阻碍无人驾驶技术发展的7个误区

来源:智车科技摘要:我们发现有些针对无人驾驶的误解还在广泛肆意传播,并且这些信息会被反对者拿来和对抗无人驾驶的推广政策。每年,全世界都有将近120万人死于车祸,这个死亡率相当于每年释放10个广岛级别的原子弹爆炸。…

PE文件结构详解 --(完整版)

From:https://blog.csdn.net/adam001521/article/details/84658708 PE结构详解:https://www.cnblogs.com/zheh/p/4008268.html PE格式解析-区段表及导入表结构详解:https://blog.csdn.net/qq_30145355/article/details/78859214 PE文件基本…

人工智能下一个热点探讨,为什么要提出互联网大脑模型 ?

作者:刘锋 计算机博士 《互联网进化论作者》前言从2008年发表论文第一次提出互联网大脑模型,时间已经过去十年。撰写这篇文章,主要是详细介绍我们在十年前提出互联网大脑模型的原因;十年来在计算机和智能领域产生了哪些进展&…

学会了这些技术,你离BAT大厂不远了

每一个程序员都有一个梦想,梦想着能够进入阿里、腾讯、字节跳动、百度等一线互联网公司,由于身边的环境等原因,不知道 BAT 等一线互联网公司使用哪些技术?或者该如何去学习这些技术?或者我该去哪些获取这些技术资料&am…

张钹院士:可解释、可理解是人工智能研究的主攻方向 | CCF-GAIR 2018

作者:刘鹏摘要:张钹院士历经了中国人工智能的从无到有,从弱到强,因而他也最能清楚地针对中国人工智能近年来的不同发展状态,发表适合的看法和提出正确的建议。2017 年末清华大学举办的「从阿尔法 Go 到通用人工智能&am…

小甲鱼 OllyDbg 教程系列 (二) :从一个简单的实例来了解PE文件

小甲鱼视频讲解:https://www.bilibili.com/video/av6889190?p6https://www.bilibili.com/video/av6889190?p7 从一个简单的实例来了解PE文件:https://www.freebuf.com/articles/system/86596.htmlhttps://blog.csdn.net/billvsme/article/details/383…

一键解决 go get golang.org/x 包失败

From:https://segmentfault.com/a/1190000018264719 问题描述 在 ubuntu 上用 sudo apt install golang-go 安装 go 的 sdk,之后使用 go get、go install、go mod 等命令时 (会自动下载相应的包或依赖包) 时,但由于众所周知的原因(墙)&#x…