登录模块调试-软件调试入门

前言

写作目的

本人一直对软件调试,逆向等挺感兴趣,但是说实话这东西很难入门。之前知道一本书叫《0day安全:软件漏洞分析技术》,但一直没看,最近有空看了一下发现这本书写的挺好,虽然是09年的书但很多东西其实不过时。所以想写个博客记录下书中的实验。

工具

本实验所用的工具如下(在win10平台下完成实验):

1. Dev-Cpp 5.11 TDM-GCC 4.9.2 (用于编写程序)
2. IDA
3. Ollydbg
4. lordpe
5. winhex

进行实验

在Dev-C++中写代码并编译

代码就是很简单的一个登录模块,如果登录成功则跳出循环,否则一直在循环中,代码如下:

#include<stdio.h>
#define PASSWORD "1234567"

int verify_password(char*password){
	int authenticated;
	//相同结果为0 不同结果为1
	authenticated=strcmp(password,PASSWORD);
	return authenticated;
}

int main(){
	int valid_flag=0;
	char password[1024];
	while(1){
		printf("Please input the password: ");
		scanf("%s",password);
		valid_flag=verify_password(password);
		if(valid_flag){
			printf("The password is wrong,login failed\n");
		}
		else{
			printf("The password is correct,login successful\n");
			break;
		}
	}
}

然后进行编译,这里将其编译为32bit的程序。
在这里插入图片描述
会生成一个exe文件。点击exe文件:
在这里插入图片描述
如果输入正确的口令1234567会闪退表示登录成功。

IDA中打开exe文件进行静态调试

在这里插入图片描述
一打开就是一个流程图,可以点击键盘中的Fn+F12。
在这里插入图片描述
可以看到在jz short loc_401588指令处进行了分支,盲猜这里就是if语句。既然我们想破解登录程序,那么最简单的就是将if与else反过来,也就是把以上流程图中的false与true线反过来,这个可以通过修改分支处的判断条件得到,所以重点关注分支处汇编语句。
来看看汇编指令:
在这里插入图片描述
可在分界点处点击空格,就可以看到如下流程图。再在我标的地方那条线点击空格就可看到汇编代码。
在这里插入图片描述
在这里插入图片描述
所以知道虚拟内存的地址(VA)是00401578(8*4=32位),需要注意的是调试软件看到的地址都是虚拟内存地址。

Ollydgb中打开exe文件进行动态调试

使用ollydbg打开这个exe文件后在键盘上输入Ctrl+G组合键输入在上节看到的地址
在这里插入图片描述
按下回车就可定位到分支语句。
在这里插入图片描述
汇编中jz与je是一个意思,jne与je是相反意思。所以可以试试将je改为jne。点击黄色那一行。
在这里插入图片描述
发现74 0E变为了75 0E。
在这里插入图片描述
可以运行来试试,键盘中键入Fn+F9,发现本来登录口令1234567登录失败了。而随便输入一个值却登录成功。说明我们的思路是正确的。
在这里插入图片描述

改变软件本身的十六进制

退出IDA与Ollydbg,再打开exe文件,发现还是没有修改成功,因为之前只是调试,要修改其内部的十六进制才能成功,使用winhex打开这个exe文件。
在这里插入图片描述
太多了,根据上一节我们知道我们需要将74 0E改为75 0E,这里打开exe文件左边的offset是文件偏移地址,我们之前掌握的是虚拟内存地址需要换算。
由于32位的exe文件与dll文件等都是PE格式,PE文件映射到虚拟内存的映射图如下(出自《0day安全:软件漏洞分析技术》):
在这里插入图片描述
从图中看出PE文件的初始地址是0字节,虚拟内存的装载基址(Image Base)是0x00400000。根据公式:文件的偏移地址=RVA(VA-Image Base)-节偏移(虚存中的offset-文件的offset)
之前通过调试器看到VA=0x00401578,已知Image Base=0x00400000,所以RVA(虚拟内存相对偏移地址)=0x00001578。现在要算节偏移,使用Lordpe(可免费下载)打开exe文件。
在这里插入图片描述
点击PE Editor然后选择exe文件。
在这里插入图片描述

在这里插入图片描述
节偏移就是VOffset-ROffset,注意这里不是00000600,这是十六进制计算,防止口算错建议十六进制计算器
在这里插入图片描述
节偏移是0x00000C00。那么文件偏移地址如下,为0x00000978:
在这里插入图片描述
在winhex中找到相应地址
在这里插入图片描述
将74改为75然后保存。
在这里插入图片描述
再打开exe文件发现本来正确的口令1234567却提示登录失败,虽然输入一个却闪退(表示登录成功)。
在这里插入图片描述

总结

本实验的主要收获是理解了PE文件与虚拟内存的映射关系,学习了虚拟内存与文件偏移等进行换算的公式,对win32下的二进制文件理解更深刻。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值