当应用程序被操作系统崩溃或杀死时,内存中会发生什么

Jun*_*aid 3 c memory debugging

出于我的研究目的,我想看看当程序因某些错误而被杀死/崩溃时操作系统所做的更改,比如说缓冲区溢出攻击.

让我在这里解释整个场景.

假设一个应用程序正在运行,其数据和代码在内存中.攻击者试图通过利用一些缓冲区溢出漏洞来劫持应用程序来访问计算机,但系统检测到它并杀死正在被利用的应用程序.现在我想看看操作系统在内存中是否有任何痕迹在它杀死进程时以及操作系统在杀死该进程之前采取了哪些必要的步骤.

此外,是否有任何工具可以在执行交流程序时实时跟踪内存更改?我们可以将内存快照数据反编译成一些人类可读的语言(汇编代码,可能)吗?

编辑::

以下示例

#include<stdio.h>
#include<conio.h>
#include<string.h>


int main()
{

int x;
char arr[4];
char * src = "haha";

printf("Before copying\n");

scanf("%d", &x);
if(x> 1)
    strcpy(arr, src);
printf("%s \n", arr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

它产生缓冲区溢出错误.在检查之前,它工作正常.输入大于1的x后,它会使程序崩溃.我想看看内存中是否留下任何痕迹,即使这个程序崩溃/被杀死.

谢谢.

nne*_*neo 5

操作系统通常不会检测正在进行的缓冲区溢出或其他恶意攻击,除非攻击导致程序中出现致命错误(例如,导致其访问坏内存或跳转到无效地址).在这种情况下,操作系统将像任何其他进程错误一样处理这种情况:在Windows上,调用结构化异常处理(SEH)机制来展开进程堆栈(这可能导致"未处理的异常"对话框); 在类UNIX系统上,操作系统向进程发送一个(通常是致命的)信号,该进程可以捕获该信号.

某些应用程序使用堆栈粉碎保护程序或其他保护功能进行编译,abort()如果堆栈损坏(指示编程错误或利用缓冲区溢出),则自动应用程序(或以其他方式退出).在这种情况下,应用程序本身会尝试终止.通常,这些机制使用终止方法,尽可能快地退出应用程序,以最大限度地减少它们被禁用的可能性.

在任何一种情况下,如果我们假设进程死亡,则OS将进程标记为死并停止给它任何CPU周期.该进程可以保留为"僵尸",以便其父进程可以确定其退出代码(在UNIX上),但以前使用的内存将被释放回操作系统.然后,OS可以将释放的存储器提供给其他进程.如果进程异常退出,某些系统和配置将在清理之前执行核心转储 ; 核心转储包含进程内存在被杀死之前的内容,并允许开发人员确定触发退出的错误原因.