漏洞利用 - 为什么不使用内联汇编器执行 shellcode?

逆向工程 C 开发 外壳代码
2021-07-03 18:14:57

执行shell代码的典型结构如下-:(代码片段取自here

char shellcode[] = "";             /* global array */
int
main (int argc, char **argv)
{
        int (*ret)();              /* ret is a function pointer */
        ret = (int(*)())shellcode; /* ret points to our shellcode */
                                   /* shellcode is type caste as a function */
        (int)(*ret)();             /* execute, as a function, shellcode[] */
        exit(0);                   /* exit() */
}

为什么不使用asm(inline assembler)来执行 shellcode 呢?那么它比做指针杂技要简单得多,例如将数组转换为函数指针,然后将该数组作为函数执行?

使用汇编器有什么缺点吗?使用数组执行 shell 代码有什么特别的好处吗?

3个回答

这种从数组执行的方法用于测试字节格式的 shellcode,这通常是提供 shellcode 的方式(参见http://shell-storm.org/shellcode/)。它还模拟了在漏洞利用中使用 shellcode 的通常方式。

内联汇编依赖于编译器,shellcode 开发人员可能会直接使用汇编器,例如 nasm 或 MASM。然而,如果你正在开发你自己的 shellcode,没有什么可以阻止你使用内联汇编,只要记住 shellcode 必须是位置无关的。

您引用的文章是关于编写新的 shellcode 以供以后利用。具体片段是关于测试shellcode。在测试台中如何跳转到它并不重要。

此外,本文中的方法可让您测试二进制 shellcode,这通常是您在创建漏洞利用负载时所拥有的全部内容。

因为,这种技术需要重写程序的代码......

而且,大多数情况下,您无法重写该.text部分...您只能访问存储在堆栈和/或堆中的数据。这就是我们使用 ROP 的原因。