在我们的生活中,存在的许许多多的漏洞,下面像大家介绍的就是平时比较常见的栈溢出漏洞的实践过程。

下面,我们用一个非常简单的例子来让大家对栈溢出漏洞有个直观的认识。

这是一个简单的密码验证程序,但因为代码不严密,导致了栈溢出漏洞的产生。

#include<stdio.h>

#include<string.h>

#define PASSWORD "1234567"

int verify_password (char *password)

{

intauthenticated;

charbuffer[8];//定义一个大小为8字节的数组,控制没溢出的字符串长度;(超出这个长度就发生溢出)

authenticated=strcmp(password,PASSWORD);

strcpy(buffer,password);//这个语句就直接导致了溢出的发生

returnauthenticated;

}

main()

{

intvalid_flag=0;

charpassword[1024];

while(1)

{

printf("请输入密码:");

scanf("%s",password);

valid_flag=verify_password(password);

if(valid_flag)

{

printf("密码错误!\n\n");

}

else

{

printf("恭喜,你通过了验证!\n");

break;

}

}

}

具体的运行情况如下:

图1

但是,如果我们输入这样的密码,它也能通过

那么,出现这种情况的原因是什么呢?

图3

这是程序运行时栈的情况。

学过C语言的人应该知道,我们一个字符串的结尾是以字符串截断符null作为字符串结束标志。在这个程序中,我们开始定义的char型buffer数组长度为8,如果你输入的密码长度不等于8的话,那么这个密码验证程序的功能还是完善的,但是如果你的密码长度为8的话,这个栈溢出漏洞的危害就显现出来了。密码长度为8,buffer字符串数组的’结束标志就会溢出至int authenticated的内存空间内,并将原来的数据覆盖。

观察源代码我们不难发现,authenticated变量的值来源于strcmp函数的返回值,之后会返回给main函数作为密码验证成功与否的标志变量:当authenticated为0时,表示验证成功,反之,验证不成功。

光说不管用,下面我们用ollydbg来验证一下到底是不是这样。

图4

这里,我们输入8个q。

图5

图6

在ASCII中71代表q。

在图6中,我们可以清楚地看到,8个q将buffer数组全部占满,字符串截断符溢出至0018FB4C(即原authenticated的位置)。

栈的具体变化情况如下表:

通过上面的解释,我想大家对栈溢出有了个初步的认识。在这里介绍的栈溢出漏洞看起来很简单,但实际上栈溢出是最常见的内存错误之一,也是攻击者入侵系统时所用到的最强大、最经典的一类漏洞利用方式。

注意:

1、  在观察内存的时候应当注意内存数据与数值数据的区别,电脑在存储数据的时候并不是按照我们平时记忆的方式存储。在调试环境中,内存有低到高分布,但在数值应用的时候确实由高位字节向低位字节进行解释。

2、  在输入密码时,如果你输入的字符串小于原来定义的密码,是不能冲破验证程序的。

3、  这个实验是在win7 64位环境下完成的,在其他环境下栈溢出的原理相同,但内存地址不同。

win7环境下一次浅谈栈溢出的更多相关文章

  1. 浅谈Windows环境下DOS及MS-DOS以及常见一些命令的介绍

    浅谈Windows环境下DOS及MS-DOS以及常见一些命令的介绍 前记 自己是搞编程的,首先我是一个菜鸟,接触计算机这么久了,感觉很多计算机方面的技术和知识朦朦胧胧.模模糊糊,貌似有些贻笑大方了:所 ...

  2. 浅谈Cordova优缺点与环境部署(转载)

    浅谈Cordova优缺点与环境部署 作者:苏华杰 简介 Cordova是一个用基于HTML.CSS和JavaScript的,用于创建跨平台移动应用程序的快速开发平台.它使开发者能够利用iPhone.A ...

  3. 浅谈在ES5环境下实现const

    最近看到一个面试题--用ES5实现const.作为JS初学者的笔者知道在ES6中有const命令,可以用来声明常量,一旦声明,常量的值就不可改变.例如: 1234567891011 const Pi ...

  4. 浅谈Java语言环境搭建-JDK8

    title: 浅谈Java语言环境搭建-JDK8 blog: CSDN data: Java学习路线及视频 1.What's the JDK,JRE JDK(Java Development Kit ...

  5. 【ASP.NET MVC系列】浅谈ASP.NET 程序发布过程

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  6. 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生

    [转].NET(C#):浅谈程序集清单资源和RESX资源   目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...

  7. 浅谈Windows API编程

    WinSDK是编程中的传统难点,个人写的WinAPI程序也不少了,其实之所以难就难在每个调用的API都包含着Windows这个操作系统的潜规则或者是windows内部的运行机制…… WinSDK是编程 ...

  8. 浅谈原子操作、volatile、CPU执行顺序

    浅谈原子操作.volatile.CPU执行顺序 在计算机发展的鸿蒙年代,程序都是顺序执行,编译器也只是简单地翻译指令,随着硬件和软件的飞速增长,原来的工具和硬件渐渐地力不从心,也逐渐涌现出各路大神在原 ...

  9. [IC]浅谈嵌入式MCU软件开发之中断优先级与中断嵌套

    转自:https://mp.weixin.qq.com/s?__biz=MzI0MDk0ODcxMw==&mid=2247483680&idx=1&sn=c5fd069ab3f ...

随机推荐

  1. maven使用过程中遇到的问题总汇

    1:web.xml is missing and <failOnMissingWebXml> is set to true 造成原因: 使用maven创建项目时有时在pom.xml的war ...

  2. D - Binary Lexicographic Sequence URAL - 1081 (贪心)

    题目链接:https://cn.vjudge.net/contest/275079#problem/D 具体思路:首先,我们可以观察到1-n位数的种数连起来是一个很有规律的数列,然后我们开始倒序建立. ...

  3. B - GuGuFishtion(莫比乌斯 欧拉函数 预处理mu函数的欧拉函数的模板)

    题目链接:https://cn.vjudge.net/contest/270608#problem/B 题目大意:题目中说,就是对欧拉函数的重新定义的一种函数的求和. 证明方法: AC代码: #inc ...

  4. 组合数+逆元 A - Chat Group Gym - 101775A

    题目链接:https://cn.vjudge.net/contest/274151#problem/A 具体思路:我们可以先把所有的情况算出来,为2^n.然后不合法的情况减去就可以了.注意除法的时候要 ...

  5. Django之cfrs跨站请求伪造和xfs攻击

    跨站请求伪造 一.简介 django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对于django中设置防 ...

  6. Ubuntu10.04 下安装RabbitVCS

    安装RabbitVCS的方法步骤如下: 1.sudo add-apt-repository ppa:rabbitvcs/ppa       #将rabbitvcs的添加到源里面.(次操作会提示是否要添 ...

  7. Linux是对用户的密码的复杂度要求设置【转】

    那么Linux是如何实现对用户的密码的复杂度的检查的呢?其实系统对密码的控制是有两部分组成: 1 cracklib 2 /etc/login.defs pam_cracklib.so 才是控制密码复杂 ...

  8. WebBrowser中运行js

    HtmlElement script = wf.WebBrowser.Document.CreateElement("script"); script.SetAttribute(& ...

  9. 《secret》读书笔记

    这是在从大连到深圳飞机上看完的一本书,也是大学毕业时室友整理书籍给我的.正好回来的途中,一气呵成读完了. 全书讲了几个事情,其中费了很大篇幅就围绕一个主题,当然书题了——秘密,这个秘密就是“吸引力法则 ...

  10. LINUX内核中的机制OOM

    [概念] LINUX内核中有一个机制叫做OOM killer(Out Of Memery killer) 该机制监控内存占用过大,尤其是瞬间消耗大量内存的进程, 为了防止内存被耗尽,所以OOM kil ...