第一章 基础知识---1.4Crack小实验--复现

0x01 程序及其编译环境

程序如下,功能:我们必须输入正确的密码1234567才能得到密码验证的确认,跳出循环。否则程序提示密码错误再次输入。

#include <stdio.h>#define PASSWORD "1234567"int verify_password(char* password)
{int authenticated;authenticated = strcmp(password, PASSWORD);return authenticated;
}int main(void)
{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("incorrect password!\n\n");}else{printf("Congratulation! You have passed the verification!\n");break;}}
}

程序编译环境:

操作系统:win xp
编译器:VC++6.0
build版本:release版本

对于产生release版本,我们可以在编译时,选择下图内容
在这里插入图片描述
如果没上面的界面,我们可以右键空白区域,然后选择组建,就可以出现上面的界面。
在这里插入图片描述
程序的运行结果效果图如下:
在这里插入图片描述

0x02 分析程序

找到工程的文件夹,我们使用release编译时,会生成一个Release文件夹,在这个文件夹中,我们找到.exe文件
在这里插入图片描述

将exe文件直接拖到IDA中,IDA就会把二进制文件翻译成质量上乘的反汇编代码。默认情况下,IDA会自动识别main函数。
在这里插入图片描述

按F12会自动绘制出更加专业和详细的函数流程图。
在这里插入图片描述
用鼠标选择程序分支点,按空格键切换到汇编代码
在这里插入图片描述
这条指令就是我们要找的if分支,内存地址VA:40106E.
用OD打开文件,Ctrl+G,跳转到这个地址。
在这里插入图片描述
OD默认情况下将程序中断在PE装载器开始处,而不是main函数的开始。
我们在这个地址打上断点
在这里插入图片描述
密码验证函数的返回值存放在EAX中,if语句通过以下两条指令实现。

test eax,eax
JE XXXX

现在我们将je改成jne,现在当我们输入正确密码就会提示错误,输入错误密码就会正确

在这里插入图片描述
改过之后,原本JE对应的机器指令为74,改成jnz之后变为75,运行程序,单步执行就可以看到执行了正确密码才应该得到的指令。
在这里插入图片描述

0x03 破解程序

方法1

右键----复制到可执行文件-----所有修改
在这里插入图片描述
选择全部复制
在这里插入图片描述
右键----保存文件,就可以了
在这里插入图片描述
运行程序,当我们输入1234567,会让我们继续输入,输入其他会立即退出

在这里插入图片描述

方法2

这里我们要认识几个名词:

  • 文本偏移地址(File Offset):数据在PE文件中的地址叫文件偏移地址,这是文件在磁盘上存放时相对于文件开头的偏移。
  • 装入基址(Image Base):PE装入内存时的基地址。默认情况下,EXE文件在内存中的基地址是0x00400000,DLL文件时0x10000000.
  • 虚拟内存地址(VA):PE文件中的指令被装入内存后的地址
  • 相对虚拟地址:内存地址相对于映射基址的偏移量
  • 节偏移:存储单位差异引起的节基址差
    文件偏移地址=VA-装入基址-节偏移
    节偏移=.text段的虚拟内存地址-文件偏移地址

文件数据在磁盘和内存中的存放:

  1. 磁盘:以0x200字节为基本单位进行存放。当一个数据节不足0x200字节时,不足的地方将被0x00填充;当一个数据节超过0x200,下一个0x200将分配给这个节使用。
  2. 内存:以0x1000字节为基本单位进行组织。类似的,不足将被补全,如果超出将分配下一个节为其所用。

节偏移就是这些基本单位造成的,也就是0x00填充的地方

用LordPE打开exe文件
在这里插入图片描述
我们可以看到.text的虚拟内存地址(Voffset)=0x1000,文件偏移地址(Roffset)也是这个。所以节偏移=0
40106E.这个地址的指令在PE文件中的文件偏移地址=40106E-400000-节偏移=0x106E

用编译器打开exe文件,这里我使用010Editor,Ctrl+G,输入0x106E直接跳转到JE指令的机器代码处,将74改成75
在这里插入图片描述
保存后执行,结果和方法1一样。

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

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

相关文章

.net中调用exchange服务器发邮件

普通的邮件, 用System.Net.Mail 类 或 System.Web.Mail 类 处理即可, 但是Exchange Server 环境下, 这两个类起不了作用-------至少目前我看到的情况如此. 整个过程如下: 1. 先添加COM 引用 "Microsoft CDO for Windows 2000 Library" .2. 发送邮件的代码: CDO.Messa…

Java Double类doubleToLongBits()方法与示例

Double类doubleToLongBits()方法 (Double class doubleToLongBits() method) doubleToLongBits() method is available in java.lang package. doubleToLongBits()方法在java.lang包中可用。 doubleToLongBits() method follows IEEE 754 double floating-point standards and …

Firefox(火狐浏览器)彩蛋

①在地址栏上输入&#xff1a; about:mozilla ②在地址栏上输入&#xff1a; about:robots ③在地址栏上输入&#xff1a; www.figma.com/404/ ④地址栏上输入&#xff1a; chrome://global/content/alerts/alert.xul

jquery.history插件在ie中失效的问题

hash标志中不能有? ff中不存在这个问题。 转载于:https://www.cnblogs.com/xyun/archive/2008/12/01/1345188.html

Java——反射(Class.forName()读取配置文件举例).

榨汁机(Juicer)榨汁机的案例&#xff1a; 分别有水果(Fruit),苹果(Apple)&#xff0c;香蕉(Bananal)&#xff0c;橘子(Orange),榨汁(squeeze) 要求&#xff1a; 榨出不同的水果汁来喝 //一般方法求解 package com.testl;public class Text1 {public static void main(Strin…

java 根据类名示例化类_Java类类getEnclosingClass()方法及示例

java 根据类名示例化类类的类getEnclosingClass()方法 (Class class getEnclosingClass() method) getEnclosingClass() method is available in java.lang package. getEnclosingClass()方法在java.lang包中可用。 getEnclosingClass() method is used to return recent or im…

C++:cin.getline

转&#xff1a;百度百科 http://baike.baidu.com/view/2383876.htm cin.getline 此函数是按行读取,其语法为:cin.getline(字符指针,字符个数N,结束符); 功能是&#xff1a;一次读取多个字符(包括空白字符&#xff09;&#xff0c;直到读满N-1个&#xff0c;或者遇到指定的结束符…

端口复用和重映射--STM32F103

什么是端口复用&#xff1f; STM32中有很多内置外设&#xff0c;这些外设的引脚都是与GPIO复用的&#xff0c;什么时候复用呢&#xff1f;就是当一个GPIO作为内置外设引脚使用时&#xff0c;就叫做复用。比如串口1的发送接收引脚是PA9&#xff0c;PA10&#xff0c;当PA9&#…

考研数学

眼前俨然一副冬的气象&#xff0c;伴随气温的骤降&#xff0c;考研复习也进入异常紧张的阶段。在考试前这两个月里&#xff0c;考生如何复习数学&#xff0c;成绩还可以有所提高。万学?海文数学教研组针对冲刺阶段数学复习归纳总结以下复习经验和建议&#xff0c;供大家参考。…

一个很好的自学网站~推荐一下

http://www.51zxw.net/study.asp?vip15746908

[转]Ubuntu远程桌面登陆

原文地址&#xff1a;http://www.cnblogs.com/xdzone/archive/2011/03/10/1979644.html 1.xp下默认的远程桌面协议是rdp&#xff0c;默认端口3389&#xff0c;而ubuntu用的时vnc&#xff1a;默认端口5900 2.首先被访问的主机&#xff08;windows/linux&#xff09;都要设置为允…

NVIC中断管理---STM32

NVIC&#xff1a;嵌套向量中断控制器 在了解中断之前&#xff0c;我们先了解抢占优先级和响应优先级 抢占优先级和响应优先级 抢占优先级决定能不能打断&#xff0c;高优先级的抢占可以中断低优先级的抢占响应优先级在抢占优先级相同时&#xff0c;高响应优先级先执行&#x…

Java BigDecimal stripTrailingZeros()方法与示例

BigDecimal类stripTrailingZeros()方法 (BigDecimal Class stripTrailingZeros() method) stripTrailingZeros() method is available in java.math package. stripTrailingZeros()方法在java.math包中可用。 stripTrailingZeros() method is used to get a BigDecimal that is…

外部中断---STM32F1

外部中断概述 STM32的中断控制器支持19个外部中断/事件请求&#xff1a; 线0-15&#xff1a;对应外部IO口的输入中断线16&#xff1a;连接到PVD输出线17&#xff1a;连接到RTC闹钟事件线18&#xff1a;连接到USB唤醒事件 STM32每个IO口都有可以作为外部中断输入&#xff0c;…

转:点9图

关于”点九” 转&#xff1a;http://mux.baidu.com/?p1506“点九”是andriod平台的应用软件开发里的一种特殊的图片形式&#xff0c;文件扩展名为&#xff1a;.9.png 智能手机中有自动横屏的功能,同一幅界面会在随着手机(或平板电脑)中的方向传感器的参数不同而改变显示的方向…

Python HTMLCalendar类| 带实例的formatyear()方法

Python HTMLCalendar.formatyear()方法 (Python HTMLCalendar.formatyear() Method) formatyear() method is an inbuilt method of the HTMLCalendar class of calendar module in Python. It works on HTMLCalendar class object and returns an HTML table consisting of th…

2009中国企业家新春联谊会

2009中国企业家新春联谊会——把握当前机遇&#xff0c;笑对经济危机&#xff0c;畅饮将帅美酒尊敬的嘉宾&#xff1a;当前&#xff0c;国际形势正在发生深刻而复杂的变化&#xff0c;由美国次贷危机引发的全球经济危机已经愈演愈烈&#xff0c;美国前五大投资银行有3家宣告破产…

串口通信的基本原理----STM32

串口通信基本原理 1. 处理器与外部设置通信的基本方式 并行通信&#xff1a;数据各个位同时传输串行通信&#xff1a;数据按位顺序传输 在串行通信中&#xff0c;按照数据的传输方向&#xff0c;又分为&#xff1a; 单工&#xff1a;数据传输只支持在一个方向传输半双工&am…

java获取vm运行参数_如何获取在Java中运行Java VM的版本?

java获取vm运行参数To get the version of running VM (Virtual Machine) in Java, we use the getProperties() method, which is defined in System class, while calling the method, we need to pass the property name to get the version of running Java VM. 要获取Java…

Spring MVC+Ant+Tomcat+Eclipse最简单的demo

第一步是Java的Web环境搭建&#xff0c;下载Eclipse&#xff08;或者更好的但收费的IDE-IntelliJ Idea&#xff0c;和Resharper一家公司出的&#xff09;&#xff0c;下载Tomcat&#xff0c;下载JDK&#xff0c;下载Spring&#xff0c;注意安装Tomcat的时候配置一下管理员账号和…