1

我正在阅读一本关于 hacking 内核的书,作者不断回到的一个领域是 shell 代码,许多内核 hacking 尝试试图找到一种执行 shell 代码的方法。有人可以详细说明这个主题,特别是你能澄清“shell代码”吗?

shell 代码如何绕过 *NIX 系统中的 sudo 或不是 Windows 机器中的管理员?是否有非特定于操作系统的 shell 代码攻击示例?我认为必须针对特定的操作系统。

4

4 回答 4

1

本质上,它是在寻找缓冲区溢出或类似技术,允许您将恶意代码插入以 root 身份运行的进程中。

例如,如果您使用了固定大小的缓冲区并且超出了该缓冲区,则您实际上可以覆盖内存内容并使用它来执行恶意负载。

于 2012-09-17T16:41:17.397 回答
1

一个简单的 shell 代码片段可以让你回味无穷:

/bin/sh

或在 C 程序中:

system("/bin/sh");

如果您可以引导您的漏洞利用执行这样的代码行(例如,通过劫持程序预期控制路径的缓冲区溢出),您会得到一个带有受害者权限的 shell 提示,然后您就进入了。

于 2012-09-17T16:43:07.007 回答
1

Shell 代码是利用漏洞时使用的有效负载,该漏洞用于创建攻击者可以控制机器的命令 shell。

典型的 shell 代码在运行时可能会打开网络连接并cmd.exe在 Windows 机器(或/bin/shLinux/unix 上)管道stdinstdout网络连接上生成。攻击者可以从他的机器完成连接并输入命令并获得反馈,就好像他坐在受感染的机器上一样。

缓冲区溢出不是 shell 代码。它是被利用来执行shell代码的漏洞。

利用缓冲区溢出将 shell 代码复制到用户机器并覆盖程序堆栈上的返回地址。当当前执行的函数返回时,处理器跳转到上传的 shell 代码,为攻击者创建 shell。

有关利用缓冲区溢出的更多信息,请查看Smashing the Stack for Fun and Profit

您可以尝试使用该-fno-stack-protector标志,gcc但我不太熟悉 OSX 或它可能使用的任何堆栈保护。

如果您想解决缓冲区溢出问题,现代编译器和现代操作系统都有保护措施,这使得这变得困难。你最好的选择是给自己一个 Linux 发行版并关闭它们。有关禁用这些保护的更多信息,请参阅此问题

请注意,执行 shell 代码不需要缓冲区溢出。我已经演示了使用命令注入漏洞打开远程 shell 来上传和执行批处理文件。

于 2012-09-17T16:47:19.203 回答
1

基本上,当程序运行时,与其相关的所有内容(变量、指​​令等)都作为缓冲区存储在内存中。

内存本质上是 RAM 中的一大堆位。

因此,就我们的示例而言,假设有一个变量Name存储在位#1-10 中。假设第 11-30 位用于存储指令。很明显,程序员期望Name长度为 10 位。如果我给出一个 20 位长的名称,它的缓冲区会溢出到保存指令的区域。所以我要设计我的后 10 位,Name这样指令就会被顽皮的指令覆盖。

' innocentmeNAUGHTYCOD'

那是攻击。

尽管并非所有实例都如此明显,但几乎每一段大代码中都存在一些漏洞。这完全取决于你如何利用它。

于 2012-09-17T16:54:17.947 回答