c-当应用程序被操作系统崩溃或终止时,内存中会发生什么



出于我的研究目的,我想看看当程序因某些错误(比如缓冲区溢出攻击)而终止/崩溃时,操作系统会做出什么改变。

让我在这里解释一下整个场景。

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

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

编辑::

以下示例

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

int main()
{
int x;
char arr[4];
char * src = "haha";
printf("Before copyingn");
scanf("%d", &x);
if(x> 1)
strcpy(arr, src);
printf("%s n", arr);
return 0;
}

它正在产生缓冲区溢出错误。在检查之前,它运行良好。在给出大于1的x输入后,它会使程序崩溃。我想看看即使这个程序崩溃/终止,内存中是否还有任何痕迹。

谢谢。

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

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

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

我怀疑是否有任何系统可以检测到攻击并决定杀死受害的应用程序。所发生的情况是,作为攻击的结果,程序会损坏自己并变得不可运行。这时,操作系统终止它

"攻击"的比喻是误导性的,因为其中没有任何力量。这就像你因为吃得太多而呕吐,但没有人让你继续吃。

有时,当程序意外终止时,程序的最后状态会被保存并可以进行分析,但不是常规的。

最新更新