栈溢出和GS编译选项

合集下载

GCC编译器选项及优化提示

GCC编译器选项及优化提示

[原创]GCC编译器‎选项及优化提‎示很多弟兄可能‎都很关心如何‎优化编译自己‎的程序,虽然本人不赞‎成"骨灰"玩法,却也不得不承‎认这是掌握g‎c c的绝佳途‎径;因此献上此帖‎,以供各位玩家‎参考,绝对原创噢============================大多数程序和‎库在编译时默‎认的优化级别‎是"2"(使用gcc选‎项:"-O2")并且在I nt‎e l/AMD平台上‎默认按照i3‎86处理器来‎编译。

如果你只想让‎编译出来的程‎序运行在特定‎的平台上,就需要执行更‎高级的编译器‎优化选项,以产生只能运‎行于特定平台‎的代码。

一种方法是修‎改每个源码包‎中的M ake‎f ile文件‎,在其中寻找C‎F LAGS和‎C XXFLA‎G S变量(C和C++编译器的编译‎选项)并修改它的值‎。

一些源码包比‎如binut‎i ls, gcc, glibc等‎等,在每个子文件‎夹中都有M a‎k efile‎文件,这样修改起来‎就太累了!另一种简易做‎法是设置C F‎L AGS和C‎X XFLA G‎S环境变量。

大多数c on‎f igure‎脚本会使用这‎两个环境变量‎代替M ake‎f ile文件‎中的值。

但是少数c o‎n figur‎e脚本并不这‎样做,他们必须需要‎手动编辑才行‎。

为了设置C F‎L AGS和C‎X XFLA G‎S环境变量,你可以在ba‎s h中执行如‎下命令(也可以写进.bas hrc‎以成为默认值‎):export‎C FLA GS‎="-O3 -marc h=<c pu类型>" && C XXFLA‎G S=$CFLAGS‎这是一个确保‎能够在几乎所‎有平台上都能‎正常工作的最‎小设置。

"-marc h"选项表示为特‎定的c pu类‎型编译二进制‎代码(不能在更低级‎别的c pu上‎运行),I ntel通‎常是:pentiu‎m2, pentiu‎m3, pentiu‎m3m, pentiu‎m4, pentiu‎m4m, pentiu‎m-m, pres c o‎t t, noc ona‎说明:pentiu‎m3m/pentiu‎m4m是笔记‎本用的移动P‎3/P4;pentiu‎m-m是迅驰I/II代笔记本‎的c pu;pres c o‎t t是带SS‎E3的P4(以滚烫到可以‎煎鸡蛋而闻名‎);noc ona‎则是最新的带‎有E M T64‎(64位)的P4(同样可以煎鸡‎蛋)AMD通常是‎:k6, k6-2, k6-3, athlon‎, athlon‎-tbird, athlon‎-xp, athlon‎-mp, optero‎n, athlon‎64, athlon‎-fx用AMD的一‎般都是DI Y‎e r,就不必解释了‎吧。

堆栈溢出技术从入门到精通

堆栈溢出技术从入门到精通

堆栈溢出技术从入门到精通本讲的预备知识:首先你应该了解intel汇编语言,熟悉寄存器的组成和功能。

你必须有堆栈和存储分配方面的基础知识,有关这方面的计算机书籍很多,我将只是简单阐述原理,着重在应用。

其次,你应该了解linux,本讲中我们的例子将在linux上开发。

1:首先复习一下基础知识。

从物理上讲,堆栈是就是一段连续分配的内存空间。

在一个程序中,会声明各种变量。

静态全局变量是位于数据段并且在程序开始运行的时候被加载。

而程序的动态的局部变量则分配在堆栈里面。

从操作上来讲,堆栈是一个先入后出的队列。

他的生长方向与内存的生长方向正好相反。

我们规定内存的生长方向为向上,则栈的生长方向为向下。

压栈的操作push=ESP-4,出栈的操作是pop=ESP+4.换句话说,堆栈中老的值,其内存地址,反而比新的值要大。

请牢牢记住这一点,因为这是堆栈溢出的基本理论依据。

在一次函数调用中,堆栈中将被依次压入:参数,返回地址,EBP。

如果函数有局部变量,接下来,就在堆栈中开辟相应的空间以构造变量。

函数执行结束,这些局部变量的内容将被丢失。

但是不被清除。

在函数返回的时候,弹出EBP,恢复堆栈到函数调用的地址,弹出返回地址到EIP以继续执行程序。

在C语言程序中,参数的压栈顺序是反向的。

比如func(a,b,c)。

在参数入栈的时候,是:先压c,再压b,最后a.在取参数的时候,由于栈的先入后出,先取栈顶的a,再取b,最后取c。

(PS:如果你看不懂上面这段概述,请你去看以看关于堆栈的书籍,一般的汇编语言书籍都会详细的讨论堆栈,必须弄懂它,你才能进行下面的学习)2:好了,继续,让我们来看一看什么是堆栈溢出。

2.1:运行时的堆栈分配堆栈溢出就是不顾堆栈中分配的局部数据块大小,向该数据块写入了过多的数据,导致数据越界。

结果覆盖了老的堆栈数据。

比如有下面一段程序:程序一:#include <stdio.h>int main ( ){char name[8];printf("Please type your name: ");gets(name);printf("Hello, %s!", name);return 0;}编译并且执行,我们输入ipxodi,就会输出Hello,ipxodi!。

NVIDIA Driver Helper Service栈溢出简单说明

NVIDIA Driver Helper Service栈溢出简单说明

NVIDIA Driver Helper Service栈溢出简单说明最近传出NVIDIA显卡存在远程溢出漏洞,其实没有传说中那么严重,有很大的局限性。

1、限于win7系统2、远程溢出需要系统账号才行以下转自看雪【转】NVIDIA Driver Helper Service栈溢出简单说明——————————————————————————– -详情见36x新闻,本来不想发出来的,不过看到36x的人又在放屁吓人.还是发出来吧.首先这个洞和nvidia的驱动没有一毛钱关系,不是内核级的漏洞.NVIDIA Driver Helper Service,是一个r3层的服务.程序是nvvsvc.exe(win7)或nvvsvc32.exe(xp) -这个程序启动后会创建一个命名管道\\pipe\nsvr,比较特别的是这个管道的dacl是空,也就是说everyone都可以访问.然后重要的是这个洞其实只针对win7 x64版有效.在win7 x32版上只能够做到infoleak.xp x32版下0×52命令不支持,同时老版本的xp版nvvsvc32.exe根本没建命名管道.所以也就没360x吹的那么凶,另外这个洞远程利用的情况下对于win7系统关闭了空连接共享所以必须要一个用户名密码(且密码不能为空).下面来看洞:win7 32位版nvvsvc1 loc_4035D8: ; 取后面数据的长度2 lea eax, [ebp-4022h]3 push ebx ; ebx=2000h4 push eax5 mov [ebp+nNumberOfBytesToWrite], ecx ; ecx=3h6 call sub_43132C ; 返回时如果5200后面是4000h个41h,那么eax=2000h7 pop ecx8 lea eax, [ebp+eax*2+var_4020] ; eax=ebp+4000h-4020h=ebp-20h9 pop ecx10 mov ecx, [eax] ; [ebp-20]=00000000h,ecx=011 add eax, 8 ; eax=lea [ebp-18h]12 mov [ebp+nNumberOfBytesToWrite], ecx13 mov ecx, [eax-4] ; eax=lea [ebp-1ch],[eax]中的值为00004078h14 push eax ; eax为地址,地址中的值是收到的数据中4078h后面的41 41 ..15 mov [ebp+dwType], eax16 lea eax, [ebp+nNumberOfBytesToWrite]17 push eax ; [eax]的值为018 lea eax, [ebp-4022h]19 mov [ebp+lpData], ecx ; ecx=00004078h20 push eax ; eax为地址,地址中的值为41 00 41 00....21 cmp dword_491550, edi ; edi=022 jle short loc_4036322324 然后在下面触发25 loc_40363D:26 mov esi, [ebp+lpData]27 add esp, 0Ch28 push esi ; 4078h,copy的长度29 push [ebp+dwType] ; 地址中的值是收到的数据中4078h后面的41 41 ..30 lea eax, [ebp+Buffer] ; 地址中的值会发送回攻击者31 push eax32 call loc_430720 ; bug!!!33 add esp, 0Ch34 mov [ebp+nNumberOfBytesToWrite], esi35 jmp loc_4039003637 最后再来看内存布局:38 ebp-8044h response buffer ---目的39 ------------------------------recivebuf40 ebp-4024h 52 0041 ebp-4022h 41 4142 ......... 41 4143 ebp-0024h 41 4144 ebp-0022h 00 0045 ebp-0020h 00 00 00 0046 ebp-001ch 20 00 00 0047 ebp-0018h 41 41 41 4148 ebp-0014h 41 41 41 4149 ebp-0010h 41 41 41 4150 ebp-000ch 41 41 41 4151 ebp-0008h 41 41 41 4152 -----------------------------recivebuf53 ebp-0004h cookie漏洞原理:有漏洞的nvvsvc会读recivebuf,判断头两字节是否为52h,如果是跳过52 00后面的字符串,然后读ebp-1c处的长度(没有任何效验),源为length的偏移往后ebp-18h,并把这些数据移到ebp-8044处的responsebuf,然后调用writefile把数据发给攻击者.如果length定义大点就会读出ebp-4h处的stack cookie并发给攻击者.由于32位版下局部变量的内存布局源地址在目的地址的高位,所以这个洞只能造成infoleak. 64位的情况刚好相反,所以能够利用,具体可以见老外的exp不多说.注:让win7 32位版的nvvsvc在xp 32位版上运行要改exe的四个地方4 p! r* J. O3 a6 |3 F7 s改引入表的reggetvaluew为regclosekey,因为xp下没这个函数程序入口getcommandlinea调用后改为1 jmp 004039882 33 8D 4D EC lea ecx, [ebp+ThreadId]4 51 push ecx ; lpThreadId5 6A 04 push 4 ; CREATE_SUSPENDED6 FF 75 F8 push [ebp+hObject] ; lpParameter7 89 45 EC mov [ebp+ThreadId], eax8 68 75 34 40 00 push offset StartAddress ; lpStartAddress9 50 push eax ; dwStackSize10 50 push eax ; lpThreadAttributes11 FF 15 98 B0 46 00 call ds:CreateThreadSecurity12 89 45 F0 mov [ebp+hThread], eax13 E8 F0 E8 FF FF call sub_402313 ; 这个call要注解掉14 loc_403632:15 lea edi, [ebp+lpData]16 call sub_4025D0 ; nop掉附件说明: nvvsvc32.rar是把win7 32位版的nvvsvc改了下让其可以在xp和win下运行不管你是否有nvidia的显卡.exp是改的老外的攻击程序,读32位版的cookie.(ps:老外还是很牛的)1 C:\Documents and Settings\mj0011\桌面\新建文件夹\ms0x-0xx\nvidia pipe>exp local ** Nvvsvc.exe Nsvr Pipe Exploit (Local/Domain) **2 [ () peterwintrsmith]3 - Win7 x64 DEP + ASLR + GS Bypass - Christmas 2012 -4 Action 1 of 9: - CONNECT5 Action 2 of 9: - CLIENT => SERVER6 Written 16416 (0x4020) characters to pipe7 Action 3 of 9: - SERVER => CLIENT8 Read 32 (0x20) characters from pipe9 Action 4 of 9: Building exploit ...10 => Stack cookie 0xb5b04abd:11 Action 5 of 9: - CLIENT => SERVER*12 Written 16416 (0x4020) characters to pipe13 Action 6 of 9: - SERVER => CLIENT14 Read 16384 (0x4000) characters from pipe15 Action 7 of 9: - CLIENT => SERVER16 Written 16416 (0x4020) characters to pipe17 Action 8 of 9: - SERVER => CLIENT1 `/18 !! Error reading from pipe (at least, no data on pipe)本文章由泛亚 原创,转载请注明。

软件安全编码和软件安全检测培训PPT课件

软件安全编码和软件安全检测培训PPT课件
… Char name[4]; Strcpy(name,”AAAAAAAAAAA”); ….
第6页/共25页
缓冲区溢出原理
• 缓冲区溢出原理 • 内存映像 • 栈溢出 • 堆溢出 • 其它溢出
第7页/共25页
缓冲区溢出利用原理
• 栈溢出利用原理 • 进入函数构造栈帧 • call指令相当于有个push eip操作
入问题
第22页/共25页
SQL注入
-使用占位符、预编译的方法代替SQL语句拼接(prepare)应 该被翻译为数据绑定为数据使用 编码量有所增加
String item = request.getParamater("item"); String q="SELECT * FROM records WHERE item=?"; PreparedStatement stmt = conn.prepareStatement(q); stmt.setString(1, item); ResultSet results = stmt.execute(); ...
• ret指令相当于pop eip操作
第8页/共25页
… Char name[4]; Strcpy(name,”AAAAAAAAAAA”); ….
esp 低地址
name ebp eip
高地址
AAAA AAAA AAA
在内存中的结构;name溢出可能覆盖ebp 、eip(返回地址)值; 随机填充会引起 段错误表现为coredump;精确的计算填充可 控制程序走向。
第18页/共25页
缓冲区溢出防范
• 硬件方面 • 使用带NX功能的处理器,并且在系统打开此功能 • 使用最新的操作系统,比如Windows XP SP2、Windows 2003 SP2、Windows Vista以及SELinux或grsecurity类似功能的系统补 丁

最新GCC编译器选项及优化提示

最新GCC编译器选项及优化提示

G C C编译器选项及优化提示GCC编译器选项及优化提示GCC编译器选项及优化提示2010-08-01 19:41很多弟兄可能都很关心如何优化编译自己的程序,虽然本人不赞成"骨灰"玩法,却也不得不承认这是掌握gcc的绝佳途径;因此献上此帖,以供各位玩家参考,绝对原创噢=大多数程序和库在编译时默认的优化级别是"2"(使用gcc选项:"-O2")并且在Intel/AMD平台上默认按照i386处理器来编译。

如果你只想让编译出来的程序运行在特定的平台上,就需要执行更高级的编译器优化选项,以产生只能运行于特定平台的代码。

一种方法是修改每个源码包中的Makefile文件,在其中寻找CFLAGS和CXXFLAGS变量(C和C++编译器的编译选项)并修改它的值。

一些源码包比如binutils,gcc,glibc等等,在每个子文件夹中都有Makefile文件,这样修改起来就太累了!另一种简易做法是设置CFLAGS和CXXFLAGS环境变量。

大多数configure 脚本会使用这两个环境变量代替Makefile文件中的值。

但是少数configure脚本并不这样做,他们必须需要手动编辑才行。

为了设置CFLAGS和CXXFLAGS环境变量,你可以在bash中执行如下命令(也可以写进.bashrc以成为默认值):export CFLAGS="-O3-march="&&CXXFLAGS=$CFLAGS这是一个确保能够在几乎所有平台上都能正常工作的最小设置。

"-march"选项表示为特定的cpu类型编译二进制代码(不能在更低级别的cpu上运行),Intel通常是:pentium2,pentium3,pentium3m,pentium4,pentium4m,pentium-m,prescott,nocona说明:pentium3m/pentium4m是笔记本用的移动P3/P4;pentium-m是迅驰I/II代笔记本的cpu;prescott是带SSE3的P4(以滚烫到可以煎鸡蛋而闻名);nocona则是最新的带有EMT64(64位)的P4(同样可以煎鸡蛋)AMD通常是:k6,k6-2,k6-3,athlon,athlon-tbird,athlon-xp,athlon-mp,opteron,athlon64,athlon-fx用AMD的一般都是DIYer,就不必解释了吧。

CTF比赛PWN入门

CTF比赛PWN入门
CTF
PWN入门
(CTF means Capture The Flag)
PWN 题目的形式
• 一个ip地址和端口号 Example: nc 106.75.2.53 60044 1.nc==>即netcat,一个小巧的网络工具(Linux中自带),本题中用来建立TCP连接 2.连接成功后,目标主机会运行题目文件,通过TCP连接进行交互 • 一个二进制文件 即目标主机会运行的题目文件 换句话说,比赛时可以在二进制层面知道目标主机将会运行什么代码(没有源代码)
• printf 格式化字符串漏洞
• I/O file 漏洞
……
PWN 需要的工具(部分)
• IDA Pro :反汇编及反编译,同时也是强大的调试器(不过Linux环境下调试文件略麻烦) • pwntools : 一个用来解题的Python库,内置有很多自动查找地址、自动生成shellcode的函数(但我都没用过)
具体构造输入比较难表述,在后面结合例子介绍
栈溢出 之 地址随机化:PIE(position-independent executable)
• 前面提到的ROP需要有目标函数的地址(比如system函数的地址),才能使用ret跳转到目标位置。PIE将地址随机化, 每次加载进程,libc都随机加载到一块地址,这样system的地址有随机部分,难以获得。 • 但是无论是PIE还是ALSR(address space layout randomization),都是以页为单位的,所以在页中,位置不变。换句话说, 虽然libc被加载到了随机的地址,但是libc内部各个函数的相对地址不变。所以可以通过泄露libc的基地址base address,获 得目标函数的地址:
int main(){

2022年职业考证-软考-信息安全工程师考试全真模拟易错、难点剖析AB卷(带答案)试题号:29

2022年职业考证-软考-信息安全工程师考试全真模拟易错、难点剖析AB卷(带答案)试题号:29

2022年职业考证-软考-信息安全工程师考试全真模拟易错、难点剖析AB卷(带答案)一.综合题(共15题)1.单选题2001年11月26日,美国政府正式颁布AES为美国国家标准。

AES算法的分组长度为128位,其可选的密钥长度不包括()。

问题1选项A.256位B.192位C.128位D.64位【答案】D【解析】本题考查分组加密AES密码算法方面的基础知识。

AES的密钥长度可以为16、24或者32字节,也就是128、192、 256 位。

2.单选题密码工作是党和国家的一项特殊重要工作,直接关系国家政治安全、经济安全、国防安全和信息安全。

密码法的通过对全面提升密码工作法治化水平起到了关键性作用。

密码法规定国家对密码实行分类管理,密码分类中不包含()。

问题1选项A.核心密码B.普通密码C.商用密码D.国产密码【答案】D【解析】本题考查密码法方面的基础知识。

根据《中华人民共和国密码法》第六条,密码分为核心密码、普通密码和商用密码,不包含国产密码。

答案选D。

3.单选题报文内容认证使接收方能够确认报文内容的真实性,产生认证码的方式不包括()。

问题1选项A.报文加密B.数字水印C.MACD.HMAC【答案】B【解析】本题考查消息认证码方面的基础知识。

产生认证码的方法有以下三种:①报文加密;②消息认证码(MAC);③基于hash函数的消息认证码(HMAC)。

答案选B。

4.案例题阅读下列说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。

【说明】代码安全漏洞往往是系统或者网络被攻破的头号杀手。

在C语言程序开发中,由于C语言自身语法的一些特性,很容易出现各种安全漏洞。

因此,应该在C程序开发中充分利用现有开发工具提供的各种安全编译选项,减少出现漏洞的可能性。

【问题1】(4分)图5-1给出了一段有漏洞的C语言代码(注:行首数字是代码行号),请问,上述代码存在哪种类型的安全漏洞?该漏洞和C语言数组的哪一个特性有关?【问题2】(4分)图5-2给出了C程序的典型内存布局,请回答如下问题。

GCC中的编译器堆栈保护技术

GCC中的编译器堆栈保护技术

GCC中的编译器堆栈保护技术GCC 中的编译器堆栈保护技术前⼏天看到的觉得不错得博客于是转发了,但这⾥我补充⼀下⼀些点。

GCC通过栈保护选项-fstack-protector-all编译时额外添加两个符号,__stack_chk_guard和__stack_chk_fail分别是存储canary word值的地址以及检测栈溢出后的处理函数,这两个符号如果是在linux上是需要Glib⽀持的,但如果是像内核代码或是⼀些调⽤不同的C库像arm-none-eabi-gcc调⽤的newlib那么你就需要⾃⼰重新实现这两个符号,因为我在⽹上看到很多⼈搜为什么加上栈保护选项后编译不过,那是链接的时候链接器在C库中找不到这两个符号。

GCC编译以堆栈溢出为代表的缓冲区溢出攻击已经成为⼀种普遍的安全漏洞和攻击⼿段。

本⽂⾸先对编译器层⾯的堆栈保护技术作简要介绍,然后通过实例来展⽰ GCC 中堆栈保护的实现⽅式和效果。

最后介绍⼀些 GCC 堆栈保护的缺陷和局限。

以堆栈溢出为代表的缓冲区溢出已成为最为普遍的安全漏洞。

由此引发的安全问题⽐⽐皆是。

早在 1988 年,美国康奈尔⼤学的计算机科学系研究⽣莫⾥斯 (Morris) 利⽤ UNIX fingered 程序的溢出漏洞,写了⼀段恶意程序并传播到其他机器上,结果造成 6000 台 Internet 上的服务器瘫痪,占当时总数的 10%。

各种操作系统上出现的溢出漏洞也数不胜数。

为了尽可能避免缓冲区溢出漏洞被攻击者利⽤,现今的编译器设计者已经开始在编译器层⾯上对堆栈进⾏保护。

现在已经有了好⼏种编译器堆栈保护的实现,其中最著名的是 StackGuard 和 Stack-smashing Protection (SSP,⼜名 ProPolice)。

编译器堆栈保护原理我们知道攻击者利⽤堆栈溢出漏洞时,通常会破坏当前的函数栈。

例如,攻击者利⽤清单 1 中的函数的堆栈溢出漏洞时,典型的情况是攻击者会试图让程序往 name 数组中写超过数组长度的数据,直到函数栈中的返回地址被覆盖,使该函数返回时跳转⾄攻击者注⼊的恶意代码或shellcode 处执⾏(关于溢出攻击的原理参见)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

栈的工作原理
• 栈的两种操作
Push Pop
低地址
• 栈的两个属性
ESP EBP
• 当前函数栈帧
ESP和EBP之间的内存空间 包含:局部变量、前ebp、返回地址
高地址
栈的工作原理
• 函数的调用约定
描述函数传递参数的方式和栈协同工作的技术细节
• VC++支持的三种函数调用约定
调用约定的声明 __cdecl __fastcall __stdcall 参数入栈顺序 右 左 右 左 右 左 把参数弹出栈者 父函数 子函数 子函数
GS机制工作原理
子函数: push ebp mov ebp,esp sub esp,XXX …… mov esp,ebp pop ebp ret
安全种子产生
安全种子的产生是在主函数之前执行的,产生后保存在.data段第一个双字 中。在该处设置内存写入断点,即可跟踪到种子产生的汇编代码。
对应的C代码如下: int main() { FILETIME ft; unsigned int Cookie=0; unsigned int tmp=0; unsigned int *ptr=0; LARGE_INTEGER perfcount; GetSystemTimeAsFileTime(&ft); Cookie = ft.dwHighDateTime ^ ft.dwLowDateTime; Cookie = Cookie ^ GetCurrentProcessId(); Cookie = Cookie ^ GetCurrentThreadId(); Cookie = Cookie ^ GetTickCount(); QueryPerformanceCounter(&perfcount); ptr = (unsigned int)&perfcount; tmp = *(ptr+1) ^ *ptr; Cookie = Cookie ^ tmp; printf("Cookie: %.8X\n",Cookie); return 0; }
栈的工作原理
• 函数的调用过程(1)
栈的工作原理
• 函数的调用过程(2)
栈的工作原理
• 函数的返回过程
栈的工作原理
• 函数调用的实现(系统栈的结构)
栈溢出利用
• 使用固定地址覆盖返回地址
栈溢出利用
• 使用JMP ESP的地址覆盖返回地址
GS编译选项
GS 编译选项是微软提出的用于检测栈溢出的一种方法。通过判断函 数返回地址是否被修改来检测溢出。VC7.0及以后的版本的VS中都默 认启动这个编译选项。
GS机制工作原理
GS机制对性能的影响
1、GS编译选项会增加4个字节的栈的分配空间,以及在函数的入口 和出口添加针对安全cookie的若干指令。 2、GS编译选项不是对每一个函数都设置安全cookies。Visual Studio 的编译程序首先会确定函数是否属于 “潜在危险”的函数,例如 在函数的堆栈上分配了字符串数组,就是一个特征。只有那些被确 认为“潜在危险”函数,GS编译选项才会使用安全cookie。 3、根据Visual Studio 编译组的数据,在绝大多数情况下,对性能的 影响不超过2%。 所以在微软的安全开发周期模型中,强烈推荐使用GS编译选项。 相对于轻微的性能损失,GS编译选项对程序的安全性的提高是非常 巨大的。Window xp sp2和2003都使用了GS编译技术对整个系统进 行了编译,安全性有了很大提高。
GS机制的局限
GS编译选项针对的是函数的栈溢出,覆盖返回地址的攻击方式。对于程 序的其它类型的安全漏洞,它并不能提供有效保护。例如: 堆缓存溢出(heap buffer overrun) 攻击栈中的异常处理机制 等等 所以,决不是使用了GS编译选项就可以高枕无忧了。需要强调的是, GS编译选项并不是消除了程序的缓存溢出安全漏洞,而是试图在特定情 况下,降低安全漏洞的危害程度。例如,即使GS编译选项可以防止恶意 代码被远程执行,但是程序也会异常终止。如果该程序是一个重要的服 务器进程,这就会是一个典型的DOS攻击。
栈溢出和GS编译选项
主要内容
• 栈溢出
栈的工作原理 栈溢出利用过程
• GS编译选项
GS机制工作原理 GS机)
1、代码段: 存储被装入执行的二进制机器码 2、数据段: 用于存储全局变量等 3、堆区:(Heap) 动态请求一定大小的内存,用完后需要释放。 4、栈区:(Stack) 用于保存局部变量;用于动态的存储函数调用关系, 配合处理器完成函数的调用及返回。
相关文档
最新文档