3

出于我的研究目的,我想看看当程序由于某些错误(例如缓冲区溢出攻击)而被杀死/崩溃时,操作系统会做出哪些更改。

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

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

此外,是否有任何工具可以在 ac 程序执行时实时跟踪内存变化?我们可以将内存快照数据反编译为某种人类可读的语言(可能是汇编代码)吗?

编辑::

对于以下示例

#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;
}

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

谢谢。

4

2 回答 2

5

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

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

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

于 2012-09-20T04:02:23.430 回答
0

我怀疑是否有任何系统可以检测到攻击并决定杀死受害的应用程序。发生的情况是,由于攻击,程序会损坏自身并变得无法运行。此时,操作系统将终止它。

“攻击”的比喻具有误导性,因为没有涉及武力。这就像你因为吃太多而呕吐,但没有人让你继续吃。

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

于 2012-09-20T04:05:45.627 回答