gpt4 book ai didi

c - 将 shellcode 声明为 char[] 数组和 char* 之间的区别?

转载 作者:太空狗 更新时间:2023-10-29 16:53:33 24 4
gpt4 key购买 nike

大家好

我正在尝试学习基本的 shellcoding,我遇到了一些奇怪的事情,我希望有人能向我解释。我用两种方式编译了以下代码:将 shellcode 声明为数组和 char*。当我将 shellcode 声明为一个数组时,linux 检测到我正在尝试执行数据,并且我在第一条指令上遇到了段错误。但是,当我将 shellcode 声明为 char* 时,所有 shellcode 都会执行,并且我得到一个“Hello world!”。编译器如何以不同方式处理这两个声明,为什么其中一个以位于未 protected 内存中的 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)();
}

最佳答案

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

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

关于c - 将 shellcode 声明为 char[] 数组和 char* 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8542888/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com