当前位置:网站首页>软件漏洞分析入门(二)
软件漏洞分析入门(二)
2022-07-17 00:07:00 【默认用户_114514】
栈缓冲区初步调试
本次实验包含64位和32位的反汇编分析,主要内容是调试验证栈缓冲区溢出之后栈数据的变化、执行流程的变化
本次实验用的工具包含
IDA pro以及x64dbg和x32dbg(没用ollydbg是因为分析x64的反汇编太复杂了)
编译栈溢出实验代码
下面这是一段在各种软件安全教材中高频出现的经典代码
//stack_over_ret.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define PASSWORD "1234567"
int verify_password (char *password)
{
int authenticated;
char buffer[8];
authenticated=strcmp(password,PASSWORD);
strcpy(buffer,password);//over flowed here!
return authenticated;
}
main()
{
int valid_flag=0;
char password[1024];
FILE * fp;
if(!(fp=fopen("password.txt","r")))
{
exit(0);
}
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);
system("pause");
}
IDA 分析
这段代码需要在同目录下有一个 password.txt 文件作为输入
我们先实验一下,文件内如果是正确的密码,窗口提示正确,

编译文件,拖到 IDA 里 逆向,各种函数的跳转流程非常清晰
发现在箭头的地方产生了判断语句的分支

动态调试
找到分支位置之后,去 x64dbg 里调试,直接定位到定位的位置



mov [rbp+6B0h+var_6AC], eax ;eax存的是密码检测函数的返回值
cmp [rbp+6B0h+var_6AC], 0 ;将函数返回值和0比较
jz short loc_140011AD8 ;如果是0则正确,不是0则错误
知道这个判断的位置之后,可以来动态修改判断的分支,绕过这个判断分支
我们把这个 je 改成 jne 就可以使错误的密码也能通过验证
我们把密码文件改成错误的 5555555

定位到 je 指令处,把 je 机器码从 74 0E 编辑为 75 0E 即 jne

成功绕过
利用栈溢出控制执行流程
将 password.txt 内容改为 7777777,方便定位

找到栈中 7777777 的位置

我们让 password 越界溢出,执行程序看看会怎样

程序直接崩溃了

我们可以看到,越界的 “7” 直接往后填充了

接下来的部分我们换成x86,32位的程序进行分析(因为64位的程序函数调用的并不像32位一样直接进栈,参数超过)
还是先放到 IDA 里面

在 x64dbg 里找到最关键的 verify_pasword 函数入口,写个注释

password.txt 用 010 editor 打开,后面用 nop 即 0x90 填充,一直填充到返回地址附近

nop 已经接近返回地址了

接着往后填充,把返回地址填充为 00D81182


可以看到返回地址处已经改成了想要的 00D81182 了

栈溢出的保护机制
如果当读者跟着笔记的操作步骤一步一步实验,会发现到最后不论怎么样都不会实验成功,这是因为系统和编译器在编译程序的时候会默认启用一些针对栈溢出的保护机制,让栈溢出的漏洞不那么容易利用。关于这些保护机制,我们在下一期笔记中会继续探讨。
边栏推荐
猜你喜欢

XXX packages are looking for funding run `npm fund` for details解决方法

Uni app wechat applet - Mall (6) - my home page

uni-app微信公众号(1)——网页授权登录

Use leaflet to copy the original shentiwa Mega map to make a diary

Cento7安装mysql5.5以及升级5.7

页面布局——三栏布局解决方式

当 std::bind 遇上 this

gtest与gmock的安装与使用

Express的使用方法,路由的匹配与使用

自己封裝的風格化的開關卡片組件
随机推荐
cmake的基本使用
markdown编辑器语法——文字颜色、大小、字体与背景色的设置(转载)
01_模板语法
04_理解MVVM
Nodejs cross domain CORS
网站被黑,通过百度/搜狗等搜索关键词访问跳转到其他网站怎么办?
软件漏洞分析入门(五)
[GFCTF 2021]Baby_ Cve-2021-41773 on the web
Assemblage stylisé de cartes de commutation auto - encapsulées
今天的码农女孩做了关于生命周期的笔记以及动态时钟的练习
深拷贝与浅拷贝
uni-app微信公众号(1)——网页授权登录
今天的码农女孩学习了关于事件操作和ref属性的笔记并做了表单双向绑定的练习
Cve-2022-34265 Django extract & TRUNC SQL injection vulnerability recurrence
自己封装的风格化的开关卡片组件
uniapp调用地图,进行位置查询,标记定位
Differences between let and const, let, const and VaR
05_回顾Object.defineProperty
es6语法--解构赋值
列表懒加载和图片懒加载