当前位置:网站首页>登录模块调试-软件调试入门
登录模块调试-软件调试入门
2022-07-30 16:12:00 【代玛无能人士】
前言
写作目的
本人一直对软件调试,逆向等挺感兴趣,但是说实话这东西很难入门。之前知道一本书叫《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下的二进制文件理解更深刻。
边栏推荐
猜你喜欢

Scheduling_Channel_Access_Based_on_Target_Wake_Time_Mechanism_in_802.11ax_WLANs

【Linux Operating System】 Virtual File System | File Cache

如何在分面中添加数学表达式标签?

【AGC】Open Test Example
![[NCTF2019]Fake XML cookbook-1|XXE漏洞|XXE信息介绍](/img/29/92b9d52d17a203b8bdead3eb2c902e.png)
[NCTF2019]Fake XML cookbook-1|XXE漏洞|XXE信息介绍

FME's scheme and operation process for reading and writing cass data

基于STM32F407使用ADC采集电压实验

武汉星起航跨境电商有前景吗?亚马逊的未来趋势如何发展?

谷歌工程师『代码补全』工具;『Transformers NLP』随书代码;FastAPI开发模板;PyTorch模型加速工具;前沿论文 | ShowMeAI资讯日报

配置Path环境变量
随机推荐
DTSE Tech Talk丨第2期:1小时深度解读SaaS应用系统设计
Redis 复习计划 - Redis 数据结构和持久化机制
JVM学习----垃圾回收
Windows MySQL 安装配置
[flutter]什么是MaterialApp和Material design
UI测试新方法:视觉感知测试详解
php如何截取字符串的前几位
vivo announced to extend the product warranty period, the system launched a variety of functional services
Placement Rules usage documentation
How to implement timing tasks for distributed applications in Golang
为什么数据需要序列化
rhce笔记3
Nervegrowold d2l (7) kaggle housing forecast model, numerical stability and the initialization and activation function
Store Limit usage documentation
Rounding out the most practical way of several DLL injection
Data Analysis Tools - DDL operations & DML operations in HQL
应用OPC解决方案实现控制系统数据的安全交换
Why is there no data reported when the application is connected to Huawei Analytics in the application debugging mode?
支付系统架构设计详解,精彩!
SMI 与 Gateway API 的 GAMMA 倡议意味着什么?