当前位置:网站首页>登录模块调试-软件调试入门
登录模块调试-软件调试入门
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下的二进制文件理解更深刻。
边栏推荐
- nodejs environment variable settings
- vivo宣布延长产品保修期限 系统上线多种功能服务
- The case of five little pigs (five little pigs compare the size of the body weight)
- 【AGC】质量服务1-崩溃服务示例
- [flutter]什么是MaterialApp和Material design
- FME's scheme and operation process for reading and writing cass data
- Golang分布式应用之Redis怎么使用
- Qt 容器控件Tool Box 使用详解
- Recent learning defragmentation (24)
- 服务器装好系统的电脑怎么分区
猜你喜欢

涨姿势了!原来这才是多线程正确实现方式

新技术要去做新价值

Public Key Retrieval is not allowed error solution

LeetCode-283-移动零

How to remove last character from string in php

大厂高管借钱炒股,亏到破产卖房。。。

Horizontal Pod Autoscaler(HPA)

如何注册域名、备案以及解析

Large-scale integrated office management system source code (OA+HR+CRM) source code sharing for free

华为ADS获取转化跟踪参数报错:getInstallReferrer IOException: getInstallReferrer not found installreferrer
随机推荐
Visual Studio 集成Qt开发环境的一些注意事项
CAD几个优化设置
围绕用户思维,木鸟与途家如何实现乡村民宿下的用户运营
PyQt5快速开发与实战 9.2 数据库处理
PMP每日一练 | 考试不迷路-7.30(包含敏捷+多选)
华为云WeLink携手伙伴,共建协同办公生态
静态网页和动态网页的不同之处;该如何选择服务器呢
【SOC】经典输出hello world
Promise Notes (1)
The case of five little pigs (five little pigs compare the size of the body weight)
【HMS core】【FAQ】Account、IAP、Location Kit and HarmonyOS典型问题合集1
Minio 入门
影像信息提取DEM
Visual Studio编辑器 2019:scanf函数返回值被忽略(C4996)报错及解决办法
arcpy使用教程
Image information extraction DEM
初识二叉搜索树
Huawei ADS reports an error when obtaining conversion tracking parameters: getInstallReferrer IOException: getInstallReferrer not found installreferrer
C#西门子S7 协议通过偏移量的方式读写PLC DB块
[NCTF2019]Fake XML cookbook-1|XXE漏洞|XXE信息介绍