• 栈溢出漏洞


    前言

    本文利用栈溢出漏洞弹出一个警告窗口。

    我们假设用户正在运行以下代码:

    #include <stdio.h>
    #include <string.h>
    
    
    char Paswword[20]="aaaaaaaaaaaaaaaaaaa";
    
    
    int main(){
    	
    	char cPas[20]={0};
    
    	int iResult;
    	
    	FILE * pFile =NULL;
    	
    	pFile = fopen("pd.txt","r");
    	
    	fscanf(pFile,"%s",cPas);
    
    	iResult =strcmp(Paswword,cPas);
    	
    	if(iResult==0){
    		printf("Welcome \r\n");
    	}else{
    		printf("fail \r\n");
    	}
    	getchar();
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    就是一段读取文件后判断内容是否和预期相等。

    这段代码代码在不开启任何系统保护时会利用fscanf进行栈溢出。
    fscanf会一直读取字符串直到碰到特殊字符为止,而cPas又是在栈上的,假设我们有如下骚操作:
    恶意程序伪装为pd.txt,并且大小大于20字节。那么将会覆盖原始的栈上存储的返回地址。

    在这里插入图片描述
    在这里插入图片描述
    是一个很特殊的地址7ffa4512,大多数用户电脑这个内存地址都是一个特殊的指令jmp esp.我们把这个地址称为通用跳板地址,当然你可以找到其他类似地址。
    在这里插入图片描述
    也就是函数返回时会执行 jmp esp,转而跳转到我们栈溢出的代码。
    我们绘制一个流程如下:
    在这里插入图片描述
    当你写了一伪装的pd.txt伪装文件后你会发现你的.恶意代码太长了,原始程序预留空间不足。
    在这里插入图片描述

    于是乎我们会在此利用fscanf漏洞,但在利用前首先抬起栈保证足够的存储空间放入恶意代码。

    fscanf 会截断特殊字符,所以你的恶意代码可能会被截断,因此我们需要对恶意代码出现截断字符进行转义,我们采取异或方式进行处理。

    鄙人写了一个小程序方便快速转义,可以通过下文链接下载。
    在这里插入图片描述

    我们从头整理我们需要做的事情:

    1. 伪装"pd.txt"
    2. “pd.txt” 内部进行栈溢出
    3. “pd.txt” 再次利用scanf 进行栈溢出加载恶意程序
    4. 异或返回恶意程序源代码
    5. 运行异或代码

    保护

    下面两个安全开关都会校验内存区域的可执行权限。一般情况下不可执行区域的权限不会严格检验。

    1. 开启电脑DEP

    2. PE中开启部分特性
      在这里插入图片描述

    跳板地址改为修改权限即可绕过这类保护

    1. 编译器开启GS选项

    GS 安全选项

    在这里插入图片描述
    开了这个选项后,编译时会在函数EBP之前插入一个探测数据。如下图所示
    在这里插入图片描述
    在函数进入后 会放一个变量到栈区中,在函数返回前插入一段代码检测这个变量是否改变。

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    工具

    我们编写shellcode时可以利用已有的工具帮助我们快速生产符合预期的代码,比如过滤掉特殊敏感字符。如注明的MSF程序.
    比如下面的命令會生成一個代碼無關的messagebox汇编代码

    msfvenom -p windows/messagebox -e x86/shikata_ga_nai -f raw -o shellcode0
    
    • 1

    源码

    https://github.com/fanmingyi/studystackoverflow01

  • 相关阅读:
    记录一次Mongotemplate的And和Or的各种套
    P1080 [NOIP2012 提高组] 国王游戏
    C#作为GUI开发工具,C++作为业务核心模块的实现方式记录
    Python里的f-string中的补齐
    c++学习从小白到高级工程师实战01:c++的基础入门
    图文解析 Nacos 配置中心的实现
    java线上CPU、内存打满处理
    使用正则表达式在中英文之间添加空格
    ROS 多机器人导航RVIZ环境的配置
    Spring Authorization Server 0.2.3发布,放出联合身份DEMO
  • 原文地址:https://blog.csdn.net/qfanmingyiq/article/details/125465272