Shellcode 执行错误 C 中的分段错误

问题描述 投票:0回答:1

我尝试在c中执行shellcode。但我遇到了分段错误错误。 我在Kali Linux虚拟机上尝试过。 shellcode的目的是将hello shellcode打印到屏幕上 这是我的代码:

// shellcode_example.c
#include <stdio.h>

int main() {
    printf("Hello, Shellcode!\n");
    return 0;
}

这是十六进制代码的摘录:

gcc -o shellcode_example shellcode_example.c
objdump -d -M intel shellcode_example
080484b6 <main>:
  80484b6:   55                      push   ebp
  80484b7:   89 e5                   mov    ebp,esp
  80484b9:   83 ec 08                sub    esp,0x8
  80484bc:   68 60 86 04 08          push   0x8048660
  80484c1:   e8 aa fe ff ff          call   8048370 <puts@plt>
  80484c6:   83 c4 04                add    esp,0x4
  80484c9:   b8 00 00 00 00          mov    eax,0x0
  80484ce:   c9                      leave
  80484cf:   c3                      ret

这是shellcode执行:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>

// Shellcode: Bu, örnek bir NOP (no-operation) shellcode'dur
unsigned char shellcode[] = {
    0x90, 0x90, 0x90, 0x90, 0xC3 // Think, it's mine shellcode.
};

int main() {
    
    void *mem = mmap(NULL, sizeof(shellcode), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);

    if (mem == MAP_FAILED) {
        perror("mmap");
        return 1;
    }

    // Shellcode'ı tahsis edilen belleğe kopyala
    memcpy(mem, shellcode, sizeof(shellcode));

    // Bir işlev işaretçisi oluştur ve bellek konumuna dönüştür
    typedef void (*ShellcodeFunction)();
    ShellcodeFunction func = (ShellcodeFunction)mem;

    // Shellcode'ı yürüt
    func();

    // Tahsis edilen belleği serbest bırak
    munmap(mem, sizeof(shellcode));

    return 0;
}

有什么解决办法吗? 我尝试了互联网上的所有解决方案。

我尝试:

gcc -fno-stack-protector -z execstack -O OutputFileName yourShellCode.c

我使用了局部变量和全局变量,但没有改变。

c gcc segmentation-fault shellcode objdump
1个回答
0
投票

objdump -d -M intel shellcode_example

objdump
显示了两件事是错误的:

  1. 您已经构建了一个位置相关二进制文件
  2. 您已构建它来调用动态链接的
    libc
    (此处为
    puts
    )。

位置相关的二进制文件必须加载到它链接的地址(此处为

0x08048000
)。您不能在任意地址
mmap
该二进制文件并期望它能够工作)。

动态链接的二进制文件要求运行时加载程序设置该二进制文件的程序链接表(因此对

puts@plt
的调用将解析为
libc.so
内的符号定义)。但运行时加载程序完全不知道该二进制文件的存在,因此不会对该二进制文件执行任何操作

TL;DR:你的“shell 代码”必须避免使用绝对地址和动态链接(这就是为什么它通常用汇编语言编写)。

© www.soinside.com 2019 - 2024. All rights reserved.