经典溢出案例
void testFunc(char* buf){ char buffer[200]; strcpy(buffer,buf); count<<buffer<<endl; } // 之所以存在栈溢出,,主要是由于这里的buf参数m并没有进行相关校验控制 // 如果buf大小超过局部变量buffer大小则会导致调用strcpy的时候产生栈溢出
这种可能存在溢出风险的危险函数在当下的编译器中会产生编号为4996的警告(Warning)。
专业汉语词典知识平台,分享汉字词语知识、历史文学知识解答!
栈溢出怎么解决,栈溢出详解
在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等等。
本文地址:百科问答频道 https://www.neebe.cn/wenda/933478.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!
现在有很多人在使用iPhone手机,有些新用户不知道怎么设置自动锁定时间,接下来小编就给大家介绍一下具体的操作步骤。具体如下:1.首先第一步根据下图箭头所指,找到并点击【设置】图标。2.第二步进入【设置】页面后,根据下图箭头所指,点击【...
我们在使用QQ的时候,开通了钱包功能,后来不用了,出于安全考虑,想要注销,该怎么操作呢?今天就跟大家介绍一下QQ钱包怎么注销的具体操作步骤。1解锁手机后,找到桌面上的QQAPP,打开。2.进入主页面后,点击左上角的个人头像。3.在打开...
小伙伴们经常会遇到这种情况,有时候需要将电脑上的文件传输到手机上,可是身边又没有数据线,我们会通过电脑上的QQ往手机QQ发送文件,这样不仅省去了数据线的麻烦同时传输速度也很快,可是我们怎么找到接收到的文件呢?QQfile_recv文件夹又在...
appleid是我们在苹果手机中很重要的一个账号,有的时候我们可能会忘记appleid的密码,那么接下来小编就教大家怎样在电脑上重新设置appleid的密码。具体如下:1.首先我们打开电脑进入到桌面,找到浏览器图标点击打开。进入到浏览器界面...
想要对电脑上iTunes的备份位置进行修改,该怎么操作呢?今天就跟大家介绍一下怎么修改itunes的备份路径的具体操作步骤。1.首先打开电脑,进入桌面,点击左下角的开始图标,在打开的菜单中,找到计算机选项,点击2.在打开的计算机页面,找...
umd是一种文档格式,小说也有这个格式的,很多电子书被做成UMD格式,供用户在手机上用掌上书院阅读。。目前UMD格式是流行最广,被用户普遍接受并喜爱的手机电子书格式。很多网站、论坛,为满足用户对手机电子书的需求,都自发制作UMD格式的电子书...
想知道怎么用iPhone抠图吗?小编教你怎么做。操作方法01首先小编需要说明的是,iPhone自身并不带有抠图功能,所以需要下载一个抠图软件才可以,接下来小编教你具体步骤吧。0...
COM口即串行通讯端口,通常位于电脑主机机箱的后面,端口形状为梯形,主要用于连接一些外置的数据通讯设备,例如交换机等,那么如何设置电脑的COM口呢?下面小编就来给大家讲解一下。操作方法01首先,打开控...
浏览:3221次
中超赛程表,看球购票攻略(跟随绿茵场之旅)浏览:7683次
春节习俗大全,传统文化策源地(领略浓郁年味)浏览:7374次
“水”字旁常用字,快速记忆方法(提高汉字识别...浏览:5376次
制作铃声详解,打造个性化手机(表现自我风格)浏览:3857次
拉杆箱材质选择,如何购物省心(为旅途做好准备...浏览:3313次
粤语歌排行榜,推荐经典音乐(品味不一样的文化...浏览:674次
考试紧张怎么办,有效缓解压力(化解心理疲劳)浏览:2327次
服装收纳技巧,衣服的正确叠法(让衣柜更整洁)浏览:6983次