保护机制

0x01 概述

操作系统提供了许多安全机制来尝试降低或阻止缓冲区溢出攻击带来的安全风险,包括DEP、ASLR等。在编写漏洞利用代码的时候,需要特别注意目标进程是否开启了DEP(Linux下对应NX)、ASLR(Linux下对应PIE)等机制,例如存在DEP(NX)的话就不能直接执行栈上的数据,存在ASLR的话各个系统调用的地址就是随机化的。下面是常见的linux保护机制

0x02 canary (栈保护)

栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行。当启用栈保护后,函数开始执行的时候会先往栈里插入cookie信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。在Linux中我们将cookie信息称为canary。因此在编译时可以控制是否开启栈保护以及程度,例如:

gcc -fno-stack-protector -o test test.c  //禁用栈保护
gcc -fstack-protector -o test test.c  //启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码
gcc -fstack-protector-all -o test test.c //启用堆栈保护,为所有函数插入保护代码

0x03 fortify

这个保护机制防止缓冲区溢出攻击。gcc生成了一些附加代码,通过对数组大小的判断替换strcpy, memcpy, memset等函数名,达到防止缓冲区溢出的作用。就是gcc自动对一些函数进行检查有没有缓冲区溢出

0x04 NX(DEP)

NX即No-eXecute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。
gcc编译器默认开启了NX选项,如果需要关闭NX选项,可以给gcc编译器添加-z execstack参数。例如:

gcc -z execstack -o test test.c

在Windows下,类似的概念为DEP(数据执行保护),好像在的Visual Studio 2008以后就默认开启了DEP编译选项。

0x05 PIE(ASLR)

一般情况下NX(Windows平台上称其为DEP)和地址空间分布随机化(ASLR)会同时工作。内存地址随机化机制(address space layout randomization),有以下三种情况:

  • 0 - 表示关闭进程地址空间随机化。
  • 1 - 表示将mmap的基址,stack和vdso页面随机化。
  • 2 - 表示在1的基础上增加栈(heap)的随机化。

可以防范基于Ret2libc方式的针对DEP的攻击。ASLR和DEP配合使用,能有效阻止攻击者在堆栈上运行恶意代码。
Built as PIE:位置独立的可执行区域(position-independent executables)。这样使得在利用缓冲溢出和移动操作系统中存在的其他内存崩溃缺陷时采用面向返回的编程(return-oriented programming)方法变得难得多。
liunx下关闭PIE的命令如下:

sudo -s echo 0 > /proc/sys/kernel/randomize_va_space

PIE有关的知识详情:https://blog.csdn.net/counsellor/article/details/81543197

0x06 relro

设置符号重定向表格为只读或在程序启动时就解析并绑定所有动态符号,从而减少对GOT(Global Offset Table)攻击。RELRO为” Partial RELRO”,说明我们对GOT表具有写权限。总之,需要执行

sudo -s echo 0 > /proc/sys/kernel/randomize_va_space//可选,如果要关闭系统的ALSR功能就执行这个

我们在打ctf时,可以使用下面的命令就行了

gcc -no-pie -fno-stack-protector -z execstack -m32 -o exp1 exp1.c
  • -op-pie:内存地址不随机化
  • -fno-stack-protector:不栈保护,没有canary
  • -z execstack :栈可执行,没有NX

0x07 objdump

objdump命令是用查看目标文件或者可执行的目标文件的构成的gcc工具。详情https://man.linuxde.net/objdump
-j name
–section=name 仅仅显示指定名称为name的section的信息
-t
–syms 显示文件的符号表入口。类似于nm -s提供的信息
objdump -t -j .text exp1//查看read程序的.text段有哪些函数

0x08 例子

首先我们准备一个C文件
在这里插入图片描述
使用gcc编译

gcc -m32 read.c -o exp1
  • -m32:使用32位编译
  • -o:后面就编译的名字
    在这里插入图片描述
    我们检查文件的保护机制
checksec exp1

在这里插入图片描述

将这些保护机制去掉:

gcc -no-pie -fno-stack-protector -z execstack -m32 -o exp1 read.c

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380202.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习降维算法一:PCA(主成分分析算法)

引言: 机器学习领域中所谓的降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中。降维的本质是学习一个映射函数 f : x->y,其中x是原始数据点的表达,目前最多使用向量表达形式。 y是数据点映射后的低维向…

VS 2005模板丢失找回的办法

安装其他插件的时候,常常模板丢失,比较郁闷,以前就用土办法,重装VS来解决这个问题,这次终于弄清楚怎么回事了,可以采取下面两个步骤解决1。复制ProjectTemplates和ItemTemplates,保证VS能找到相…

dbms数据库管理系统_基本数据库管理系统(DBMS)能力问题和解答

dbms数据库管理系统This section contains the aptitude questions and answers on basic concepts of DBMS. You will find aptitude questions on DDL, DCL, DML, DQL, TCL statements and other related topics. 本节包含有关DBMS基本概念的能力问题和解答。 您将找到有关DD…

面向对象(封装对象private关键字)

1.面向对象(封装的概述) A:封装概述 是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。B:封装好处 隐藏实现细节,提供公共的访问方式提高了代码的复用性提高安全性。C:封装原则 将不需要对外提供的内容都隐藏起来。把属性隐藏,提供公…

Codeforces Global Round 13 C

C. Pekora and Trampoline 题意:对于数组a,每次出发开始可以选择任意元素作为起始点,然后在数组上移动,落点为i a[i],直至超出数组范围,每次经过的点的值减一(先移动再减/直至减到1为止&#…

一个简单的pwn例子---read函数

内容&#xff1a; #include<stdio.h> void exploit() {system("/bin/sh"); } void func() {char str[0x20];read(0, str, 0x50); } int main() {func();return 0; }我们要做的是利用溢出执行exploit函数 分析&#xff1a; 先执行func函数&#xff0c;func函数…

重载运算符 减号_在C / C ++中使用减号(-)运算符将两个数字相加

重载运算符 减号Given two numbers, and the task is to find their addition using the minus (-) operator. 给定两个数字&#xff0c;任务是使用减(-)运算符查找它们的加法 。 As we have discusses in C/C arithmetic operators that plus () operator adds the numbers a…

【操作系统】互斥:软件解决方法

互斥&#xff1a;软件解决方法 算法一 算法思路 预留一个全局内存区域&#xff0c;并标记为turn。进程&#xff08;P0或P1&#xff09;想进入它的临界区执行时&#xff0c;要先检查turn的内容。若turn的值等于进程号&#xff0c;则该进程可以进入它的临界区&#xff1b;否则…

Oracle为即将发布的11g开发平台进行预演

Oracle为即将发布的11g开发平台进行预演 Oracle JDeveloper是一个免费的整合开发环境&#xff0c;它为模块化、开发、调试、优化、部署Java应用程序和Web服务提供了端到端&#xff08;end-to-end&#xff09;的支持。1&#xff09;完全支持J2EE5.0&#xff0c;带有EJB3.0&#…

面向对象 多态

面向对象 多态的概述及其代码的体现 A&#xff1a;多态(polymorphic)概述 事物存在的多种形态B&#xff1a;多态前提 要有继承关系要有方法重写要有弗雷引用指向子类对象。C&#xff1a;案例演示 代码体现多态 public class Dome1 { public static void main(String[] args…

Web开发入门

想要学习Web开发&#xff0c;我的建议是参照Web应用的发展历史学习。最早的时候&#xff0c;Web应用就是静态的Html页面&#xff0c;不能和用户交互&#xff0c;这是因为它最早是各高校用来分享论文的载体。后来&#xff0c;随着Internet的流行&#xff0c;Web应用的用户不再单…

算法和程序的区别

算法 计算机算法是以一步接一步的方式来详细描述计算机如何将输入转化为所要求的输出的过程&#xff0c;或者说&#xff0c;算法是对计算机上执行的计算过程的具体描述。 算法首先必须是正确的&#xff0c;即对于任意的一组输入&#xff0c;包括合理的输入与不合理的输入&…

【图论】(二分图)J. Burnished Security Updates - CodeForces

J. Burnished Security Updates 题意&#xff1a;对于所给的图&#xff08;不一定连通&#xff09;&#xff0c;选择一些点作为一个集合&#xff0c;满足每条边有且仅有一个端点为该集合的点&#xff0c;要求计算该集合大小的最小可能&#xff0c;若无法找到一个集合满足条件则…

万网与阿里巴巴业务关系图解

阿里巴巴在港上市公司今天发布公告称&#xff0c;计划分拆旗下中国万网赴美上市。那么万网与阿里巴巴其它业务是怎样个关系&#xff1f;且看我们分析。 随着传统企业大面积地转向互联网经营&#xff0c;用电子商务来服务客户&#xff0c;它们面临的第一个问题就是建站。针对这一…

c中将数组传递给子函数_在C ++中将对象传递给Non-Member函数

c中将数组传递给子函数Here, we have to define a Non-Member Function, in which we have to pass an Object to the class in C programming language. 在这里&#xff0c;我们必须定义一个非成员函数&#xff0c;其中必须将一个Object传递给C 编程语言的类。 What we are d…

大数问题(C++、Java)

有时候&#xff0c;当我们做题的时候会遇到很简答的代码题&#xff0c;例如AB&#xff0c;但是题是有前提的&#xff0c;就是两个数特别的大。妈耶~~~ 大家都知道&#xff0c;定义一个变量&#xff0c;系统会自动为该变量分配空间&#xff0c;例如&#xff1a;int类型在c中&am…

cobalt strick 4.0 系列教程(4)---监听器和基础设施管理

0x01 概述 任何行动的第一步都是建立基础设施。就 Cobalt Strike 而言&#xff0c;基础设施由一个或多个团队服务器、重定向器以及指向你的团队服务器和重定向器的 DNS 记录组成。一旦团队服务器启动并运行&#xff0c;你将需要连接到它并将其配置为接收来自受害系统的连接。监…

【竞赛题解】Codeforces Round #710 (Div. 3)

B. Partial Replacement 题意&#xff1a;有字符串由.和*组成&#xff0c;可标记其中*&#xff0c;首尾的*必须被标记&#xff0c;使被标记的*之间距离不超过k&#xff0c;求最少的标记量 思路&#xff1a;首先从首尾出发确定首尾*的位置&#xff0c;再由首beg出发向后的k个元…

Oracle数据库存储过程 ,去除给定字符串中重复的字符串

以下函数是本人在编写Oracle数据库存储过程时写的函数,觉得该函数通用性较强,因此发表出来供需要的人参考.这个函数的功能主要是用于去除给定字符串中重复的字符串.在使用中需要指定字符串的分隔符.示例:str : MyReplace(13,14,13,444, ,);输出:13,14,444create or replace fun…

基于RBAC模型的通用企业权限管理系统

1. 为什么我们需要基于RBAC模型的通用企业权限管理系统 管理信息系统是一个复杂的人机交互系统&#xff0c;其中每个具体环节都可能受到安全威胁。构建强健的权限管理系统&#xff0c;保证管理信息系统的安全性是十分重要的。权限管理系统是管理信息系统中代码重用性最高的模块…