标签:简化 void off 并且 解决方案 数据结构 log 两种 包括
虚拟地址空间:CPU从一个有
N=2^n
个地址的地址空间中生成虚拟地址。物理地址空间与系统中物理存储器的M个字节对应。
Intel core i7存储器系统
Linux虚拟存储器系统
vm_start:指向这个区域的起始处
vm_end:指向这个区域的结束处
vm_prot:描述这个区域内包含的所有页的读写许可权限
vm_flags:描述这个区域内的页面是与其他进程共享还是私有的。
vm_next:指向链表中下一个区域结构。
#include <unistd.h>
#include <sys/mman.h>
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
//成功时则返回指向映射区域的指针,出错则为-1
- 删除已存在的用户区域。删除当前进程虚拟地址用户部分中的已存在的区域结构。
- 映射私有区域。为新程序的文本、数据、bss和栈区域创建新的区域结构。所有这些新的区域都是私有的、写时拷贝的。文本和数据区域被映射为a.out文件中的文本和数据区。bss区域是请求二进制零的,映射到匿名文件,其大小包含在a.out中。栈和堆区域也是请求二进制零的。
- 映射共享区域。如果a.out程序与共享对象(或目标)链接,比如标准C库libc.so,那么这些对象都是动态链接到这个程序的,然后再映射到用户虚拟地址空间中的共享区域内。
- 设置程序计数器(PC)。execve做的最后一件事情就是设置当前进程上下文中的程序计数器,使之指向文本区域的入口点。
下一次调度这个进程时,它将从这个入口点开始执行。Linux将根据需要换入代码和数据页面。
Linux根据需要换入代码和数据页面:
void bufoverflow(){
char buf[64];
gets(buf); //gets函数拷贝一个任意长度的串到缓冲区。
return ;
}
如何修改?
void bufoverflow(){
char buf[64];
fgets(buf); //fgets函数限制了输入串的大小
return ;
}
void leak(int n){
int *x= (int *)Malloc(n * sizeof(int));
return ; //x没有释放就返回了函数
}
如果反复调用leak()函数,那么堆里就会慢慢充满垃圾,会占用整个虚拟地址空间。
结对学习内容
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 195/195 | 1/1 | 10/10 | |
第三周 | 314/706 | 1/2 | 15/25 | |
第五周 | 254/960 | 1/3 | 10/35 | |
第七周 | 24/1759 | 1/4 | 15/50 | |
第九周 | 1207/2966 | 2/6 | 15/65 | |
第十一周 | 147/3113 | 2/8 | 20/85 |
计划学习时间:15小时
实际学习时间:20小时
2017-2018-1 20155201 《信息安全系统设计基础》第十一周学习总结
标签:简化 void off 并且 解决方案 数据结构 log 两种 包括
原文地址:http://www.cnblogs.com/zhuohua/p/7955687.html