当前位置: 首页 > 编程日记 > 正文

使用Linux进行缓冲区溢出实验的配置记录

在基础的软件安全实验中,缓冲区溢出是一个基础而又经典的问题。最基本的缓冲区溢出即通过合理的构造输入数据,使得输入数据量超过原始缓冲区的大小,从而覆盖数据输入缓冲区之外的数据,达到诸如修改函数返回地址等目的。但随着操作系统和编译器针对缓冲区溢出问题引入防护机制,初学者想要由简入繁的学习和实践缓冲区溢出的原理变得困难。在 Linux 环境下,用户可以通过设置编译和系统环境来去除某些防护措施,从而方便的完成某些简单的缓冲区溢出实验。

1.关闭SSP( Stack Smashing Protector )

实现原理

SSP 是 gcc 提供的针对栈上缓冲区溢出提供检查的机制。典型的缓冲区溢出攻击会通过构造输入数据覆盖缓冲区外的数据,实现一定的溢出效果,如修改函数返回地址等。启用 SSP 机制后,在编译器生成的代码中,对于那些存在缓冲区的函数,函数开始时会在对应栈帧中入栈一个随机值( canary ),在函数调用结束准备返回时,编译器生成的代码会检查上述引入的随机值是否发生了变化,若发生变化则说明出现了缓冲区溢出,控制流会转移至对应的处理函数处。

以下列代码为例进行说明

    void simpleCopy( char *src ){char buff[10];strcpy( buff , src );          }

上述代码将缓冲区 src 中的数据简单的拷贝至 buff 数组中,而没有考虑 src 中的数据量是否超出了 buff 数组的容纳能力。

使用 gdb 查看得到 simpleCopy 的汇编如图所示。

在开启了 SSP 机制的 gcc 生成的代码中,函数开始数据处理之前,将 gs:0x14 处的值存放在了 %ebp - 12 处,在函数返回时,对 %ebp - 12 处的值进行检查,若此时值不等于 gs:0x14 处的值,则说明存在数据的覆盖和修改,程序会转入 __stack_chk_fail 执行。通过 simpleCopy("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")调用函数的结果如下图所示。上述 simpleCopy 函数中,缓冲区 buff 首地址为 %ebp - 22 , 而引入的 canary 存放在 %ebp - 12 处,当缓冲区存在数据溢出时,会修改 canary 的值,从而在函数返回时被检测到。

选项设置

gcc的编译设置中,默认设置SSP机制是有效状态,用户可在编译时加入 -fno-stack-protector 参数禁用SSP机制。

    -fstack-protector    //编译时启用SSP机制-fno-stack-protector //编译时禁用SSP机制

2.关闭DEP( Data Execution Prevention )

在某些栈缓冲区数据溢出实践中,会将构造好的机器指令序列通过输入写入位于栈上的输入缓冲区中,同时,构造数据覆盖位于数据缓冲区外的函数调用的返回地址,将其值修改为缓冲区中构造好的机器指令序列的地址,这样当函数调用返回时,程序控制流会跳转至输入缓冲区中的构造指令序列,从而实现执行流的修改和劫持。而现代编译器中,为防止用户通过栈上的缓冲区构造数据,使用了DEP机制,即限制内存的属性,使得某些可写内存不可执行( 如栈 )或可执行内存不可写( 如.text段),从而达到防护的效果。

使用 gcc 进行编译时,可通过 -z execstack 参数,使得最终生成的程序中栈内存段具备可执行权限。

    -z execstack    //设置栈内存段具备可执行权限

在程序运行时,可通过查看 cat /proc/pid/maps 文件查看 pid 所对应的进程的内存映射情况,其中包括对进程的段的属性描述。

 3.关闭ASLR( address space layout randomization )

在基础栈缓冲区溢出实践中,一个重要的步骤为定位某些目标的内存映射地址,如最简单的 shellcode 需定位注入栈上的构造指令序列的地址( 从而修改函数返回地址指向该指令序列),ret2libc 方法则需要攻击者定位位于内存中的标准库函数的内存映射地址等。ASLR ,即内存布局随机化机制由操作系统实现,其主要被划分为映像随机化、栈随机化和堆随机化这几类,分别针对程序的加载基地址、栈基址和堆基址进行随机化。

设计原理

已经编译完成的程序的各个段在内存中的加载基位地址是固定的,也就是说程序运行时的内存映射情况是固定的,攻击者可以通过多次调试运行程序,获得他们所需的目标地址。在编译好的 ELF 文件中,段头部表描述了程序需加载入内存的各个段的基地址,可通过 readelf -h filename 对其进行查看。对于运行中的程序,可以通过 cat /proc/pid/maps 查看 pid 对应的进程的内存映射情况,包括栈、堆的基地址等。

        objdump -h hello    //查看可执行文件hello的段头部表cat /proc/pid/maps  //pid为进程号,查看pid对应进程的内存映射情况

(1)通过 objdump -h hello 查看该 ELF 文件的.text 加载基地址为 0x08048370,而.rodata段的加载基地址为 0x08048558。

(2)通过 cat /proc/$$/maps 查看 shell 的内存映射情况(64位Ubuntu),可以看到 shell 进程的 stack 段的内存范围以及其属性为可读可写但不可执行,p 表示该虚拟内存段为私有的( private ),s 表示该虚拟内存段为共享的( shared )。

在过去的编译环境中,程序的数据段包括.text、.bss、.rodata 段加载进内存的基地址在编译时即已确定,程序运行时进程中 stack 和 heap 的起始地址也总是固定的,这就使得攻击者可以较容易的定位内存中目标的地址,从而进行攻击尝试。在引入 ALSR 机制后,对于程序的某个特定的段( .text 、stack 、heap ),操作系统会在加载时自其原始的起始基地址处加入一个随机大小的“填充”,对应的程序数据总是自“填充”区域后开始,由于每次使用的“填充”的大小并不固定,同一程序多次运行时的内存布局会发生变化,从而使得攻击者较难通过固定的地址去访问其所需要的目标。

选项设置

用户可通过cat /proc/sys/kernel/randomize_va_space 查看当前 ALSR 机制的运行情况。其中,为 0 表示 ALSR 机制未启用,为 1 表示 ALSR 机制会随机化 stack、vdso和 mmap 的起始基地址,为 2 表示除对上述目标进行随机化外还会对堆基地址进行随机化。用户可通过 echo 0 > /proc/sys/kernel/randomize_va_space 设置关闭 ALSR

     cat /proc/sys/kernel/randomize_va_space       //查看 ALSR 机制的运行情况echo 0 > /proc/sys/kernel/randomize_va_space    //设置关闭 ALSR 机制,需要 root 用户进行操作

上述对 /proc/sys/kernel/randomize_va_space 的操作为针对系统的全局设置,需要 root 权限且存在弊端,用户可通过以下命令将当前终端 /bin/bash 的 ALSR 机制关闭,则通过该 shell 运行的程序均不会启动 ALSR 机制。该终端关闭后上述设置即失效。

   setarch `uname -m` -R /bin/bash

4.通过 gdb 获得目标地址

基础的缓冲区溢出实践通常需要确定运行状态下程序中的某些地址,如需要确定输入缓冲区的起始地址从而获得注入缓冲区中的机器指令的地址等。在 Linux 环境下,可通过 gdb 对程序进行动态调试,从而获得程序运行状态下的信息( 关闭 ALSR 机制后效果更好 ),基础的 gdb 操作可参见笔者的文章Linux下编辑、编译、调试命令总结——gcc和gdb描述。使用 gdb 可以方便的获取程序动态运行状态下的信息,但通过 gdb 动态调试获取的诸如缓冲区的起始地址等信息可能与程序实际运行时的信息并不相同,从而影响缓冲区溢出实践的效果。关于保证通过 gdb 动态调试程序获得的局部变量的地址与直接运行该程序时的地址一致的问题,笔者另外通过博文针对 Linux 环境下 gdb 动态调试获取的局部变量地址与直接运行程序时不一致问题的解决方案进行描述。

5.总结

为了完成基础的缓冲区溢出实践,用户可通过 gcc 的编译选项 -fno-stack-protector 关闭 SSP 保护机制,通过 -z execstack 选项使得生成的可执行程序的栈可执行,通过 setarch `uname -m` -R /bin/bash 设置关闭当前终端中运行程序的 ALSR 机制,并通过 gdb 动态调试获取某些所需要的程序局部变量的信息。

6.参考资料

1.Stack Smashing Protector - OSDev Wiki

2.protect against buffer overflow exploits

3.Address space layout randomization - Wiki

转载于:https://www.cnblogs.com/yhjoker/p/9148092.html

相关文章:

Javascript导出Excel的方法

<SCRIPT LANGUAGE"javascript"> function method1(tableid) {//整个表格拷贝到EXCEL中 var curTbl document.getElementById(tableid); var oXL new ActiveXObject("Excel.Application"); //创建AX对象excel var oWB oXL.Workbooks.Add(); //获取…

Top 15 不起眼却有大作用的 .NET功能集

目录1. ObsoleteAttribute2. 设置默认值属性&#xff1a; DefaultValueAttribute3. DebuggerBrowsableAttribute4. &#xff1f;&#xff1f;运算符5. Curry 及 Partial 方法6. WeakReference7. Lazy8. BigInteger9. 非官方关键字&#xff1a;__arglist __reftype __makeref __…

M2 芯片终于要来了?全线换新,性能远超M1 Max

‍‍不知不觉日历已翻至 2 月下旬&#xff0c;掐指一算&#xff0c;距离苹果一年一度春季新品发布会的召开似乎已越来越近。根据年初统计的 2022 年苹果新品预测&#xff0c;预计今年的苹果“小春晚”将在 Mac 方面有大动作。 那么&#xff0c;苹果将如何“动作”&#xff0c;又…

Python抓取新浪新闻数据(三)

非同步载入一般在XHR下查找&#xff0c;但是没有发现XHR下有相关内容。 转载于:https://blog.51cto.com/2290153/2126862

不畏浮云遮望眼--离散数学和组合数学

不畏浮云遮望眼&#xff0c;基础很重要&#xff01;离散数学是算法和数据结构的基础&#xff0c;而算法和数据结构又是什么的基础&#xff1f;不解释了。1.《离散数学及其应用》作者: (美)Kenneth H. R出版社: 机械工业出版社出版年: 2007-6页数: 804定价: 79.00元丛书: 计算机…

上班摸鱼,刚刚发现在 VScode 中可玩魂斗罗,超级玛丽

今天&#xff0c;再给大家介绍一款更加有意思的vscode插件——“小霸王”。 GitHub传送门&#xff1a;https://github.com/gamedilong/anes-repository 安装方式&#xff1a; 对于插件的安装,可以按照上图的操作流程。 1.打开VScode&#xff0c;然后点击拓展。 2.在输入框中&am…

JSP 三 :九大隐式对象

2019独角兽企业重金招聘Python工程师标准>>> ###细节 每个JSP页面在第一次被访问时&#xff0c;web容器都会把请求交给JSP引擎&#xff08;即一个Java程序&#xff09;去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet),然后按照servlet的调用方…

阿里90后工程师利用ARM硬件特性开启安卓8终端“上帝模式”

文/图 阿里安全潘多拉实验室 团控 编者按&#xff1a;团控&#xff0c;阿里安全潘多拉实验室研究人员&#xff0c;该实验室主要聚焦于移动安全领域&#xff0c;包括对iOS和Android系统安全的攻击和防御技术研究。团控的主攻方向为安卓系统级漏洞的攻防研究。在今年3月的BlackHa…

c语言模拟实现oc引用计数

#include<stdio.h> #include<stdlib.h> //在c中引入 引用计数机制 // 要解决的问题: 1,指向某块动态内存的指针有几个? // 应该让这块动态内存记录指针的数量 // 所以开辟的动态内存大小应该取多大&#xff1f; // …

ATT与Intel汇编语言的比较

转自 陈莉君 一书《深入分析Linux内核源码》 http://www.kerneltravel.net/kernel-book/第二章%20Linux运行的硬件基础/2.6.1.htm2.6.1 AT&T与Intel汇编语言的比较我们知道&#xff0c;Linux是Unix家族的一员&#xff0c;尽管Linux的历史不长&#xff0c;但与其相关的很多事…

最近,又发现了 Pandas 中三个好用的函数

作者 | luanhz来源 | 小数志导读近日&#xff0c;在github中查看一些他人提交的代码时&#xff0c;发现了Pandas中这三个函数&#xff0c;在特定场景中着实好用&#xff0c;遂成此文以作分享。程序的基本结构大体包含三种&#xff0c;即顺序结构、分支结构和循环结构&#xff0…

Java Web的Maven项目中Properties文件的使用(2)

为什么80%的码农都做不了架构师&#xff1f;>>> 背景 Java Web中常用一些Properties文件进行部署配置&#xff0c;其中如果在里面配置OS的路径&#xff0c;需要跨平台&#xff0c;主要就是考虑win系统的路径是“\”&#xff0c;而Linux的路径是“&#xff0f;”。 …

TCP/IP 计算机网络协议

2019独角兽企业重金招聘Python工程师标准>>> 应用层: (典型设备:应用程序&#xff0c;如FTP&#xff0c;SMTP &#xff0c;HTTP) DHCP(Dynamic Host Configuration Protocol)动态主机分配协议&#xff0c;使用 UDP 协议工作&#xff0c;主要有两个用途&#xff1a;给…

5分钟速通 AI 计算机视觉发展应用

作者 | 李秋键 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 计算机视觉是进步最大、发展最快的领域之一。根据 Global VIEW 的研究&#xff0c;全球计算机视觉市场规模在 2020 的价值为 113 亿 2000 万美元&#xff0c;预计从2021 到 2028 的复合年增长率为 7.3%…

javascript解析json

下载json库 http://www.json.org/json-zh.html自己找javascript的 或者直接去下面的 https://github.com/douglascrockford/JSON-jsphp生成json格式使用页面 <script src"scripts/json.js"></script>alert(data.toJSONString());如果返回false说明没数据…

高德联手凯迪拉克 发布全球首个高精地图应用

6月13日&#xff0c;在CES ASIA活动现场&#xff0c;上汽通用汽车凯迪拉克超级智能驾驶系统&#xff08;Super CruiseTM&#xff09;在国内首发亮相&#xff0c;未来将搭载在凯迪拉克CT6 40T铂金版车型上推向市场。高德地图作为上汽通用汽车在华合作伙伴&#xff0c;将为超级智…

WinDbg安装与使用

WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具&#xff0c;可以用于Kernel模式调试和用户模式调试&#xff0c;还可以调试Dump文件。 主页&#xff1a;http://msdn.microsoft.com/en-us/windows/hardware/gg463016 下载链接&#xff1a;http://msdl.microsoft…

mysql-5.6 升级 5.7

#准备工作 1、停机 [rootlocalhost local]# /etc/init.d/mysqld stop Shutting down MySQL.. [确定]2、切换版本 [rootlocalhost local]# mv /root/mysql-5.6.27-linux-glibc2.5-x86_64.tar.gz ./mysql-5.7 [rootlocalhost local]# ln -s…

让假图无所遁形,阿里篡改图像检测大赛集结号令打响

近年来&#xff0c;伴随多媒体技术的迅速发展&#xff0c;图像安全隐患随之而来。一些不法分子通过伪造或恶意篡改证件、政府文件、转账记录截图等方式&#xff0c;不仅进行诈骗活动&#xff0c;还带来一些社会问题&#xff1a;2 月 10 日&#xff0c;广西柳州融水苗族自治县赵…

Apache网页优化之网页压缩

Apache网页压缩技术 实验介绍&#xff1a;本实验在虚拟机的Linux系统上搭建http-2.4.2,并在配置过程中开启mod_deflate模块&#xff0c;实现网页的压缩功能&#xff0c;最终通过fiddler抓包工具&#xff0c;验证mod_deflate压缩是否生效。 1、首先将搭建httpd服务所需要的软件包…

推荐阅读的多核编程技术书籍

多核编程技术好书推荐 多核程序设计技术——通过软件多线程提升性能 , 作 者&#xff1a; &#xff08;孟加拉&#xff09;阿克特&#xff08;Akhter&#xff0c;S.&#xff09;&#xff0c;&#xff08;美&#xff09;罗伯茨&#xff08;Roberts&#xff0c;J.&#xff09; 著…

zabbix监控windows(03,08)

监控windows主机&#xff1a;下载zabbix_agents_2.2.3.win.zip &#xff08;zabbix官网下载&#xff09;解压文件&#xff0c;把对应的文件&#xff08;32位或者64位&#xff09;考到C盘根目录(对应目录就OK)并带配置文件&#xff1b;编辑配置文件:zabbix_agentd.win.confLogFi…

Dubbo原理何源码解析之服务暴露

2019独角兽企业重金招聘Python工程师标准>>> 一、框架设计 在官方《Dubbo 用户指南》架构部分&#xff0c;给出了服务调用的整体架构和流程&#xff1a; 另外&#xff0c;在官方《Dubbo 开发指南》框架设计部分&#xff0c;给出了整体设计&#xff1a; 以及暴露服务…

维基百科上的算法和数据结构链接很强大

突然发现维基百科上的算法和数据结构比百度百科强多啦&#xff0c;图文并茂。 其实这个网站不错&#xff1a;http://www.sorting-algorithms.com 冒泡排序&#xff1a; bubble冒泡的意思http://zh.wikipedia.org/wiki/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F-------------------…

基于 OpenCV 的图像阴影去除

作者 | 努比来源 | 小白学视觉我们经常需要通过扫描将纸上的全部内容转换为图像。有很多在线工具可以提高图像的亮度&#xff0c;或者消除图像中的阴影。但是我们可以手动删除阴影吗&#xff1f;当然可以&#xff0c;我们只需要将图像加载到相应的代码中&#xff0c;无需任何应…

not exists 跟not in 纪念一下

转载于:https://www.cnblogs.com/zzzzw/p/4973378.html

jquery $.proxy使用 Jquery实现ready()的源码

jquery $.proxy使用 在某些情况下&#xff0c;我们调用Javascript函数时候&#xff0c;this指针并不一定是我们所期望的那个。例如&#xff1a; 1 //正常的this使用2 $(#myElement).click(function() {3 4 // 这个this是我们所期望的&#xff0c;当前元素的this.5 6 $(…

PHP session回收机制

由于PHP的工作机制&#xff0c;它并没有一个daemon线程&#xff0c;来定时地扫描session信息并判断其是否失效。当一个有效请求发生时&#xff0c;PHP会根据全局变量 session.gc_probability/session.gc_divisor&#xff08;同样可以通过php.ini或者ini_set()函数来修改&#x…

WPF学习拾遗(二)TextBlock换行

原文:WPF学习拾遗&#xff08;二&#xff09;TextBlock换行下午在帮组里的同事解决一个小问题&#xff0c;为了以后方便&#xff0c;把就把它收集一下吧。 新建一个TextBlock作为最基础的一个控件&#xff0c;他所携带的功能相对于其他的控件要来的比较少&#xff0c; 比较值得…

Meta 开发 AI 语音助手,用于创建虚拟世界和实时翻译

编译 | 禾木木 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; Meta 在近日的「用人工智能构建元宇宙」的讨论会上&#xff0c;展示了最新的 AI 黑科技 「Builder Bot」 &#xff0c;并且在此次会议上 Meta 公布了关于构建元宇宙的人工智能计划&#xff0c;其中包括…