当前位置: > 财经>正文

[超详细]栈溢出漏洞原理实例讲解 怎么进行黄金理财操作流程图视频讲解呢

2023-09-06 03:53:31 互联网 未知 财经

[超详细]栈溢出漏洞原理实例讲解

[超详细]栈溢出漏洞原理实例讲解

文章目录 [超详细]栈溢出漏洞原理实例讲解代码简介分析程序整体执行流程程序执行细节及栈空间变化栈溢出通过栈溢出控制程序执行结果通过栈溢出插入代码 本篇文章通过《0day安全:软件漏洞分析技术》书中第二章中所用到的一个程序的栈溢出漏洞的复现,以及使用OD一步步调试来学习栈溢出完整的原理。程序虽然简单,但在一些基础薄弱的人眼中还是无法理解,所以导致很多新手到了这里就被“劝退”。 所以在这篇博客中我会差不多一句一句的解释汇编代码的意思,一步一步的看栈的变化,即使遇到一些“常识”我也会进行介绍,来帮助理解栈溢出漏洞

使用软件:

vc++6.0 (用来编译程序)OllyDbg十六进制编辑软件 代码简介 #include#include#include#define PASSWORD "1234567" //写入静态密码int verify_password(char *password)//确认密码是否输入正确{int authenticated;char buffer[8];authenticated=strcmp(password,PASSWORD); strcpy(buffer,password); //存在栈溢出的函数return authenticated;}void main(){int valid_flag=0;char password[1024];scanf("%s",password); //输入密码valid_flag=verify_password(password);if(valid_flag) //返回0代表正确,返回1代表错误{printf("incorrect password! ");}else{printf("success ");}getchar();//暂停一下}

运行结果如下:

好,接下来开始演示栈溢出的原理。

分析程序整体执行流程

首先使用Debug编译器(最好不要使用release编译器),Debug和Release编译后的程序的区别就是,在调用一些系统函数的时候,Debug会保留调用点,而转去系统函数所在地继续执行;而Release会直接将系统函数粘贴过来,不用实现调用便可完成。使用Debug能更直观看出函数执行到了什么位置。使用OD打开编译好的.exe文件。

典型的VC编译的程序的样子,但程序的入口点并不是main函数的入口点,接下来我们要找到main函数,有两种方法:

单步跟踪(F8),在遇到call调用的时候使用F7跳转到跟踪函数内部,直到进入(我们可以判断出是)main函数的地方,如:

根据“常识”,在GetCommandLineA后不远处就是main入口,在main之前会有(三个)连续的压栈操作,如:

找到main函数之后,F7跟进main函数里,继续分析:

如图所示,根据左侧ASCII码的提示,和代码中调用系统函数的名字,我们很轻易的找到了scanf函数的位置,按从右至左的顺序将参数(password就是[local.257]和“%s”)入栈之后调用scanf。中间的一段初始化代码为初始化申请的空间为0xcc,其中valid_flag(即[local.1],后面会说)要初始化为0。

根据接下来的ASCII码,可以判断在中间的调用语句call a.00401005就是verify_password函数的位置。

之后F7继续跟进verify_password函数内部继续分析:

进入函数,首先看见的就是常规操作,将前栈基址入栈,抬高栈顶(给局部变量申请空间),之后可以看到在调用strcmp函数之前将他的两个参数从右至左入栈,静态值“1234567”是写在程序的数据段中的,另一个是参数password,在第一个(只有一个)参数即[arg.1]位置。strcmp执行结果在eax寄存器中,然后将结果赋值给变量authenticated,即第一个变量,就是[local.1]位置(图里不小心画到strcpy参数入栈里了)。然后进行strcpy函数的参数入栈,从右至左是password和buffer,buffer就是第二个参数(因为长度是8,所以[local.3]),将他们入栈之后调用strcpy,将password内容拷贝到buffer里。然后(进行清理栈空间操作后)返回。

这里介绍一下汇编语言中的几个概念:

函数的调用:

调用函数之前先将参数依次入栈,然后调用,调用结束之后将入栈的参数出栈(清理栈空间),根据不同的调用约定,入栈的顺序不同。C语言默认的调用方式是__cdecl,参数从右到左入栈。

版权声明: 本站仅提供信息存储空间服务,旨在传递更多信息,不拥有所有权,不承担相关法律责任,不代表本网赞同其观点和对其真实性负责。如因作品内容、版权和其它问题需要同本网联系的,请发送邮件至 举报,一经查实,本站将立刻删除。