《0day安全-软件漏洞分析技术》实验笔记1
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:
《0day安全-软件漏洞分析技术》实验笔记1的更多相关文章
- 《0day安全软件漏洞分析技术》学习笔记
最近因为工作需要在看0day的软件漏洞分析,发现这本<0day安全软件漏洞分析技术(第2版)>真是本好书,唯一缺点就是书上的环境是Windows XP 32Bit的,基于现状难以进行实践, ...
- 《0day安全-软件漏洞分析技术》实验笔记2
实验 3.4 通用shellcode 工具 Windows XP SP3 Visual C++ 6.0 OD IDA 源代码 见随书代码,参考:https://github.com/jas502n/0 ...
- 书评第003篇:《0day安全:软件漏洞分析技术(第2版)》
本书基本信息 丛书名:安全技术大系 作者:王清(主编),张东辉.周浩.王继刚.赵双(编著) 出版社:电子工业出版社 出版时间:2011-6-1 ISBN:9787121133961 版次:1 页数:7 ...
- 《ODAY安全:软件漏洞分析技术》学习心得-----shellcode的一点小小的思考
I will Make Impossible To I'm possible -----------LittleHann 看了2个多星期.终于把0DAY这本书给看完了,自己动手将书上的实验一个一个实现 ...
- PHPCMS9.6.0最新版SQL注入和前台GETSHELL漏洞分析 (实验新课)
PHPCMS9.6.0最新版中,由于/modules/attachment/attachments.php的过滤函数的缺陷导致了可以绕过它的过滤机制形成SQL注入漏洞,可导致数据库中数据泄漏. 而且在 ...
- 认识二进制安全与漏洞攻防技术 (Windows平台)
二进制漏洞是指程序存在安全缺陷,导致攻击者恶意构造的数据(如Shellcode)进入程序相关处理代码时,改变程序原定的执行流程,从而实现破坏或获取超出原有的权限. 0Day漏洞 在计算机领域中,0da ...
- 漫谈SCA(软件成分分析)测试技术:原理、工具与准确性
摘要:本文介绍了SCA技术的基本原理.应用场景,业界TOP SCA商用工具的分析说明以及技术发展趋势:让读者对SCA技术有一个基本初步的了解,能更好的准确的应用SCA工具来发现应用软件中一些安全问题, ...
- Linux漏洞分析入门笔记-CVE-2015-0235
Ubuntu 12.04 32位 ida 7.0 0x00:漏洞描述 1.glibc的__nss_hostname_digits_dots存在缓冲区溢出漏洞,导致使用gethostbyname系列函数 ...
- Linux漏洞分析入门笔记-CVE_2018_6323_整型溢出
操作系统 Ubuntu 16.04 /32 位 调试器 IDA pro 7.0 漏洞软件 binutils-2.29.1 0x00: 漏洞描述 1.什么是整数溢出: 在计算机中,整数分 ...
随机推荐
- Gradle 配置国内镜像
项目级配置 在项目中找到如下文件 打开,添加上阿里云镜像 maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
- PIC - For Resources [ background ]
- JS单线程和异步
线程和单线程的概念: 线程:是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同 ...
- [人物存档]【AI少女】【捏脸数据】活泼少女
AISChaF_20191028022750507.png
- UVA 315 求割点 模板 Tarjan
D - D Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Status Pract ...
- 7.9模拟赛T1图的遍历(dfs)
图的遍历(dfs) [题目描述] 对于一个有向图G来说,我们存在一个经典的遍历算法,就是DFS (深度优先搜索遍历).将G以1号点为起点进行DFS后,我们可以 得到G的一棵DFS遍历树T.就此,我们可 ...
- func<T> 和 action<T>
一.Func Func<Result>,Func<T1,Result>是一个.Net内置的泛型委托. Func<TResult> Func<T,TResult ...
- 「CSA Round #41」BFS-DFS
题目链接 戳我 \(Description\) 给出一个图的\(bfs\)序和\(dfs\)序,构造出一个满足条件的图,边的扫描顺序为读入顺序 \(Solution\) 这个题还是很简单的. 先来看看 ...
- 20165213 Exp6 信息搜集与漏洞扫描
信息搜集与漏洞扫描 一. 实践内容 (1)各种搜索技巧的应用 利用Google Hacking Datebase搜索. 尝试搜索http相关的漏洞,可以看到漏洞的相关信息. 也可以使用过滤器进行过滤, ...
- Nginx-rtmp之 ngx_rtmp_send.c 文件分析
1. 简述 1.1 RTMP 消息类型 /* RTMP message types */ #define NGX_RTMP_MSG_CHUNK_SIZE 1 #define NGX_RTMP_MSG_ ...