第2讲-1-内存漏洞详解-栈部分
内存泄漏和内存溢出、堆内存和栈内存区分、负载标准、降低cache内存方法

(一)内存泄漏和内存溢出内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。
内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。
内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。
memory leak会最终会导致out of memory。
(二)堆内存和栈内存区分一、数据结构中的堆和栈1. 栈是一种连续储存的数据结构,具有先进后出的性质。
通常的操作有入栈(压栈),出栈和栈顶元素。
想要读取栈中的某个元素,就是将其之间的所有元素出栈才能完成。
2. 堆是一种非连续的树形储存数据结构,每个节点有一个值,整棵树是经过排序的。
特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。
常用来实现优先队列,存取随意。
二、内存中的栈区与堆区1. 内存中的栈区与堆区比较2. 计算机内存的大致划分一般说到内存,指的是计算机的随机存储器(RAM),程序都是在这里面运行。
三、栈内存与栈溢出由程序自动向操作系统申请分配以及回收,速度快,使用方便,但程序员无法控制。
若分配失败,则提示栈溢出错误。
注意,const 局部变量也储存在栈区内,栈区向地址减小的方向增长。
四、堆内存与内存泄露程序员向操作系统申请一块内存,当系统收到程序的申请时,会遍历一个记录空闲内存地址的链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。
栈溢出漏洞原理

栈溢出漏洞原理栈溢出(Stack Overflow)是一种常见的安全漏洞,它利用了程序在执行过程中使用的栈内存空间有限的特性。
栈溢出漏洞的原理是攻击者通过向程序输入过多的数据,超出了栈内存所能容纳的范围,从而覆盖了栈中的其他数据甚至覆盖了函数返回地址,从而实现任意代码执行的攻击。
要理解栈溢出漏洞的原理,首先需要了解栈的概念。
在计算机中,栈是一种数据结构,用来存储函数的局部变量、函数的参数以及函数调用的返回地址等信息。
栈的特点是先进后出,也就是说最后进入栈的数据最先被访问到。
当一个函数被调用时,会将函数的参数和局部变量等数据压入栈中。
而函数执行完毕后,会通过栈中保存的返回地址返回到调用函数的位置。
栈溢出漏洞就是在这个过程中利用了栈的特性来进行攻击。
栈溢出漏洞的攻击方式通常是通过向程序输入过长的数据,超出了预留的栈内存空间大小。
由于栈内存的连续性,超出的数据会覆盖栈中相邻的数据。
如果这些相邻的数据是保存函数返回地址的部分,那么攻击者就可以通过修改返回地址的值,使程序执行任意指定的代码。
具体来说,当攻击者向程序输入的数据超出了栈内存的大小时,多余的数据会被写入到栈中相邻的内存区域。
当函数执行完毕,尝试返回到返回地址所指向的位置时,由于返回地址被篡改,程序就会跳转到攻击者指定的代码,从而实现了攻击者的意图。
栈溢出漏洞的危害非常大,攻击者可以利用它执行任意代码,包括删除、修改、读取敏感数据,甚至控制整个系统。
为了防止栈溢出漏洞的发生,开发人员需要注意以下几点:1. 输入验证:对用户输入的数据进行验证和过滤,确保不会超出预期的长度。
2. 缓冲区溢出检测:使用一些工具来检测程序中是否存在缓冲区溢出的漏洞,及时修复。
3. 栈保护机制:一些编程语言和操作系统提供了栈保护机制,可以在栈溢出时检测到异常并中断程序的执行。
4. 代码审查:进行代码审查,查找潜在的栈溢出漏洞,并修复之。
5. 使用安全的编程语言和框架:一些编程语言和框架自带了一些安全机制,能够有效地防止栈溢出漏洞的发生。
软件漏洞分析入门

软件漏洞分析入门1 引子To be the apostrophe which changed “Impossible” into “I‟m possible”——failwest凉风有讯,秋月无边。
您是否梦想过能够像电影上演的那样黑进任意一台机器远程操控?您的梦想是否曾经被书店里边满架子的反黑,防毒,擒木马的扫盲书强暴的体无完肤?从今天开始,准备陆续发一系列关于软件漏洞方面基础知识的帖子,包括软件漏洞的研究价值,研究方法,堆栈利用的基础知识,shellcode的调试方法,漏洞调试方法,漏洞分析,漏洞挖掘,软件安全性测试等等,此外还将介绍一些metasploit架构和fuzz测试方面的入门知识。
软件漏洞分析,利用,发掘是当今安全技术界中流砥柱级别话题,如果您关注过black hat 或者defcon之类的顶级安全技术峰会的话,就知道我不是在吹牛了。
可惜的是这方面的中文资料很少,偶尔有一篇比较优秀的文章但又不够系统,目前为止也没有形成像破解技术这样的讨论风气,菜鸟们在黑灯瞎火的夜晚瞎折腾,没有交流和指导,兴趣就像被拔了气弥儿芯的车胎,很快就泄气了。
虽然漏洞分析与利用与破解在技术上各有侧重点,但逆向基础是共同的。
以我个人的经验,能做crack的朋友只要稍加进修就能入门。
就算没有任何汇编基础和逆向经验的朋友也不用担心,因为这个系列的文章将完全面向菜鸟,只要会C语言,跟着文章用ollydbg调试几次连猜带蒙的也应该能够上手。
今天我们暂时不谈堆栈这些技术细节,先让我们从比较宏观的地方着手。
如果您经历过冲击波蠕虫病毒的攻击话,应该明白操作系统出现漏洞时的后果。
漏洞往往是病毒木马入侵计算机的突破口。
如果掌握了漏洞的技术细节,能够写出漏洞利用(exploit),往往可以让目标主机执行任意代码。
软件漏洞的技术细节是非常宝贵的资料,尤其是当软件漏洞对应的官方补丁尚未发布时,只有少数攻击者秘密的掌握漏洞及其利用方法,这时往往可以通过漏洞hack任意一台internet这种未被公开的漏洞被称作zero day (0 day)。
大一关于栈的计算机知识点

大一关于栈的计算机知识点栈是计算机科学中的一种数据结构,它的作用类似于我们日常生活中的堆叠物品。
在计算机中,栈是一种先进后出(Last InFirst Out, LIFO)的数据结构,它只允许在一端进行插入和删除操作,这一端被称为栈顶。
在这篇文章中,我们将探讨关于栈的一些基本知识点,包括应用、实现和注意事项。
1. 栈的应用栈在计算机科学中有着广泛的应用。
其中一个重要的应用是函数调用。
在程序中,每当一个函数被调用时,函数的参数和返回地址等信息将被存储在栈中。
当函数执行完毕后,栈会将这些信息出栈,然后程序继续执行下一个函数。
此外,栈还常被用于表达式求值、括号匹配、以及递归等场景。
例如,当计算一个表达式时,栈可以用来存储运算符和操作数,按照运算符的优先级计算结果。
同时,栈可以用来解决括号匹配问题,通过检查栈中的括号是否匹配来确定表达式的有效性。
另外,递归也经常使用栈来实现,每次递归调用时,函数的参数和变量都会被推入栈中,直到递归结束后再依次弹出。
2. 栈的实现栈可以通过数组和链表两种方式来实现。
使用数组实现的栈被称为顺序栈,通过维护一个栈顶指针来表示当前栈顶位置。
当进行入栈操作时,栈顶指针会向上移动,并将数据插入到数组中。
出栈操作则是将栈顶指针向下移动,并返回对应的数据。
链表实现的栈被称为链式栈,每个节点包括存储数据的字段和指向下一个节点的指针。
当进行入栈操作时,新的节点将被插入到链表的头部,成为新的栈顶。
而出栈操作则是删除链表头部的节点,并更新栈顶指针。
两种实现方式各有优劣。
顺序栈在操作上更为简单高效,但需要预先分配固定大小的数组。
而链式栈则可以动态扩展大小,但在空间和时间上会有额外的开销。
3. 栈的注意事项在使用栈时,有一些需要注意的地方。
首先,栈有可能溢出。
当入栈操作超过栈的容量时,栈将溢出并导致程序异常。
因此,在使用栈时,需要合理估计栈的大小,避免发生溢出。
其次,栈的正确使用需要遵循先进后出的原则。
C语言漏洞分析

C语言漏洞分析C语言作为一种通用的编程语言,广泛应用于系统软件、游戏开发和嵌入式系统等领域。
然而,由于其底层的特性,使得C语言程序容易受到各种漏洞的攻击。
本文将分析一些常见的C语言漏洞,并提供相应解决方案,以加强程序的安全性。
一、缓冲区溢出漏洞缓冲区溢出是最为常见的C语言漏洞之一。
当程序试图将超过缓冲区边界的数据写入到缓冲区时,就会发生缓冲区溢出。
黑客可以利用这个漏洞来改变程序的行为,执行恶意代码或者获取敏感信息。
缓冲区溢出的解决方案主要包括:1. 使用安全的字符串函数,如strcpy_s、strcat_s等,来替代不安全的字符串函数。
2. 对用户输入进行严格的边界检查和过滤,确保输入的数据不会超出缓冲区的容量。
二、空指针解引用漏洞空指针解引用是指在程序中对空指针进行解引用操作,从而导致程序崩溃或不可预料的行为。
黑客可以通过利用空指针解引用漏洞来执行恶意代码,获取系统权限。
避免空指针解引用漏洞的常见方法包括:1. 在使用指针之前进行空指针检查,确保指针不为空。
2. 在指针释放后将其设置为NULL,以防止后续误用。
三、格式化字符串漏洞格式化字符串漏洞是指在使用printf、sprintf等函数时,未对格式化字符串进行正确的控制,导致黑客可以通过输入特定格式的数据来读取栈上的数据或执行恶意代码。
避免格式化字符串漏洞的方法包括:1. 尽量避免使用不信任的格式字符串作为printf、sprintf等函数的参数。
2. 使用安全的格式化函数,如snprintf,限制输出的长度。
3. 对用户输入进行严格的检查和过滤,确保输入的数据不会包含格式化字符串。
四、整数溢出漏洞整数溢出是指在进行整数运算中,结果超出了数据类型的表示范围,导致不可预料的行为。
黑客可以利用整数溢出漏洞来执行恶意代码或者改变程序的行为。
避免整数溢出漏洞的方法包括:1. 确保进行整数运算时,数据类型足够大以容纳结果。
2. 对用户输入的数据进行范围检查,确保不会造成溢出。
数据结构-栈

数据结构-栈⼀、栈1. 1. 为什么要学习栈?栈是什么?为什么要学习它?现在先来说说栈的辉煌作⽤吧!在计算机领域中,栈是⼀种不可忽略的概念,⽆论从它的结构上,还是存储数据⽅⾯,它对于学习数据结构的⼈们来说,都是⾮常重要的。
那么就会有⼈问,栈究竟有什么作⽤,让我们这么重视它?⾸先,栈具有⾮常强⼤的“记忆”功能,它可以保存对你有作⽤的数据,也可以被叫做保存现场;其次,当咱们调⽤⼀个带参函数时候,被调⽤的函数的形参,在编译器编译的时候,这些形参都需要⼀定的空间存放他们,这时计算机就会默认帮你保存到栈中了!1. 2. 栈的定义栈的作⽤,这是⼀个咱们⽣活中处处⽤到,但是却⼜没发现的⼀种现象,例如当你拿个篮⼦去买苹果,那么你最先挑选的苹果就是在篮⼦的最底下,最后挑选的苹果就在篮⼦的最上边,那么这就造成了这么⼀种现象:先拿进篮⼦的苹果,要最后才能取出来;相反,最后拿进篮⼦的苹果,就能最先取出来!栈是限定只能在表尾进⾏插⼊和删除的线性表。
我们把允许插⼊和删除的⼀端称作栈顶(Top),另⼀端称作栈底(bottom)。
不含任何数据元素的栈被称作空栈,栈也被称为先进后出的线性表(具有线性关系)。
⽽栈的特殊性,就是在表中想进⾏插⼊和删除的操作,只能在栈顶进⾏。
这也就使得了:栈底是⾮常稳定的,因为先进来的元素都被放在了栈底。
栈的插⼊操作:叫做进栈,也叫作压栈,⼊栈。
栈的删除操作:叫做出栈,也叫弹栈。
1. 3. 进栈出栈变化形式现在请⼤家思考这样的⼀个问题:最先进栈的元素,是不是只能最后才能出来呢?答案是不⼀定的,这个问题就要细分情况了。
栈对线性表的插⼊和删除的位置进⾏了限制,并没有对元素的进出时间进⾏限制,这也就是说,在不是所有元素都进栈的情况下,事先进去的元素也可以先出站,只要确保⼀点:栈元素是从栈顶出栈就可以了!举例来说,现在有3个整型数元素1、2、3依次进栈,会有哪些出栈次序呢?第⼀种:1、2、3依次进,再3、2、1依次出栈。
计算机安全漏洞分析基础知识

计算机安全漏洞分析基础知识计算机技术的迅猛发展使得我们的日常生活变得更加方便和高效。
然而,随之而来的是计算机安全问题的增加。
计算机安全漏洞是指在计算机系统或软件中存在的可以被恶意利用的弱点或缺陷。
在本文中,将介绍计算机安全漏洞的基础知识以及相应的分析方法。
一、计算机安全漏洞概述计算机安全漏洞是指计算机系统或软件中存在的各种风险和弱点,这些弱点可能导致系统被攻击或信息被窃取。
常见的计算机安全漏洞包括但不限于以下几种类型:1. 输入验证漏洞:指在接收用户输入前,未对其进行合理性验证和过滤,从而导致攻击者能够通过输入特定的内容来执行恶意代码或获取敏感信息。
2. 缓冲区溢出漏洞:指程序在向缓冲区写入数据时,未对数据长度进行有效检查,导致数据溢出并覆盖到其他内存区域,攻击者可以利用这种漏洞执行任意代码。
3. 身份验证漏洞:指系统或软件在身份验证过程中存在漏洞,攻击者可以通过绕过或猜测密码等方式获取未授权的访问权限。
4. SQL注入漏洞:指攻击者通过在输入中注入恶意的SQL代码,从而绕过身份验证或对数据库进行未授权的操作。
二、计算机安全漏洞的分析方法在发现计算机安全漏洞后,为了更好地理解漏洞的本质和影响,需要进行详细的分析。
下面是一些常用的分析方法:1. 收集信息:首先,收集与漏洞相关的信息,包括系统或软件的版本、具体操作步骤、触发漏洞的输入内容等。
这些信息将有助于进一步的漏洞分析。
2. 复现漏洞:根据收集到的信息,尝试在相同的环境中复现漏洞。
通过复现漏洞,可以确认漏洞的存在,并更好地理解漏洞的触发条件和影响范围。
3. 分析源代码:如果有源代码可用,对相关的程序代码进行仔细分析。
这有助于找出潜在的漏洞原因,例如缺乏输入验证、错误的内存管理等。
4. 动态分析:使用调试工具或动态分析工具,对漏洞进行动态分析。
通过观察程序的执行流程和数据变化情况,可以更好地理解漏洞的运行机制。
5. 提供解决方案:基于分析结果,提供相应的解决方案或修补程序。
第6章 计算机存储程序和数据的方式

主存的主要性能指标
° 性能指标:
• 按字节连续编址,每个存储单元为1个字节(8个二进位)
• 存储容量:所包含的存储单元的总数(单位:MB或GB)
• 存取时间TA:从CPU送出内存单元的地址码开始,到主存读出 数据并送到CPU(或者是把CPU数据写入主存)所需要的时间 (单位:ns,1 ns = 10-9 s),分读取时间和写入时间
一般SRAM为字片式芯片,只在字线上译码,同时读出字线上所有位!
… …
位片式存储体阵列组织
0,00
……
00,,33
0 A1
X
地
X0
4×4
址 0译
矩
阵 3,0
…
3,3
A0
码 X3
器
Y0 Y 地址译码器 Y3
A3 0
A2 0
位片式在字方向和位方向扩充,需要有片选信号
DRAM芯片都是位片式
基本特征
将部分译 码功能移 到存储矩 阵内部
按工作状态与存储原理的不同分为
静态RAM 动态RAM
计算机系统平台
24
5.2.2 随机存取存储器RAM
1.静态RAM
1)SRAM基本单元电路 由六个MOS管组成的触发器构成
计算机系统平台
25
行地址选择线X
D数 据 位 线
T1,T3:MOS反相器
T5
T2,T4:MOS反相器
Vcc
T3 T4
从用户的角度来看,决定存储器的三个基本 参数
—— 容量、速度和价格
三个参数之间的关系:
存储器速度越快,每位价格就越高
存储器容量越大,速度就越慢,价格就越低 组成存储系统的关键:把速度、容量和价格不同的 多个物理存储器组织成一个存储系统,这个存储系统 要求速度最快、存储容量最大、单位容量的价格最便 宜。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基本假设
假设场景
假设计算机系统是正常的。也就是说,计算机 系统没有后门,计算机系统硬件是正确的,计 算机在最开始是正常的,用户对计算机的操作 也是正确的。 假设计算机系统上的软件存在漏洞,攻击者也 知道这些漏洞,并且能够利用这些漏洞进行攻 击。 基于以上假设条件,研究如何设计更加安全的 计算机系统,能够尽可能的防御针对软件漏洞 的攻击。
栈
栈(Stack),是一块连续的内存空间
先入后出 生长方向与内存的生长方向正好相反, 从高 地址向低地址生长
栈用于保存程序运行的中间数据
函数的参数 函数返回地址 一些通用寄存器(EDI,ESI…)的值 当前正在执行的函数的局部变量
堆
堆(Heap),也是位于数据段之上的一段
C语言的效率要高于JAVA等类型安全语言,
适合用于编写效率要求高的应用程序。
主要内容
内存漏洞基础知识 内存漏洞详细介绍
缓冲区溢出漏洞 堆漏洞 内存信息泄露漏洞 其他内存漏洞
总结
缓冲区溢出漏洞
缓冲区(buffer),是程序运行期间在内存
中分配的一个连续的存储空间,用于存放程 序运行所需的各种数据。 缓冲区溢出(buffer overflow),是指向 固定长度的缓冲区写入超出预先分配长度的 内容,造成缓冲区数据溢出,而覆盖了缓冲 区相邻的内存空间。
函数调用具体过程
3)子函数返回:
将当前基地址指针拷贝到栈指针,让栈指针重 新指向前一个函数备份的基地址指针值 (mov %ebp, %esp) 将栈顶的前一个函数备份的基址寄存器值弹出, 存入基址寄存器(pop %ebp,获取主函数 的基地址指针) 将压栈的返回地址弹出,存入指令寄存器,子 函数返回,返回主函数继续执行(ret)
缓冲区在内存的布局
缓冲区是内存的具体化,是一段连续的内存空间。 运行一个程序时,计算机会在内存中开辟一段连续 的内存空间,即缓冲区。 我们所说的内存布局,实际上就是一个程序的缓冲 区在内存中的布局。
栈(Stack) 堆(Heap) 未初始化数据段(BSS) 初始化数据段(Data) 代码段(Code)
软件
程序经过编译器编译链接,最后变成了由指 令和数据组成的可执行二进制文件。 处理器读取二进制文件中的指令和数据,运 行程序。
计算机系统的运行,就是一条一条的指令
在处理器上的执行。
程序运行简单模型
一个程序是如何在计算机系统上运行的?
程序运行简单模型
一个程序是如何在计算机系统上运行的?
内存漏洞详解 (一)栈漏洞
陈李维
中国科学院 信息工程研究所
主要内容
内存漏洞基础知识 内存漏洞详细介绍
缓冲区溢出漏洞 堆漏洞 内存信息泄露漏洞 其他内存漏洞
总结
主要内容
内存漏洞基础知识 内存漏洞详细介绍
缓冲区溢出漏洞 堆漏洞 内存信息泄露漏洞 其他内存漏洞
总结
程序运行简单模型
硬件
处理器
指令处理模块(取指,译码,执行,提交, 写回) 寄存器堆
通用寄存器,用于暂存少量当前待处理的数据。 特殊寄存器,如指令寄存器和栈寄存器等。用于保存 一些特殊的数据,如指令指针。
内存(硬盘)
存储所有指令和数据。
程序运行简单模型
软件:程序+数据,指令+数据
对栈操作的几条指令
3)CALL addr
函数调用,首先将返回地址压入栈顶,然后将程序跳 转到当前调用函数的起始地址 push %eip jump addr
4)RET
函数返回,首先将栈顶地址弹出到指令寄存器EIP,然 后按照该EIP继续执行程序。 pop %eip
函数调用具体过程
JAVA,Python等类型安全的语言,虽然可以
避免出现内存漏洞,但是存在其他安全漏洞, 如即时编译的问题、反序列化漏洞等。 由于兼容性难以实现,现实世界中依然需要 使用C,C++语言,很多常见软件都是C、 C++语言编写的。
操作系统内核 类型安全高级语言的解释器(JAVA、Python等)
研究目标
实际情况
通常我们认为最初始的计算机是可信的,系
统内部程序和系统内部数据文件都是可信的, 但是其中不可避免会存在一些漏洞。 随着外部数据的输入,计算机变得不可信。
外部可执行文件输入变成系统内部程序(病毒, 木马,SQL注入,恶意脚本注入等) 外部数据输入,控制计算机系统的运行。
小结
介绍程序运行基本模型,并且从中引出内存
漏洞,让大家理解内存漏洞的内涵。 简单介绍了内存布局,栈和堆的概念。
主要内容
内存漏洞基础知识 内存漏洞详细介绍
缓冲区溢出漏洞 堆漏洞 内存信息泄露漏洞 其他内存漏洞
总结
内存漏洞分类
按照漏洞所在位置,内存漏洞可以分为:
内存高地址 0xFFFFFFFF
内存低地址 0x00000000
缓冲区溢出漏洞分类
按照在内存中的不同溢出位置,缓冲区溢
出漏洞分类:
栈溢出漏洞 堆溢出漏洞 BSS溢出漏洞
按照溢出数据类型,缓冲区溢出漏洞分类:
整数溢出漏洞 字符串溢出漏洞 数组溢出漏洞 内存空间溢出漏洞
缓冲区溢出漏洞详解
缓冲区溢出漏洞:
栈溢出漏洞
栈的正常运行 栈溢出漏洞及其利用过程
堆溢出漏洞(在堆漏洞部分介绍)
栈的正常使用
程序员角度:
int a = 0; char buf[10]; int func(int a, int b, char *p);
汇编代码:
push %eax pop %ebx call func (调用func) ret (函数返回)
程序,即可执行二进制文件,保存在内存中
指令 程序内含数据
中间数据,程序运行过程中生成的中间数据, 保存在内存中
静态数据 动态数据
输入数据,先存入内存,再进行处理
系统内部文件 系统外部输入数据(用户输入,网络数据等)
程序运行简单模型
指令来源:系统内部程序,系统外部输入
(如安装程序、脚本等) 数据来源:系统内部程序和文件,系统外部 输入,程序动态生成
用户直接管理内存,而且缺少对边界、指针 的检查。 JAVA,Python等类型安全的语言,可以避免 出现内存漏洞,如缓冲区溢出、悬空指针等。 类型安全语言的基本特征:
没有指针(避免悬空指针、指针越界等) 检查数组对象边界(避免缓冲区溢出) 自动的垃圾回收(避免堆漏洞)
类型安全的高级编程语言
内存区域。 堆允许程序在运行时动态的申请一块内存空 间,用于存放用户自定义的数据。 堆的使用比栈更加灵活。
栈和堆的比较
栈:
由系统自动分配,先进后出 存放函数的参数、局部变量的值等 向低地址扩展,是一段连续的内存空间 方便快捷,自由度低
堆:
需要程序员自己管理,链表结构,顺序随意 存放程序员自定义的数据 向高地址扩展,存放区域可能不连续 灵活可控,自由度高
和栈相关的三个重要寄存器
1)SP(ESP):extended stack pointer 即栈顶指针,随着数据入栈出栈而发生变化。 2)BP(EBP):extended base pointer 即基地址指针,用于标识栈中一个相对稳定的位 置。通过BP,可以很方便地引用函数参数以及局 部变量。 3)IP(EIP):extended instruction pointer 指令指针,即指令寄存器,用于标示处理器当前 执行的指令。
int retVal = a + b; return retVal; } int main() { int result = func(1, 2); return 0; } Ubuntu 16.04 64位系统: gcc func.c -o func objdump –d func > func.s vim func.s
栈漏洞 堆漏洞 数据段漏洞,如BSS漏洞 空间漏洞
本质:指针越界 缓冲区溢出漏洞(栈溢出,堆溢出,BSS溢出)
按照本质特征,内存漏洞可以分为:
时间漏洞
本质:悬空指针 Use after free漏洞
类型安全的高级编程语言
内存漏洞的出现本质是因为C、C++语言允许
运行时攻击
从程序运行角度,软件控制硬件运行,系统
运行=指令+数据。 运行时攻击:为了让系统执行攻击者预期的 操作,攻击者需要控制系统的运行。
控制硬件:不考虑。 控制输入(指令+数据):病毒木马,流氓软件, SQL注入,恶意脚本等等,也不考虑。 控制输入(数据):利用内存漏洞进行攻击。
冯诺依曼体系结构的特点
计算机硬件由运算器、控制器、存储器、 输入设备和输出设备五大部分组成。 计算机处理的数据和指令一律用二进制数 表示; 指令和数据不加区别混合存储在同一个存 储器中; 顺序执行程序的每一条指令;
程序运行简单模型
一个程序是如何在计算机系统上运行的? 硬件
处理器每次从内存中读取一条指令,按照指 令内容执行,然后取下一条指令执行,一直 循环运行。
函数调用过程示例