【问题标题】:Difference between declaring shellcode as a char[] array and char*?将 shellcode 声明为 char[] 数组和 char* 之间的区别?
【发布时间】:2011-12-17 05:49:40
【问题描述】:

大家好,

我正在尝试学习基本的 shellcoding,但我遇到了一些奇怪的事情,希望有人可以向我解释。我以两种方式编译了以下代码:将 shellcode 声明为数组和 char*。当我将 shellcode 声明为数组时,linux 检测到我正在尝试执行数据,并且在第一条指令上出现段错误。但是,当我将 shellcode 声明为 char* 时,所有的 shellcode 都会执行并且我得到一个“Hello world!”。编译器如何以不同的方式处理这两个声明,为什么一个以存在于不受保护的内存中的 shellcode 结尾?提前致谢。

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

/* This declaration ends in a segfault */
//char shellcode[] =

/* This declaration ends in successful execution */
char* shellcode = 

/* Shellcode prints "Hello world!" and exits */    
"\xeb\x1f\x48\x31\xc0\x48\x31\xdb\x48\x31\xc9\x48\x31\xd2\xb0\x04\xb3\x01\x59\xb2\x0c\xcd\x80\x48\x31\xc0\xb0\x01\x48\x31\xdb\xcd\x80\xe8\xdc\xff\xff\xff\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x21";

int main()
{
    void (*f)();
    f = (void (*)())shellcode;
    (void)(*f)();
}

【问题讨论】:

    标签: c arrays pointers shellcode


    【解决方案1】:

    当您将其声明为char[] 时,内存在堆栈上。当您将其声明为 char* 并为其分配字符串文字时,内存位于可执行映像本身中。 Linux 不喜欢您在堆栈上执行代码,但您可以在可执行映像的那部分执行内存。那是因为它试图避免某种类型的堆栈溢出攻击,人们可以用一些任意指令溢出堆栈然后执行它们。

    您可以在 Linux 上使用 mprotect 设置内存区域的权限,在 Windows 上使用 VirtualProtectEx。这样你就可以显式设置内存的权限为可执行。

    【讨论】:

      【解决方案2】:

      在您的第一种情况下:

      char shellcode[] =
      

      这会将字符串文字作为本地数组放在堆栈上。堆栈和堆内存通常没有执行权限(出于明显的安全原因)。

      在你的第二种情况下:

      char* shellcode = 
      

      字符串存在于静态内存中 - 通常与程序二进制文件的其余部分位于同一区域 - 这是可执行的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-20
        • 1970-01-01
        • 2013-02-19
        • 2014-11-07
        相关资源
        最近更新 更多