当前位置:首页 > 内存 > 正文

进程栈内存溢出会影响其他进程吗

  • 内存
  • 2024-05-22 16:09:22
  • 6339

一、进程内核栈,用户栈及Linux进程栈和线程栈的区别总结:线程栈空间是在其所属进程的堆区域中开辟的。线程和它所属的进程共享进程的用户空间,因此线程堆栈可以互相访问。起始地址和线程堆栈大小存储在pthread_attr_t中。堆栈的大小并不是用来判断堆栈是否越界,而是用来初始化缓冲区的大小(或者漏洞的大小),以避免堆栈溢出
进程内核堆栈,用户栈
1个进程栈
当内核创建一个进程时,它同时创建一个相应的栈,创建task_struct。每个进程都有两个堆栈,一个存在于用户空间的用户堆栈和一个存在于内核空间的内核堆栈。当进程运行在用户空间时,CPU堆栈指针寄存器中的内容就是用户堆栈地址。如果进程在内核空间,则CPU堆栈指针寄存器中的内容就是内核堆栈空间地址,使用内核堆栈。
2.进程用户栈和内核栈的切换
当进程因中断或系统调用而陷入内核态时,进程使用的栈也必须从用户栈转移到内核栈。
进程进入内核堆栈后,首先将用户态堆栈的地址存储在内核堆栈中,然后将堆栈指针寄存器的内容设置为内核堆栈的地址。这样就完成了从用户栈到内核栈的转换。当进程从内核态返回到用户态时,只需要在内核态行程结束时将内核栈中存储的用户栈地址恢复到堆栈指针寄存器中即可。这样就实现了内核栈和用户栈的相互转换。
所以我们知道,当我们从内核态转换到用户态时,被困在内核时用户栈地址就存储在内核栈中,但是当我们被困在用户态时怎么知道内核栈地址呢?核心?
关键是,当进程从用户态切换到内核态时,进程内核堆栈始终为空。这是因为当进程在用户模式下运行时,会使用用户堆栈。当进程进入内核态时,内核栈保存了进程在内核态运行时相应的可靠性,内核栈中保存的信息失效并全部恢复,因此每次进程退出进入内核时获取到的内核栈在用户模式下是空的(为什么?)。所以当进程落入内核时,只需将内核栈顶地址传递给栈指针寄存器即可。
3.内核堆栈的实现
Kernel-2.4和Kernel-2.6中内核堆栈的实现是不同的。
在Kernel2.4内核中,内核栈的实现为:
Uniontask_union{
Structtask_structtask;
Unsignedlongstack[INIT_STACK_SIZE/sizeof(long)];
};其中,INIT_STACK_SIZE的大小只能是8KB。
当内核给每个进程分配task_struct结构时,实际上是分配两个连续的物理页,最下面的页作为task_struct结构,上面的页作为栈。使用current()宏来访问当前正在运行的进程描述符。
注意:此时task_struct结构体位于内核堆栈中,内核堆栈实际可用大小约为7KB。
kernel-2.6中内核栈的实现是(kernel-2.6.32):
Unionthread_union{
Structthread_infothread_info;
Unsignedlongstack[THREAD_SIZE/sizeof(long)];
};
THREAD_SIZE的大小可以是4KB或8KB,thread_info占用52字节。
如果内核栈是8KB,Thread_info就在这块内存的起始地址,内核栈从栈底向下增长。因此,此时需要将当前的宏改为kernel-2.6。与thread_info关联的任务必须通过thread_info结构中的task_struct字段来获取。更多详细信息,请参见相应当前宏的实现。
structthread_info{
structtask_struct*task;
structexec_domain*exec_domain;
__u32flags;
__u32status;
__u32cpu;
…..
};
注意:此时task_struct结构不再位于内核堆栈区域中。
二、什么是内存溢出?还有什么是虚拟内存?内存缓冲区溢出是指向程序缓冲区写入超过正常长度的内容,导致缓冲区溢出,从而破坏程序的正常堆栈,导致程序执行其他指令,从而达到攻击系统崩溃的目的。缓冲区溢出的原因是程序员在编程时不仔细考虑用户输入参数时可能出现的异常情况。
一般情况下,向缓冲区填充随机数据导致溢出只会导致程序出现“segmentationfault”错误,无法达到攻击的目的。最常见的方法就是将要执行的十六进制机器码写入溢出缓冲区,并用溢出的方法覆盖程序正常返回地址的内容,将程序的返回地址指向溢出缓冲区的开头,这样就可以达到执行其他指令的目的。
缓冲区溢出漏洞可用于执行任意命令或覆盖系统文件,但缓冲区溢出通常用于执行Shell,如果存在缓冲区溢出漏洞的程序属于root且是suid程序,攻击者因此可以获取具有root权限并获得对系统的最终控制权的shell。
“缓冲区溢出”攻击显然利用了编程疏忽。root拥有的suid程序如果存在缓冲区溢出漏洞是非常危险的。
Windows操作系统使用虚拟内存来动态管理运行时交换文件。为了提供比实际物理内存更多的内存容量供使用,Windows操作系统占用了硬盘上的一部分空间作为虚拟内存。当CPU有请求时,会先读取内存中的数据。当内存容量不足时,Windows会将需要临时存储的数据写入硬盘。因此,计算机内存的大小等于实际物理内存容量加上“分页文件”(即交换文件)的大小。如有必要,页面文件会使用硬盘上的所有可用空间。如果条件允许,您应该尽可能使用此功能设置。