经典溢出案例
void testFunc(char* buf){ char buffer[200]; strcpy(buffer,buf); count<<buffer<<endl; } // 之所以存在栈溢出,,主要是由于这里的buf参数m并没有进行相关校验控制 // 如果buf大小超过局部变量buffer大小则会导致调用strcpy的时候产生栈溢出
这种可能存在溢出风险的危险函数在当下的编译器中会产生编号为4996的警告(Warning)。
专业IT网络知识平台,分享IT百科知识、生活百科知识解答!
栈溢出怎么解决,栈溢出详解

在DEBUG程序中ebp会入栈,非调试版本ebp是可以优化掉的。我们的栈溢出主要是就是产生在函数堆栈中的局部变量区,例如我们在局部变量区定义了一个Buffer,我们在向这个Buffer拷贝数据的时候,如果拷贝的数据超过了Buffer的容量就会导致往下溢出(溢出到其他高地址上),之所以往下溢出写到高地址上是由于内存的增长方向是从低地址到高地址,而栈的增长方向确实高地址向地址增长,这也就是导致如果产生溢出会覆盖掉栈上高地址部分内容,而一个函数的高地址部分往往存放的就是ebp、返回地址,这也就导致返回地址可能被修改,这也就说明如果存在溢出,我们可以通过精心计算与设计准确的控制返回地址,也就相当于劫持了程序的执行流程。
经典溢出案例
void testFunc(char* buf){ char buffer[200]; strcpy(buffer,buf); count<<buffer<<endl; } // 之所以存在栈溢出,,主要是由于这里的buf参数m并没有进行相关校验控制 // 如果buf大小超过局部变量buffer大小则会导致调用strcpy的时候产生栈溢出
这种可能存在溢出风险的危险函数在当下的编译器中会产生编号为4996的警告(Warning)。
针对这种程序,我们可以通过IDA逆向分析或者通过cyclic这种工具生成大量的数据去触发程序崩溃并定位崩溃点计算多少个字节导致程序崩溃的并进行shellcode的构造,例如上图这个程序我们只需要输入208个字节即可将返回地址覆盖掉,这208个字节是:200字节msg+4字节ebp+4字节返回地址,可以确定覆盖到204字节的时候就是返回地址部分了,这个时候我们可以将返回地址这部分填写为我们的恶意函数的地址,这样该函数调用完毕后从栈上拿到返回地址跳转回去的时候就会去执行我们的恶意函数,这也就导致程序的执行流程被劫持控制。
栈溢出手段
第1种覆盖(下图左边部分)
硬编码shellcode地址,重启程序,可能会变,其实就是将Shellcode放在这个函数中缓冲区部分(局部变量区)中,然后将返回地址直接指向这个局部变量区,就可以导致程序跳转指向Shellcode。
缺点:Shellcode地址写死了,程序每次重启地址可能发生变化,所以可能导致Shellcode执行失败情况。
第2种覆盖(下图中间部分)
容易破坏上层栈的数据,通修改返回地址为程序中找到的jmp esp这种指令(gadget)跳转到我们的Shellcode上执行,至于Shellcode则只需要存放在返回地址后面这块内存空间上即可(也就是调用该函数传递的参数部分),因为执行完毕返回地址这条指令时候esp已经发生了变化,移动到了返回地址+4的地方,也就是参数部分。
函数执行完毕执行到ret的时候的操作是:
pop eip; // esp+4jmp eip;
如果我们把返回地址修改为了jmp esp指令地址,则是
pop jmp指令; // esp+4jmp jmp指令;jmp esp;
缺点:会破坏栈,更严重可能导致该函数的调用者栈空间被破坏(因为这一小部分空间有限)。
第3种方法(下图右边部分)
这种攻击方法较好利用了自己栈空间,是前面第二种方法的改良版,我们先在局部变量区写上Shellcode,然后在溢出点覆盖返回地址为jmp esp指令这种gadget,在返回地址后面写上jmp esp-0XXX指令,至于后面这个减去的值则需要我们自己计算,计算方法:shellcode
首地址-返回地址处地址+8(返回地址+当前jmp指令),这样,我们就可以通过这种相对偏移手法实现准确定位到Shellcode上面。

上述方法来自于0day安全_软件漏洞分析技术(第二版)。
在当下常规的手法:ret2text、retshellcode、ret2libc、stack pivoting、ret2csu、ret2syscall等等。
本文地址:IT百科频道 https://www.hkm168.com/tags/933478.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!
相关阅读
多图片排版,是Word编辑文档时常见场景之一,几乎每个人都会碰到,对很多人来说仍然是一大难题。当图片数量一多,很多人都不知道图片该怎么摆放,如何快速高效地搞定一组图片?因为没有掌握系统的套路技巧,每次制作都花费大量时间,做不出满意的效果。今...
ppt插入自定义动作按钮: 打开幻灯片文件,然后在菜单栏中点击插入,打开插入工具栏,之后在插入工具栏中选择形状工具,如下图所示:点击形状工具后,就打开所有预置的形状列表,如下图所示,选择我们需要的形状。选择好形状后,自动退回到ppt文件编辑...
主板显卡卡扣断了可以尝试使用胶带或胶水将其固定、更换显卡插槽、更换主板或者寻求专业人员的帮助。详细介绍:1、使用胶带或胶水将其固定,使用胶带或胶水时要小心,以免粘到其他部件上;2、更换显卡插槽,建议找专业的电脑维修人员来进行操作;3、更换主...
区分方法:1、a类ip地址,第一段号码为网络号码,剩下的三段号码为本地计算机的号码;2、b类ip地址,前两段号码为网络号码;3、c类ip地址,前三段号码为网络号码,剩下的一段号码为本地计算机的号码。本教程操作环境:windows7系统、De...
创建jsp文件的步骤:1、安装和配置java开发环境;2、安装和配置web服务器;3、创建jsp文件;4、编写jsp代码;5、部署和运行应用程序;6、调试和测试。详细介绍:1、安装和配置java开发环境,首先需要在计算机上安装jdk,可以从...
win7客户在系统更新的过程中遇到了80072efe的报错,像这种状况要怎么办呢?你先清查网络问题,然后去微软官网下载代理,假如你用的是32位计算机就免费下载32位代理,安装下载完成后马上重启。假如再次出现升级不正确得话,你也就再去官方网站...
git合并分支代码的方法:1、使用“gitmerge”命令,该命令用来做分支合并,可以将其他分支中的内容合并到当前分支中。2、使用“gitrebase”命令,该命令用于改变当前的分支的基点,进而实现分支合并。本教程操作环境:Window...
作为原型和原型链的基础,先了解清楚构造函数以及它的执行过程才能更好地帮助我们学习原型和原型链的知识。本篇文章带大家详细了解一下javascript中的构造函数,介绍一下怎么利用构造函数创建一个js对象,希望对大家有所帮助!一个普通的函数被用...
c语言的输入函数有哪些...浏览:766次
奇异值分解(SVD)简介及其在图片压缩中的示...浏览:1927次
用U盘轻松实现一键重装系统的小白装机教程浏览:5545次
因特网能提供的最基本服务有哪些浏览:4453次
某台微机安装的是64位操作系统中,64位指的...浏览:9933次
总结CreateJS的详细介绍浏览:4816次
ppt中怎么插入自定义动作按钮浏览:9735次
c语言是什么意思浏览:1576次
主板显卡卡扣断了怎么办浏览:301次