您当前的位置:首页 > 电脑百科 > 安全防护 > 服务器/网站

栈溢出漏洞原理详解与利用

时间:2020-04-10 11:10:16  来源:  作者:

作者: threepwn 合天智汇

0x01 前言

和我一样,有一些计算机专业的同学可能一直都在不停地码代码,却很少关注程序是怎么执行的,也不会考虑到自己写的代码是否会存在栈溢出漏洞,借此机会我们一起走进栈溢出。

0x02 程序是怎么运行的

在了解栈溢出之前我们先了解一下程序执行过程

程序的执行过程可看作连续的函数调用。当一个函数执行完毕时,程序要回到call指令的下一条指令继续执行,函数调用过程通常使用堆栈实现

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
   test1(1);  
   test2(2);
   test3(3); 
   return 0;
}
int test1(int test1){
int a = 6;
  printf("1");
  return 1;
}
int test2(int test2){ 
  printf("2"); 
  return 2;
}
int test3(int test3){ 
  printf("3"); 
  return 3;
}

编译成32位可执行文件,放在ollydbg中就行调试,来详细看一下执行过程

因为程序的执行可以看做一个一个函数的执行(main函数也一样),因此我们挑选其中一个即可,在test1()函数设置断点

栈溢出漏洞原理详解与利用

 

F7单步调试第一步mov dword ptr ss:[esp],0x1,进行传参,简洁明了。

第二步call mian.00401559,进入test(),这里我们关注一下esp和栈顶值,将该指令的下一条指令的地址进行压栈,既然有压栈那么就会有出栈,这就与函数中的retn指令形成呼应。

栈溢出漏洞原理详解与利用

 

第三步push ebp,就是把ebp的值进行压栈,那么这个ebp是什么呢?有什么用呢?

EBP叫做扩展基址指针寄存器(extended base pointer) ,里面放一个指针,该指针指向系统栈最上面一个栈帧的底部,用于C运行库访问栈中的局部变量和参数。那么这一步的意义就是:保存旧栈帧中的帧基指针以便函数返回时恢复旧栈帧

栈溢出漏洞原理详解与利用

 

第四步,mov ebp,esp,将esp的值放在ebp中,我们再来了解一下什么是esp?

ESP(Extended Stack Pointer)为扩展栈指针寄存器,是指针寄存器的一种,用于存放函数栈顶指针,指向栈的栈顶(下一个压入栈的活动记录的顶部),也就是它不停在变,刚才提到的ebp指向栈底,在函数内部执行过程中是不变。

那么我们再看一下这一步的作用

从第三步可以知道esp存储的值是旧栈帧中的帧基指针,而esp值栈顶指针,随时都在变,因此为了函数结束后能恢复,把esp值(外层函数栈底地址)保存在本函数栈底ebp中。简而言之,将内部函数ebp的值作为地址,它存放外函数的ebp的值。这一步在末尾也存在逆向指令leave。

栈溢出漏洞原理详解与利用

 

第五步是sub esp,0x28,开辟该函数的局部变量空间

紧接着第六步mov dword ptr ss:[ebp-0xC],0x6,给变量a一个大小是0xC的空间,并且赋值。

然后就是传参字符1的ascii码,调用printf函数,把返回值放到eax。

我们重点来看leave指令,可以发现ebp的值恢复了,esp的值也变了,相当于mov esp,ebp;pop ebp

栈溢出漏洞原理详解与利用

 

最后执行retn指令,至此一个函数执行完毕,esp和eip的值都被改变,相当于pop eip,然后程序继续执行。EIP是指令寄存器,存放当前指令的下一条指令的地址。CPU该执行哪条指令就是通过EIP来指示的

栈溢出漏洞原理详解与利用

 

0x03 栈溢出

分析完这一过程,相信大家对函数是怎么执行的应该明朗了,那么我们言归正传,继续聊一下栈溢出。首先我们先看一下什么是栈?

栈可以看作是一个漏斗,栈底地址大,栈顶地址小,然后在一个存储单元中,按照由小到大进行存储,它的目的是赋予程序一个方便的途径来访问特定函数的局部数据,并从函数调用者那边传递信息。

栈溢出属于缓冲区溢出,指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致与其相邻的栈中的变量的值被改变。

另外,我们也不难发现,发生栈溢出的基本前提是:程序必须向栈上写入数据、写入的数据大小没有被良好地控制。引用一个例子来了解一下栈溢出

#include <stdio.h>
#include <string.h>
void success() { puts("You Hava already controlled it."); }
void vulnerable() {  
    char s[12];  
    gets(s); 
    puts(s); 
    return;
}
int main(int argc, char **argv) {
    vulnerable();
    return 0;
}

很显然符合以上两个条件,gets()成为突破口我们在主函数处下断点,运行和调试

栈溢出漏洞原理详解与利用

 

lea eax,dword ptr ss:[ebp-0x14] 这时开辟一个空间给变量,也即是s,如图所示

栈溢出漏洞原理详解与利用

 

我们想执行sucess()函数,要怎么办呢?

执行完vulnerable()函数后,会还原ebp,改变esp的值(leave),然后retn,也就是pop eip,然后CPU根据eip指针指向的指令继续运行。

我们能抓到的点就是控制eip,怎么控制?通过控制栈顶的值,那么栈顶的值是什么?栈顶的值是进入该函数时储存的下一条指令的地址。这里提一点,进入函数,要保存两个值:下一条命令的地址、EBP旧栈帧的帧基指针,只有这样才能完全恢复。

此时我们可以构造payload,来控制我们要控制的地方,栈中存储EBP值的存储单元的上一个存储单元,也就是图中的存储address的存储单元

我们先试验一下输入0x14 *'A'+BBBB+0000,发生的变化

栈溢出漏洞原理详解与利用

 

很好,按照我们的预想进行(Python -c 'print "A"* 0x18+p32(0x00401520)') 就可以达到栈溢出的效果

栈溢出漏洞原理详解与利用

 

0x04 尾记

还没有入门,只是个人的见解,如有错误,希望各位大佬指出。参考:
https://en.wikipedia.org/wiki/Stack_buffer_overflow
https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/stackoverflow-basic-zh/

高级栈溢出技术—ROP实战

http://hetianlab.com/expc.do?ce=a763263a-de03-4368-a917-76bfb39f8c96

(学习ROP概念及其思路,了解高级栈溢出时需要注意的事项,并掌握解决方法)

声明:笔者初衷用于分享与普及网络知识,若读者因此作出任何危害网络安全行为后果自负,与合天智汇及原作者无关!



Tags:栈溢出   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
和我一样,有一些计算机专业的同学可能一直都在不停地码代码,却很少关注程序是怎么执行的,也不会考虑到自己写的代码是否会存在栈溢出漏洞,借此机会我们一起走进栈溢出。...【详细内容】
2020-04-10  Tags: 栈溢出  点击:(69)  评论:(0)  加入收藏
原创:treebacker合天智汇原创投稿活动:http://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s/Nw2VDyvCpPt_GG5YKTQuUQ高级ROP-SROP利用在刷题时碰到这个考察点,有点震...【详细内容】
2019-10-10  Tags: 栈溢出  点击:(110)  评论:(0)  加入收藏
▌简易百科推荐
在最近的一波攻击中,黑客利用多个插件中未修补的漏洞攻击了 160 万个 WordPress 网站。 易受攻击的插件对 WordPress 网站产生了的巨大攻击数据。 Wordfence 最近发现 WordPr...【详细内容】
2021-12-16  蚁安    Tags:WordPress   点击:(9)  评论:(0)  加入收藏
事件起因从安全分析系统里面发现一条带有病毒的下载,然后针对这条记录展开了一系列的分析分析过程1.登录到被感染服务器,查看系统状况,hadoop 这个用户在 2020/6/18 20:32 从这...【详细内容】
2021-11-23  Z2990Lig    Tags:SSH   点击:(32)  评论:(0)  加入收藏
1、除了服务器需要用的一些正规软件,其它都不要安装。2、在用户中把administrator改名,这样做的目的是即使对方暴破了我们的密码用户名也不容易猜住,相当于又加了一道关卡。...【详细内容】
2021-11-01  IT小哥吧    Tags:服务器   点击:(37)  评论:(0)  加入收藏
账户安全(1)更名administrator本地用户并禁用guest账户步骤:点击“开始”,找到“管理工具”,点击里面的“计算机管理”,找到“本地用户和组” (2)设定账户锁定策略尝试5次失败...【详细内容】
2021-10-12  Kali与编程  今日头条  Tags:Windows主机   点击:(62)  评论:(0)  加入收藏
本文主要介绍以Microsoft的Windows Server 2019 ,版本:Datacenter(Domain Controller)安全加固保护.企业随着规模不断扩大,业务增多,信息安全建设是企业里一条只有重点没有终点...【详细内容】
2021-09-17  Vireshark    Tags:服务器安全   点击:(64)  评论:(0)  加入收藏
目录常见共享命令IPC$IPC$的利用条件1:开启了139、445端口2:目标主机开启了IPC$共享3:IPC连接报错IPC空连接空连接可以做什么?(毫无作用)IPC$非空连接IPC$非空连接可以做什么?di...【详细内容】
2021-09-16  网络说安全    Tags:系统安全   点击:(86)  评论:(0)  加入收藏
昨天一个老哥找到我,说他的服务器这几天一直被CC攻击,问我这边有没有什么解决的方法? 近年来,网络攻击事件越来越频繁,最常见的就是CC攻击和DDOS攻击,主要的区别就是针对的对象不...【详细内容】
2021-09-10  小蚁GDRAGON    Tags:cc攻击   点击:(58)  评论:(0)  加入收藏
网站页面上的登录操作,通常都是输入帐号密码,传输至网站后台验证。在网站页面、数据传输中,通过技术手段,都可以得到用户输入的信息,并可以修改,从而发起网络攻击。典型的如:使用自...【详细内容】
2021-08-30  修丹道的程序猿    Tags:登录方式   点击:(62)  评论:(0)  加入收藏
网络安全研究人员披露了一类影响主要 DNS 即服务 (DNSaaS) 提供商的新漏洞,这些漏洞可能允许攻击者从企业网络中窃取敏感信息。基础设施安全公司 Wiz 的研究人员 Shir Tamar...【详细内容】
2021-08-12  零日时代    Tags:漏洞   点击:(66)  评论:(0)  加入收藏
001暴力破解1. 指定用户名爆破密码传统型爆破思路,用户名可以通过猜测或者信息收集获得。猜测:admin、网站域名等信息收集:新闻发布人、whoami等2. 指定密码爆破用户名如果是后...【详细内容】
2021-07-23  KaliMa  今日头条  Tags:登陆框   点击:(85)  评论:(0)  加入收藏
相关文章
最新更新
栏目热门
栏目头条