关于缓冲区溢出的对策

article/2025/9/17 5:19:50

从编译器的角度出发

以下两种方法均是编译器采取的关于缓冲区溢出的对策

Stackshield

主要思想是在函数调用之前,将return address的副本保存在一个安全的地方,函数返回时将返回地址与预先保存的返回地址比较,以判断缓冲区溢出是否发生。

StackGuard

gcc编译器采取的策略,类似的windows安全机制是GS,在返回地址和缓冲区之间添加一段guard区,该guard区中可以由编译器存放一些不可预测的值,利用该guard区的值是否被篡改,若被篡改了,则可推断返回地址被修改,即可判断缓冲区溢出发生。在gcc编译器中,可以使用 -fno-stack-protector 来关闭SyackGuard。

在这里插入图片描述

利用如下代码探究StackGuard机制:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>void copy(char *str)
{char buffer[12];strcpy(buffer,str);
}
int main(int argc,char *argv[])
{copy(argv[1]);printf("Return Properly\n");return 1;
}

针对以上代码,在默认条件下编译以后(StackGuard机制开启),输入小于12字节参数时程序正常,当输入大于12字节,由于StackGuad机制,发现缓冲区溢出重现,故程序崩溃。
在这里插入图片描述
查看汇编代码,可以看到如下

	.file	"stackGuardTest.c".text.globl	copy.type	copy, @function
copy:
.LFB5:.cfi_startprocpushq	%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq	%rsp, %rbp.cfi_def_cfa_register 6subq	$48, %rspmovq	%rdi, -40(%rbp)movq	%fs:40, %raxmovq	%rax, -8(%rbp)xorl	%eax, %eaxmovq	-40(%rbp), %rdxleaq	-20(%rbp), %raxmovq	%rdx, %rsimovq	%rax, %rdicall	strcpy@PLTnopmovq	-8(%rbp), %raxxorq	%fs:40, %raxje	.L2call	__stack_chk_fail@PLT
.L2:leave.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE5:.size	copy, .-copy.section	.rodata
.LC0:.string	"Return Properly".text

可以看到这样一段代码,它的作用是从fs寄存器指向的内存的偏移为40的地方取8字节数组到rax寄存器中(可见guard值存储在gs:40处),并且将其存放在rbp-8处,故可以看出guard在当前gcc版本中起始地址位rbp-8.(不同版本的gcc可能不一样,我的是gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)

movq %fs:40, %rax
movq %rax, -8(%rbp)
xorl %eax, %eax

同时查看如下汇编代码,可以看到在函数返回时,从rbp-8处取出值存放在rax寄存器中,并且将该值与fs:20处的值比较,若相同则正常返回,若不同则调用__stack_chk_fail@PLT。这边是stackguard的实现。

     movq -8(%rbp), %rax
     xorq %fs:40, %rax
     je .L2
     call __stack_chk_fail@PLT
.L2:
     leave
     .cfi_def_cfa 7, 8
     ret

GS

参考论文:https://blog.csdn.net/m0_37809075/article/details/82973151

从操作系统角度

SEHOP

SEHOP(strutured exception handler overwrite protection,SEH覆盖保护),作为对SEH机制的补充,SEHOP将SEH的保护提升到系统级别。

ASLR

Address Space Layout Randomization,即地址空间布局随机化,基本思想是将stack的起始位置随机化,使得一段代码在执行时,其变量的逻辑地址不再固定,这样攻击者便很难准确猜测其嵌入的shellcode的逻辑地址。
在linux上,可以通过如下命令设置ASLR,

sudo sysctl -w kernel.randomize_va_space=(数值)

数值部分可以为0、1、2
(1)数值部分为0:关闭ASLR
(2)数值部分为1:只为栈开启ASLR
(3)数值部分为2:为栈和堆均开启ASLR

NX

DEP(Data Execution Protection)中的一种,NX即No-eXecute,是CPU采取的一项区分代码和数据的技术,操作系统可以标记特定的内存区域,使该区域不可执行,则处理器不会执行该区域内的然和代码。在gcc中,可以使用noexecstack选项开启NX,execstack关闭NX。


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

相关文章

浅析缓冲区溢出

最近一直在学习缓冲区溢出漏洞的攻击&#xff0c;但是关于这一块的内容还是需要很多相关知识的基础&#xff0c;例如编程语言及反汇编工具使用。所以研究透彻还需要不少的时间&#xff0c;这里简单的做一个学习的总结&#xff0c;通过具体的实验案例对缓冲区溢出进行简要的解析…

缓冲区溢出原理详解

下面将有实例引入缓冲区溢出的介绍&#xff1a; void main() { int i0; int a[]{1,2,3,4,5,6,7,8,9,10}; for(i0;i<10;i) { a[i]0;printf("Hello World!\n");} } 首先&#xff0c;这段代码会出现死循环&#xff0c;为什么&#xff1f;因为数组溢出了&…

C语言 缓存区溢出 3221225725

目录 问题描述解决办法&#xff1a; 问题描述 DEV-C报错 Process exited after 4.03 seconds with return value 3221225725 原因 数组定义的容量太大 - 五十万起步的样子 而且每次循环都会再定义一次&#xff0c;导致缓存区溢出 解决办法&#xff1a; 思路来源&#xff1a…

什么是缓冲区溢出?有什么危害?原因是什么?

缓冲区溢出是指当计算机向缓冲区填充数据时超出了缓冲区本身的容量&#xff0c;溢出的数据覆盖在合法数据上。 危害有以下两点&#xff1a; 1、程序崩溃&#xff0c;导致拒绝服务 2、跳转并且执行一段恶意代码 原因&#xff1a;造成缓冲区溢出的主要原因是程序中没有仔细检查用…

什么是缓冲区溢出?有说明危害?

缓存溢出 缓存溢出(Buffer overflow) &#xff0c;是指在存在缓存溢出安全漏洞的计算机中&#xff0c;攻击者可以用超出常规长度的字符数来填满-一个域&#xff0c;通常是内存区地址。在某些情况下&#xff0c;这些过量的字符能够作为“可执行”代码来运行。从而使得攻击者可以…

缓存区溢出的原理分析和防范

1.前言 缓冲区溢出(buffer-overflow)是一种非常普遍、同时非常危险的漏洞&#xff0c;在各种操作系统、应用软件中广泛存在。缓冲区溢出攻击是利用缓冲区溢出漏洞所进行的攻击&#xff0c;轻则可以导致程序失败、系统关机等&#xff0c;重则可以利用它执行非授权指令&#xff0…

缓存溢出

缓存溢出&#xff08;Buffer overflow&#xff09;&#xff0c;是指在存在缓存溢出安全漏洞的计算机中&#xff0c;攻击者可以用超出常规长度的字符数来填满一个域&#xff0c;通常是内存区地址。在某些情况下&#xff0c;这些过量的字符能够作为“可执行”代码来运行。从而使得…

逆向基础:软件手动脱壳技术入门

前言&#xff1a; 大家好&#xff0c;我是周杰伦 这里整合了一下之前自己学习软件手工脱壳的一些笔记和脱文&#xff0c;希望能给新学软件逆向和脱壳的童鞋们一点帮助。 1 一些概念 1.1 加壳 加壳的全称应该是可执行程序资源压缩&#xff0c;是保护文件的常用手段。加壳过…

iOS逆向之脱壳工具creakerXI+,最简单、最适合新手的脱壳工具

在学习iOS逆向中&#xff0c;脱壳是必备技能之一&#xff0c;在网上看教程有使用 Clutch 和 dumpdecrypted 但是&#xff0c;不知道 是我操作问题&#xff0c;还是手机版本&#xff0c;以及APP版本更新问题 尝试了几次&#xff0c;都无法成功脱壳 最后在网上看到有大神分享其…

【How2RE】 UPX壳及脱壳方式

0x00 什么是壳 壳是另外在PE文件中包含的代码&#xff0c;并且不影响PE文件正常的执行。而壳也分为很多种&#xff0c;这里从UPX壳开始介绍。 0x01 压缩壳 压缩的分类 压缩的目的就是将体积大的可执行文件缩小的过程。分为损失压缩和非损失压缩两种。损失压缩是指不能100%还…

脱壳(中) 脱壳的方法

那些年我们一起脱过的衣裳&#xff0d;脱壳(中) 珈蓝夜宇 2015/10/29 10:42 0x01 我能在万花从中脱去壳的衣裳!&#xff08;续&#xff09; 3.3ESP定律法 3.3.1ESP定律介绍 ESP定律法是脱壳的利器&#xff0c;是国外友人发现的。有了ESP定律&#xff0c;可以方便我们脱掉大多…

脱壳简单总结

title: 脱壳 date: 2021-07-05 14:37:06 tags: RE 脱壳 1.概述&#xff1a; 1.壳&#xff1a; 一&#xff1a;加壳的目的&#xff1a;为了隐藏程序真正的OEP&#xff08;入口点&#xff09;&#xff0c;防止被破解。 二&#xff1a;加壳软件是一种在编译好可执行文件之后&…

最新乐加固脱壳详细教程(有图有真相)

一、前言声明&#xff1a; 本次破解是基于Xposed Installer框架&#xff0c;具体使用方法请上网查询。假设你已经安装好框架&#xff0c;按照下面的步骤&#xff0c;实现乐加固加固脱壳修复DEX&#xff0c;并且重打包运行。本次选择脱壳的APP是小猿搜题&#xff0c;特此声明&a…

脱壳之简单加密壳

一、简单分析与解密 脱壳最重要的三步&#xff1a;找原始OEP&#xff0c;转存文件&#xff0c;修复文件   压缩壳按照这三步就可以完成脱壳&#xff0c;而加密壳因为对PE文件的信息进行了加密处理&#xff0c;找到OEP只是刚开始&#xff0c;还需要将加密之后的代码、数据进行…

iOS完美脱壳

iOS端IPA脱壳 背景&#xff1a;在软件安全领域中&#xff0c;我们与黑产做对抗时&#xff0c;不是被动防守&#xff0c;自己也可以做攻击方&#xff0c;来验证我方软件是否安全。 关于iOS端逆向分析如&#xff1a;虚拟定位、虚拟设备、修改内存等&#xff0c;始终离不开脱壳。…

脱壳工具:Youpk的使用详解

一. Youpk概述 Youpk基于ART的主动调用的脱壳机&#xff0c;主要针对dex整体加固和各式各样的dex抽取加固。 目前 Youpk 只支持 pixel 1代。所以必须需要 pixel 1代手机&#xff0c;而且需要刷入对应的系统。 Youpk可以处理大部分的加固&#xff0c;一些企业版的加固也能处理…

使用upx脱壳工具脱壳

使用upx脱壳工具脱壳&#xff08;攻防世界新手第七题为例simple-unpack&#xff09; 查壳工具链接&#xff1a;https://www.52pojie.cn/thread-437586-1-1.html 脱壳工具链接&#xff1a;https://github.com/upx/upx/releases 先查壳 一般做到逆向的部分题的时候&#xff0c…

脱壳工具:反射大师的使用详解

一. 反射大师概述 一个脱壳插件工具&#xff0c;需要在 Xposed 环境中使用&#xff0c;支持市面上大多数加密壳。 反射大师简单容易使用&#xff0c;能脱掉大多数壳&#xff0c;很值得使用 二. 下载Xposed和反射大师 Xposed &#xff0c;一款可以在不修改 Android APK 的情…

逆向工具之脱壳神器反射大师(附脱壳环境搭建、脱壳实战)

相信点击进入这篇博客的小伙伴都知道并且搞过App逆向&#xff0c;不过有时候会遇到各种加壳的App&#xff0c;不让你反编译。但是道高一尺&#xff0c;魔高一丈&#xff0c;有正向加密&#xff0c;就有逆向解密。此篇博客博主带大家搭建脱壳环境&#xff0c;并且手动脱一个加了…

手动脱壳教程

一、什么是壳&#xff1f; 壳是指在一个程序的外面再包裹上另一段代码&#xff0c;保护里面的代码不被非法修改或反编译的的程序。它们一般先于程序运行&#xff0c;拿到控制权&#xff0c;然后完成它们保护软件的任务。 二、壳的加载过程 1、保存程序入口参数 …