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

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

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

#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. MySql 快速去重方法

    1.复制需要去重的表 CREATE TABLE 新表 LIKE 旧表 ; 2.将需要去重的字段 设置为唯一union 索引 ALTER TABLE 表名 ADD UNIQUE(`字段`); 3.复制旧 ...

  2. bzoj 1072 状压DP

    我们用w[i][j]来表示,i是一个二进制表示我们选取了s中的某些位,j表示这些位%d为j,w[i][j]则表示这样情况下的方案数,那么我们可以得到转移.w[i|(1<<k)][(j*10 ...

  3. angular项目文件概览

    在Mac上打开终端,输入ng new b-app  如下: 然后在webstorm中打开 src文件夹 你的应用代码位于src文件夹中. 所有的Angular组件.模板.样式.图片以及你的应用所需的任 ...

  4. Java Tuple使用实例(转)

    转自链接:http://www.cnblogs.com/davidwang456/p/4514659.html 一.为什么使用元组tuple? 元组和列表list一样,都可能用于数据存储,包含多个数据 ...

  5. Git提交记住用户名和密码

    https://www.baidu.com/link?url=R14MHMloypfAfIeiQwCINfY1AZlcoSU7-tYdnqC1PxfmFKs4TWzLOPdtyJbWVfqMqOkRx ...

  6. Laravel 中自定义日志目录

    参考:https://laravel-china.org/articles/7125/custom-log-directory-in-laravel

  7. CSS&&xpath

    1.元素选择器 <div class="wrap"> 直接选择文档元素div 2.类选择器 <div class="wrap"> 元素的 ...

  8. [翻译]HLS实践

    最近公司项目没事做,课余实践研究一下技术,算是积累,也可以用到项目里,从零开始记录 HLS:Http Live Streaming 官方文档 https://developer.apple.com/s ...

  9. LoadRunner去除事物中的程序的执行时间

    大家在性能测试过程中,经常会用到程序处理或组织数据,以达到一定的测试目的,但是程序本身执行会消耗一些时间,这部分消耗的时间是包含在响应时间里面,此时,响应时间=正常响应时间+程序执行消耗时间.那么如何 ...

  10. oracle创建计划任务

    特别提示: oracle是执行完任务,才按照interval去计算下次执行时间!!! 为精确每个5分钟执行一个任务,必须自己计算时间. 如:trunc_minute(sysdate)+/ create ...