《0day安全-软件漏洞分析技术》实验笔记1
2024-08-28 02:45:42
Crack 小实验
工具
- Dev C++(书上使用的VS)
- IDA_Pro_v7.0
- Ollydbg
- LordPE
- 010 editor
使用IDA打开文件
- 找到程序分支点
- 空格跳转到汇编界面
- 得到VA:0x40156d
使用OD打开文件
- Ctrl+G跳转到IDA得到的VA
- 加断点,运行,此时输入任意密码,回车后程序在此中断。
- 我们只要把je改成jne就能实现输入错误密码返回正确结果。
使用LordPE打开文件
- OD修改只是修改了内存中的值
- 利用公式计算:
文件偏移地址 = 虚拟内存地址(VA) - 装载基址 - 节偏移
= 0x0040156D - 0x00400000 - (0x1000 - 0x400)
= 0x96D
使用十六进制编辑器修改文件
- 010Editor打开文件
- Ctrl + G 跳转到0x96D
- 修改740e为750e
- 保存运行
- 输入正确密码显示密码错误,错误密码会返回正确的提示
实验 2.2.2 突破密码验证程序
知识点
- 缓冲区溢出
- C语言strcpy函数:https://www.runoob.com/cprogramming/c-function-strcpy.html
实验环境与工具
- Win10 64bit
- Dev-C++
- IDA-Pro
- OD
实验记录
- 代码:
#include <stdio.h>
#include <string.h> #define PASSWORD "1234567" int verify_password(char *password)
{
int authenticated;
char buffer[];
authenticated=strcmp(password,PASSWORD);
strcpy(buffer,password);
return authenticated;
} int main()
{
int valid_flag = ;
char password[];
while()
{
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;
}
}
return ;
}
实验步骤
- 运行测试:
- 静态反汇编:
- strcpy后一句地址为0x401532
- strcpy后一句地址为0x401532
- 动态调试
- 输入"qqqqqq",authenticated的值为1
- 输入"qqqqqqqq"尝试使用字符串末尾的'\0'把authenticated的低字节覆盖从而变成0
- 成功绕过了验证
- 输入"qqqqqq",authenticated的值为1
实验 2.3.2 更改返回地址
实验工具
- 010 Editor
- Dev C++
- IDA-Pro
- OD
实验知识点
- 缓冲区溢出覆盖栈内函数的返回地址
实验源码
#include <stdio.h>
#define PASSWORD "1234567"
int verify_password(char *password)
{
int authenticated;
char buffer[];
authenticated = strcmp(password,PASSWORD);
strcpy(buffer,password);
return authenticated;
} main()
{
int valid_flag=;
char password[];
FILE *fp;
if(!(fp=fopen("password.txt","rw+")))
{
exit();
}
fscanf(fp,"%s",password);
valid_flag = verify_password(password);
if(valid_flag)
{
printf("incorrect password!\n");
}
else
{
printf("Congratulation!You Have passed the verification!\n");
}
fclose(fp);
}
实验步骤
- 运行测试
- 静态反编译,strcpy下一句为0x40152e,密码正确的分支是0x4015ca
- 动态调试
- 当前栈帧的EBP是0x61fa78
- 查看栈的内容
- 尝试直接修改返回地址,成功跳转到正确密码的分支
- 使用二进制编辑器构造payload
- 运行,虽然会闪退,但是通过捕捉,可以发现确实跳转到了正确的分支
- 当前栈帧的EBP是0x61fa78
实验 2.4 代码植入
实验工具
- Windows XP SP3
- Visual C++ 6.0
- Depends
- OD
源码
#include <stdio.h>
#include <string.h>
#include <windows.h>
#define PASSWORD "1234567"
int verify_password(char *password)
{
int authenticated;
char buffer[];
authenticated = strcmp(password,PASSWORD);
strcpy(buffer,password);
return authenticated;
} main()
{
int valid_flag=;
char password[];
FILE *fp;
LoadLibrary("user32.dll");
if(!(fp=fopen("password.txt","rw+")))
{
exit();
}
fscanf(fp,"%s",password);
valid_flag = verify_password(password);
if(valid_flag)
{
printf("incorrect password!\n");
}
else
{
printf("Congratulation!You Have passed the verification!\n");
}
fclose(fp);
}
实验步骤
- 编译程序并且拖入Depends,发现并没有user32.dll
- 从编辑器里面打开dll文件,发现也可以看到库的基地址,user32.dll的库基地址为0x77D10000,MessageBoxA的偏移地址为0x407EA,地址为0x77D5 07EA
- 先用123422343234423452346234来找到栈中buffer的位置,buffer的起始地址是0x12FAF0
- 构造password.txt
- 代码植入成功
- 运行测试
遇到的问题
- Depends的结果与实验指导上的不一样,没有显示出user32.dll的库基地址
- 从编辑器打开user32.dll:
- 从编辑器打开user32.dll:
最新文章
- Microsoft SQL Server 2008 R2 安装卸载
- jackson error 含义log
- 09B-独立按键消抖实验02——小梅哥FPGA设计思想与验证方法视频教程配套文档
- LINUX下常用SHELL指令
- Servlet与JSP版本历史以及Tomcat支持的版本
- BZOJ3542:DZY Loves March
- Linux用户与“最小权限”原则
- 【循序渐进学Python】8.面向对象的核心——类型(下)
- 二模 (2) day2
- Intellij IDEA开发第一个Android应用
- window nodejs 版本切换 nvmw
- CodeForces 190A Vasya and the Bus
- Swing 组件焦点设置
- EventBus实现 - 发布订阅 - XML加载
- poj3683
- 201521123059 《Java程序设计》第二周学习总结
- FX-玩列表
- Python基础理论 - 常用模块
- 详解 leetcode 猜数字大小 II
- android--------阿里 AndFix 热修复
热门文章
- Mybatis 解决问题的记录与博客
- yii 上传视频(ajax)
- CDOJ 1135 邱老师看电影 概率dp
- 快速乘(O(1))
- 【知识库】-数据库_MySQL之基本数据查询:子查询、分组查询、模糊查询
- [CSP-S模拟测试]:那一天她里我而去(堆优化Dijkstra)
- hive分区表插入一条测试数据
- linux IP 网关配置
- Linux shell - `dirname $0` 定位到运行脚本的相对位置
- C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现