【问题标题】:How to crash a system programmatically [closed]如何以编程方式使系统崩溃[关闭]
【发布时间】:2011-08-15 07:25:44
【问题描述】:

如果我可以编写一个会导致我的操作系统(不是我的应用程序)崩溃的用户程序,我会怎么做?

我正在考虑以某种方式将我的用户模式程序切换到内核模式并导致内存损坏。有可能吗?

注意:我不是在制造病毒。只是好奇。

【问题讨论】:

  • 要回答您的系统问题,我们需要知道您使用的操作系统。
  • 编写 0.9 版的图形驱动程序,应该这样做。 :)
  • “windows/linux”不是操作系统。
  • 简单的方法是将电源线从墙上拉出。以实用的方式执行此操作:robot.grab(powercode).pullSharply(Direction.AwayFromWall);
  • 在旧的 PET 计算机上,它是一个包含屏幕刷新率的内存位置。如果你将 255 戳到这个位置,它最终会导致屏幕过热并着火。这就是我的崩溃。

标签: c++ c operating-system kernel


【解决方案1】:

Windows 上的KeBugCheck 是记录在案的获得 BSOD 的方法。

您还可以尝试使用 native NT API 在 Windows XP 中删除 root 注册表项 (\REGISTRY)。

【讨论】:

    【解决方案2】:

    编写并加载一个调用 panic() 或实现等效的内核模块。

    或者简单地执行关闭或停止命令或实现它的系统调用。

    【讨论】:

      【解决方案3】:

      如果操作系统恰好是 Windows,请创建一个取消引用 NULL 指针的假驱动程序。碰撞!

      【讨论】:

        【解决方案4】:

        操作系统的整体理念是用户程序在正常情况下不会崩溃。当然,您仍然可以做一些事情,例如耗尽用于交换文件的分区上的磁盘空间,这会损害许多操作系统,或者您可以找到一个已知的漏洞,但没有非常简单的方法可以可靠地使其崩溃。

        【讨论】:

        • 我们都知道这在实践中的效果如何。 ;-)
        • @Andrew:有那么一瞬间,我读到你的名字叫 Anderson Cooper,我当时想,=O!!!
        • @Mehrdad:很抱歉让你失望了。 ;-)
        【解决方案5】:

        在 Linux 中,Alt-SysRq-C 将崩溃/重新启动您的内核。

        在 Windows 中,请参阅:https://web.archive.org/web/20110513143420/http://www.dailygyan.com/2008/09/some-methods-to-crash-your-windows.html [编辑:2021 年 3 月 8 日 - 由于网站关闭,切换到 Archive.org 链接。]

        【讨论】:

        • ublock origin 将此链接检测为恶意链接
        【解决方案6】:

        对于 Windows,一种可能性是编写一个内核模式驱动程序,该驱动程序锁定某个进程拥有的一些内存页面,然后终止该进程。将导致蓝屏“进程已锁定页面”。

        【讨论】:

          【解决方案7】:

          Linux:即使没有严格地使操作系统崩溃,您也可以通过分配大量内存(并读取/写入它以使分配实际生效并使操作系统大量交换)和分叉地很容易使其无法使用的进程。 “分叉炸弹”是关键字,甚至可以在 shell 脚本中完成。

          【讨论】:

          【解决方案8】:

          我认为您想要使操作系统崩溃的原因与此相关。您是在尝试模拟测试条件,还是只是出于好奇?

          如果您希望为了容错而重新创建和自动化崩溃,这里有两个选项。

          • 在内部运行虚拟机(vmware、VirtualBox)并简单地终止 VM 进程。或者,您可以给它非常低的优先级、丢弃设备或以其他方式模拟坏事。
          • 使用具有管理控制台的服务器。这将有一个 API 可以简单地关闭设备。

          如果您希望从操作系统本身崩溃,其他众多建议都很好。这些软件崩溃可以帮助重现恶意过程。一组类似的与硬件相关的崩溃也可能起作用(例如降低可编程风扇的速度和 CPU 过热)。

          您的请求背后的原因实际上非常重要,因为所有不同的故障都会产生略有不同的结果。

          【讨论】:

            【解决方案9】:

            尝试分配内存块,直到没有可用内存为止:

            int alloced = 0;
            for(;;)
            {
                char *alloc = malloc(10*1024*1024); // alloc 10 MB
                if(alloc != NULL)
                {
                    alloced += 10;
                    // edit: you have to memset the memory otherwise the system will give it back to you next time
                    memset(alloc, 0xab, 10*1024*1024);
                    printf(" alloced %d MB\n", alloced);
                }
            }
            

            编辑: 实际上,我现在刚刚在具有 2GB 内存和 3.3GB 交换空间的 64 位 linux 上进行了尝试:屏幕已冻结,我可以分配 4950MB 内存,但随后进程被系统杀死,linux 重新站稳了脚跟优雅地,所以,不,这不起作用:=)

            【讨论】:

            • 虚拟内存和分页意味着您将在那里待一段时间。并且至少在 Windows 中,您会在使操作系统崩溃之前 long 使应用程序自己的进程崩溃。
            • 诀窍是分配和访问足够的系统以使系统变得非常缓慢,但不会像 OOM 杀手追捕的那样慢。然后,在该内存上“工作”将使系统基本上无法使用。在我看来,Linux 在这种情况下并不是很健壮。
            • 你可以启动一个线程不断地在每个内存块上写东西吗? :D
            【解决方案10】:

            使用纯用户模式应用程序使操作系统崩溃意味着内核易受攻击。 如果操作系统经过良好测试,则不应发生这种情况。

            您可以通过向有问题的 3rd 方驱动程序发送垃圾 IO-CONTROL 来攻击它们来尝试 BSoD Windows。

            DeviceIoControl 函数 (Windows) http://msdn.microsoft.com/en-us/library/aa363216(VS.85).aspx

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-08-24
              • 2012-08-02
              • 2018-02-25
              • 1970-01-01
              • 2015-11-25
              • 1970-01-01
              • 2011-03-26
              相关资源
              最近更新 更多