CSAPP-过程调用,数据存储,缓冲区溢出
程序编译:
1.预处理阶段:
1.文件包含:将#include扩展成文件正文
2.条件编译:根据#if和#ifdef将程序的某部分排除或者包含
3.宏展开:将出现宏引用的地方展开成相应的宏
2.编译阶段:
检查代码的规范性、是否有语法错误等,然后将其转换成低级机器语言。(C会转换成汇编语言)
3.汇编阶段:
将汇编代码转换成二进制目标代码
4.链接阶段:
”printf”的函数并没有在代码中实现,且在预编译中包含进的”stdio.h”中也只有该函数的声明
系统默认的搜索路径”/usr/lib”下进行查找,也就是链接到libc.so.6库函数中去,这样就能实现函 数”printf”了,而这也就是链接的作用。
函数库一般分为静态库和动态库两种。静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件 了。其后缀名一般为”.a”。动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以 节省系统的开销。
过程调用
………………………………………………………………………………………………………………………………………
在过程调用中主要涉及三个重要的方面:
1.传递控制:包括如何开始执行过程代码,以及如何返回到开始的地方
当进入过程Q的时候,程序计数器必需设为Q代码的起始位置。在返回的时候,程序技术的要设置为
调用Q那条指令的地址。
2.传递数据:包括过程需要的参数以及过程的返回值
3.内存管理:在过程执行的时候分配内存,以及在返回之后释放内存
………………………………………………………………………………………………………………………………………
在过程调用的时候,会把退出Q返回P的地址放入栈帧中,还包括被保存的 寄存器,局部变量,参数构造区。
所以递归本身就是一个隐式的栈实现,但是系统一般对于栈的深度有限制(每次一都需要保存当前栈帧的各种数据),
所以一般来说会把递归转换成显式栈来进行处理以防溢出。
数据存储:
局部数据必须放在内存中:
1.寄存器不足存放所有本地数据
2.对一个局部变量使用地址运算符&
3.某些局部变量是数组或结构,因此必须通过引用访问
………………………………………………
struct的内存对齐:
对于结构体内部成员,通常会有这样的规定:各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。
避免缓冲区的溢出:
1.避免缓冲区溢出,我们用更安全的方法,如:fgets, strncpy 等等。
2.栈随机化:栈的位置不确定,让缓冲区溢出没办法影响到,并且每次位置都不一样,就不怕被暴力破解。并且也可以把一段内存标记为只读,那么就避免因为缓冲区溢出而导致的重写。
3.破坏检测:使用认证机制(Stack Canaries)。简单来说,就是在超出缓冲区的位置加一个特殊的值,如果发现这个值变化了,那么就知道出问题了。
4.限制可执行:限制插入执行代码的能力,限制哪些内存区域能存放可执行代码。
参考资料:
不周山之读薄CSAPP
《深入理解计算机系统 》
CSAPP-过程调用,数据存储,缓冲区溢出的更多相关文章
- 【CSAPP笔记】9. 汇编语言——缓冲区溢出
x86-64 Linux 内存结构 先来看看一个程序在内存中是如何组织的.Linux 为每个进程维持了一段单独的虚拟地址空间.(进程是计算机科学中很深刻.很成功的一个概念.当我们在运行一个程序时,会得 ...
- C# 调用第三方DLL缓冲区溢出导致的异常
这个倒是少见的错误,纪录一下大佬. 先上异常 错误一:尝试读取或写入受保护的内存 错误二:未将对象引用设置到对象的实例 错误三: 托管调试助手“FatalExecutionEngineError”( ...
- CSAPP 缓冲区溢出试验
缓冲区溢出试验是CSAPP课后试验之一,目的是: 更好的理解什么是缓冲区溢出 如何攻击带有缓冲区溢出漏洞的程序 如何编写出更加安全的代码 了解并理解编译器和操作系统为了让程序更加安全而提供的几种特性 ...
- CSAPP:逆向工程【缓冲区溢出攻击】
逆向工程[缓冲区溢出攻击] 任务描述 掌握函数调用时的栈帧结构,利用输入缓冲区的溢出漏洞,将攻击代码嵌入当前程序的栈帧中,使程序执行我们所期望的过程. 主要方法 溢出的字符将覆盖栈帧上的数据,会覆盖程 ...
- CSAPP缓冲区溢出攻击实验(上)
CSAPP缓冲区溢出攻击实验(上) 下载实验工具.最新的讲义在这. 网上能找到的实验材料有些旧了,有的地方跟最新的handout对不上.只是没有关系,大体上仅仅是程序名(sendstring)或者參数 ...
- CSAPP缓冲区溢出攻击实验(下)
CSAPP缓冲区溢出攻击实验(下) 3.3 Level 2: 爆竹 实验要求 这一个Level的难度陡然提升,我们要让getbuf()返回到bang()而非test(),并且在执行bang()之前将g ...
- 【CSAPP笔记】7. 汇编语言——过程调用
一个过程调用包括将数据(以参数和返回值的形式)与控制从代码的一部分传递到另一部分.除此之外,在进入时为过程的局部变量分配空间,在退出的时候释放这些空间.数据传递.局部变量的分配和释放通过操纵程序栈来实 ...
- java调用Linux执行Python爬虫,并将数据存储到elasticsearch--(环境脚本搭建)
java调用Linux执行Python爬虫,并将数据存储到elasticsearch中 一.以下博客代码使用的开发工具及环境如下: 1.idea: 2.jdk:1.8 3.elasticsearch: ...
- 【CSAPP笔记】8. 汇编语言——数据存储
下面介绍一些C语言中常见的特殊的数据存储方式,以及它们在汇编语言中是如何表示的. 数组 数组是一种将标量数据聚集成更大数据类型的方式.实现数组的方式其实十分简单,也非常容易翻译成机器代码.C语言的一个 ...
随机推荐
- 高级软件工程2017第6次作业--团队项目:Alpha阶段综合报告
高级软件工程2017第6次作业--团队项目:Alpha阶段综合报告 Deadline:2017-10-30(周一)21:00pm (注:以下内容参考集大作业4,集大作业5,集大作业6,集大作业7 一. ...
- 学号:201621123032 《Java程序设计》第9周学习总结(
1:本周学习总结 1.1:以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容 2:书面作业 2.1: List中指定元素的删除(题集题目) 2.1.1:实验总结.并回答:列举至少2种在List ...
- httpClient 中的post或者get请求
httpClient相对于java自带的请求功能更加强大,下面就以例子的形式给出: //HttpClient Get请求 private static void register() { try { ...
- monog和github学习
1.导出服务器数据库到本地以json的格式储存:mongoexport -h ip -d dbname -c user -o D:\mondb\user.json2.导入本地Json到本地项目中:D: ...
- Python内置函数(47)——vars
英文文档: vars([object]) Return the __dict__ attribute for a module, class, instance, or any other objec ...
- es6学习笔记--Interator和Generator(以及for-of的用法)
这几天学习了遍历器和生成器,看着资料学,有点雾里缭绕的感觉,让人忍不住放弃,还好多看了好几遍,怼着资料里的例子让自己学会了Interator和Generator. Interator,中文简称:遍 ...
- Jetty入门(1-1)Jetty入门教程
一.Jetty是什么? 1.Jetty 是一个Java语言编写的,开源的Servlet容器和应用服务器. Jetty 极度轻量级.高便携性.功能强大.灵活和扩展性好,而且支持各种技术如SPDY.Web ...
- Hibernate(四):Hello World
下载hibernate开发包: 在本章之前需要继承hibernate开发插件到eclipse,详细操作请参考我的博文:<Hibernate(一):安装hibernate插件到eclipse环境& ...
- *Boosting*笔记
集成算法之boosting 集成方法 1. Parallel methods: 1. bagging 2. Random Forest 2. Sequence methods: 1. ...
- eclipse下如何使用Hibernate反转工程生与数据库对应的实体类和映射文件(以MySQL为例)
首先需要为eclipse添加对Hibernate的支持(也就是下载的Hibernate中的jar包),下载方法另查,这里不多做阐述. 想要使用反转工程,首先要下载Hibernate反转工程的插件Jbo ...