порождение оболочки в сборке Linux x86_64 - PullRequest
1 голос
/ 18 мая 2019

Я пытаюсь создать шелл-код, который порождает оболочку '/ bin / sh' в сборке Linux x86_64, и когда я выполняю его как исполняемый файл, он работает просто отлично.Проблема в том, что, когда я выгружаю двоичный код и помещаю его в строку, я получаю сообщение об ошибке:

'ошибка сегментации: дамп ядра'

    global _start

    section .text

    _start:

    push    59   ;sys_execve
    pop rax
    xor rdi,    rdi
    push rdi
    mov rdi,    0x68732F2f6e69622F ;/bin//sh in reverse
    push rdi
    mov rdi,    rsp ;pointer to the /bin//sh
    xor rsi,    rsi ;NULL
    xor rdx,    rdx ;NULL
    syscall

шелл-код в C без двоичного кода:

  #include <stdio.h>

  char sh[]="\x6a\x3b\x58\x48\x31\xff\x57\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x48\x89\xe7\x48\x31\xf6\x48\x31\xd2\x0f\x05 ";

  void main(int argc, char **argv)
 {
     int (*func)();
     func = (int (*)()) sh;
     (int)(*func)();
 }

Команда, которую я использовал для генерации своего шелл-кода:

nasm -felf64 shellcode.nasm -o shellcode.o
ld shellcode.o -o shellcode

Команда, использованная для генерации программы, которую я использую:

gcc -fno-stack-protector -z execstack shellcode.c

strace ./shellcode output:

    execve("./shellcode", ["./shellcode"], 0x7ffe19f431f0 /* 59 vars */) = 0
brk(NULL)                               = 0x5651f32c3000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=96319, ...}) = 0
mmap(NULL, 96319, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ff0d7a8d000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260\34\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2030544, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff0d7a8b000
mmap(NULL, 4131552, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ff0d748d000
mprotect(0x7ff0d7674000, 2097152, PROT_NONE) = 0
mmap(0x7ff0d7874000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e7000) = 0x7ff0d7874000
mmap(0x7ff0d787a000, 15072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7ff0d787a000
close(3)                                = 0
arch_prctl(ARCH_SET_FS, 0x7ff0d7a8c4c0) = 0
mprotect(0x7ff0d7874000, 16384, PROT_READ) = 0
mprotect(0x5651f168d000, 4096, PROT_READ) = 0
mprotect(0x7ff0d7aa5000, 4096, PROT_READ) = 0
munmap(0x7ff0d7a8d000, 96319)           = 0
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_ACCERR, si_addr=0x5651f168e020} ---
+++ killed by SIGSEGV (core dumped) +++
Segmentation fault (core dumped)

1 Ответ

3 голосов
/ 18 мая 2019

gcc -fno-stack-protector -z execstack shellcode.c не создает файл с именем shellcode. Создает a.out, потому что вы не использовали -o.

Поэтому запуск strace ./shellcode запустит двоичный файл, который вы создали с помощью NASM + ld. Но вывод strac, который вы показываете, не соответствует статическому исполняемому файлу. Может быть, это было из более раннего gcc вызова, когда вы забыли -z execstack

Запустите strace ./a.out, чтобы запустить файл, созданный с помощью gcc из текущей версии вашего источника.


Если вы передали неправильные аргументы execve, strace покажет, что он возвращает -EFAULT. Но просто segfaulting без этого, вероятно, означает, что исполняемый вами файл пытался перейти на неисполняемую страницу. Это будет идеально соответствовать бинарной сборке без -zexecstack.

...