栈溢出和GS编译选项
- 格式:ppt
- 大小:690.00 KB
- 文档页数:17
[原创]GCC编译器选项及优化提示很多弟兄可能都很关心如何优化编译自己的程序,虽然本人不赞成"骨灰"玩法,却也不得不承认这是掌握gc c的绝佳途径;因此献上此帖,以供各位玩家参考,绝对原创噢============================大多数程序和库在编译时默认的优化级别是"2"(使用gcc选项:"-O2")并且在I nte l/AMD平台上默认按照i386处理器来编译。
如果你只想让编译出来的程序运行在特定的平台上,就需要执行更高级的编译器优化选项,以产生只能运行于特定平台的代码。
一种方法是修改每个源码包中的M akef ile文件,在其中寻找CF LAGS和C XXFLAG S变量(C和C++编译器的编译选项)并修改它的值。
一些源码包比如binuti ls, gcc, glibc等等,在每个子文件夹中都有M ak efile文件,这样修改起来就太累了!另一种简易做法是设置C FL AGS和CX XFLA GS环境变量。
大多数c onf igure脚本会使用这两个环境变量代替M akef ile文件中的值。
但是少数c on figure脚本并不这样做,他们必须需要手动编辑才行。
为了设置C FL AGS和CX XFLA GS环境变量,你可以在bas h中执行如下命令(也可以写进.bas hrc以成为默认值):exportC FLA GS="-O3 -marc h=<c pu类型>" && C XXFLAG S=$CFLAGS这是一个确保能够在几乎所有平台上都能正常工作的最小设置。
"-marc h"选项表示为特定的c pu类型编译二进制代码(不能在更低级别的c pu上运行),I ntel通常是:pentium2, pentium3, pentium3m, pentium4, pentium4m, pentium-m, pres c ot t, noc ona说明:pentium3m/pentium4m是笔记本用的移动P3/P4;pentium-m是迅驰I/II代笔记本的c pu;pres c ot t是带SSE3的P4(以滚烫到可以煎鸡蛋而闻名);noc ona则是最新的带有E M T64(64位)的P4(同样可以煎鸡蛋)AMD通常是:k6, k6-2, k6-3, athlon, athlon-tbird, athlon-xp, athlon-mp, opteron, athlon64, athlon-fx用AMD的一般都是DI Ye 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显卡存在远程溢出漏洞,其实没有传说中那么严重,有很大的局限性。
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)本文章由泛亚 原创,转载请注明。
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,就不必解释了吧。
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通过栈保护选项-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 处执⾏(关于溢出攻击的原理参见)。
计算机三级信息安全技术试题库与参考答案一、单选题(共100题,每题1分,共100分)1、微软的软件安全开发生命周期模型中最早的阶段是A、第0阶段:准备阶段B、第0阶段:项目启动阶段C、第1阶段:定义需要遵守的安全设计原则D、第1阶段:产品风险评估正确答案:A2、下列组件中,典型的PKI系统不包括()。
A、CAB、LDAPC、RAD、CDS正确答案:D3、下列选项中,不属于网站挂马的主要技术手段是( )。
A、js脚本挂马B、框架挂马C、下载挂马D、body挂马正确答案:C4、数组越界漏洞触发时的特征,不包括A、读取恶意构造的输入数据B、对数组进行读/写操作C、用输入数据计算数组访问索引D、对整型变量进行运算时没有考虑到其边界范围正确答案:D5、假设Alice的RSA公钥为(e=3,n=55)。
Bob发送消息m=14给Alice,则Bob对消息加密后得到的密文是A、94B、14C、49D、12正确答案:C6、在Linux/UNIX系统中,用户命令的可执行文件通常存放在B、/libC、/etcD、/dev正确答案:A7、电子签名认证证书应当载明的内容是A、电子认证服务提供者名称、证书持有人名称、证书序列号、证书有效期、证书持有人电子签名验证数据B、电子认证服务者身份证号、证书使用目的、证书持有人的电子签名验证数据、证书有效期C、电子认证服务者身份证号、证书使用目的、证书序列号、电子认证服务提供者的电子签名D、电子认证服务提供者名称、证书持有人名称、证书采用的私钥、认证服务提供者电子签名验证数据正确答案:A8、信息安全管理的主要内容,包括A、信息安全管理框架和实施、信息安全风险管理和信息安全管理措施三个部分B、信息安全管理认证、信息安全风险管理和信息安全管理措施三个部分C、信息安全管理策略、信息安全风险管理和信息安全管理措施三个部分D、信息安全管理体系、信息安全风险管理和信息安全管理措施三个部分正确答案:D9、验证数字证书的真实性,是通过A、检查证书中证书序列号是否具有唯一性来验证B、验证证书中证书认证机构的数字签名来实现C、比较当前时间与证书截止时间来验证D、查看证书是否在证书黑名单中来验证正确答案:B10、下列关于堆(heap) 的描述中,正确的是( )。
《攻防技术基础》在线作业()是一种自动化或半自动化的安全漏洞检测技术,通过向目标软件输入大量的畸形数据并监测目标系统的异常来发现潜在的软件漏洞。
A:渗透测试B:黑盒测试C:白盒测试D:模糊测试参考选项:D()把软件开发的过程划分为需求->分析->设计->编码->测试等几个阶段进行,每一个阶段都明确定义了产出物和验证的准则。
A:瀑布模型B:螺旋模型C:迭代模型D:快速原型模型参考选项:A以下哪项不是SQL注入的方法()。
A:单引号法B:永真永假法C:执行系统命令D:时间盲注法参考选项:C()是指攻击者窃听了用户访问HTTP时的用户名和密码,或者是用户的会话,从而得到sessionID,进而冒充用户进行HTTP访问的过程。
A:会话劫持B:遭破坏的认证和会话管理C:会话保持攻击D:中间人攻击参考选项:B源代码通过()后形成可执行文件。
A:汇编B:编译C:连接D:编译和连接参考选项:D木马与病毒的重大区别是()。
A:木马会自我复制B:木马具有隐蔽性C:木马不具感染性D:木马通过网络传播参考选项:C以下哪项不属于缓存区溢出漏洞()。
A:堆溢出B:栈溢出C:单字节溢出D:SQL注入参考选项:D以下哪项不是情报搜集阶段要做的事情()。
A:社会工程学B:被动监听C:与客户交流D:公开来源信息查询参考选项:C轰动全球的震网病毒是()。
A:木马B:蠕虫病毒C:后门D:寄生型病毒参考选项:B以下哪项属于PE文件的数据节()A:.textB:.txtC:.docxD:.xls参考选项:A软件静态安全检测技术是针对()的软件所开展的安全分析测试技术。
A:运行状态B:调试状态C:未处于运行状态D:编译状态参考选项:C以下哪项不是PHP的注释符号()。
A:#//B:--+C:/* */。