当前位置:网站首页>软件漏洞分析入门(二)
软件漏洞分析入门(二)
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 了

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

Uni app wechat applet - Mall (7) - Product Details

红日安全靶场3

uni-app微信公众号(5)——新增、修改地址

使用redis - zset做排行榜

PCRE bypasses regular

uni-app微信公众号(4)——地址管理页面

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

Assemblage stylisé de cartes de commutation auto - encapsulées

Uni app wechat official account (1) - Web page authorization login
随机推荐
Node的数据库编程(MySQL),增删改查
列表懒加载和图片懒加载
Array Operations - judgment, de duplication, consolidation, expansion
Uni app wechat official account (4) - address management page
NodeJS 跨域 CORS
Summary of Applied Cryptography
tp-watermark.js网页添加水印插件
Champ de tir rouge 3
当 std::bind 遇上 this
How does the website count the number of visitors? How to install and use 51la?
服务器如何安装宝塔面板?(宝塔面板安装教程)
object-fit:cover;在小程序中不起作用,小程序图片变形了如何处理
[elementui El date picker date selector, the end time must not be earlier than the start time, and only the date of the specified number of days from the start time can be selected]
Uni app wechat official account (1) - Web page authorization login
Es optional chain
mmap的 Bus error问题及解决
uni scroll-view 下拉刷新
Computed and watch, watcheffect
今天的码农女孩做了关于呼吸灯的练习、受控组件和高阶组件的简答题
Page layout - three column layout solution