ошибка шелл-кода Ошибка сегментации (ядро сброшено) - PullRequest
0 голосов
/ 03 декабря 2018

Я новичок в шелл-кодировании. Я пытаюсь написать шелл-код для (привет, мир), так что это мой первый код с нулевыми байтами:

global _start

section     .text

_start:                                         ;tell linker entry point

    mov     edx,len                             ;message length
    mov     ecx,msg                             ;message to write
    mov     ebx,1                               ;file descriptor (stdout)
    mov     eax,4                               ;system call number (sys_write)
    int     0x80                                ;call kernel

    mov     eax,1                               ;system call number (sys_exit)
    int     0x80                                ;call kernel

section     .data

msg     db  'Hello, world!',0xa                 ;our dear string
len     equ $ - msg                             ;length of our dear string

, и это мой второй код после удаления нулевого x00 !!

global _start

section     .text

_start: 
                                            ;tell linker entry point
    xor     edx,edx     
    mov     dl,len                             ;message length
    mov     ecx,msg                             ;message to write
    xor     ebx,ebx
    mov     bl,1                               ;file descriptor (stdout)
    xor     eax,eax
    mov     al,4                               ;system call number (sys_write)
    int     0x80                                ;call kernel
    xor     eax,eax
    mov     al,1                               ;system call number (sys_exit)
    int     0x80                                ;call kernel

section     .data

msg     db  'Hello, world!',0xa                 ;our dear string
len     equ $ - msg                             ;length of our dear string

я скомпилирую его для проверки:

nasm -f elf32 -o hello-без-null.o hello-без-null.asm

ld -o hello-без-null hello-без-null.o

его работа, когда я запускаю его ./hello-without-null

чем я использовал: objdump -d привет-без-ноль -M intel

и вот результат:

Disassembly of section .text:

08048080 <_start>:
 8048080:   31 d2                   xor    edx,edx
 8048082:   b2 0e                   mov    dl,0xe
 8048084:   b9 9c 90 04 08          mov    ecx,0x804909c
 8048089:   31 db                   xor    ebx,ebx
 804808b:   b3 01                   mov    bl,0x1
 804808d:   31 c0                   xor    eax,eax
 804808f:   b0 04                   mov    al,0x4
 8048091:   cd 80                   int    0x80
 8048093:   31 c0                   xor    eax,eax
 8048095:   b0 01                   mov    al,0x1
 8048097:   cd 80                   int    0x80

затем я конвертирую его в шелл-код:

objdump -d./hello-without-null|grep '[0-9a-f]:' | grep -v 'file' | cut -f2 -d: | cut -f1-6 -d '' | tr -s '' |tr '\ t' '' | sed 's / $ // g' | sed 's / / \ x / g' | paste -d '' -s | sed 's / ^ / "/' | sed 's/ $ / "/ g '

вывод:

" \ x31 \ xd2 \ xb2 \ x0e \ xb9 \ x9c \ x90 \ x04 \ x08 \ x31\ xdb \ xb3 \ x01 \ x31 \ xc0 \ xb0 \ x04 \ xcd \ x80 \ x31 \ xc0 \ xb0 \ x01 \ xcd \ x80 "

когда я проверяю его, я идуt эта ошибка:

Длина шелл-кода: 25 Ошибка сегментации (сброшено ядро)

мой код c для тестирования:

#include<stdio.h>
#include<string.h>

unsigned char code[] = \
"\x31\xd2\xb2\x0e\xb9\x9c\x90\x04\x08\x31\xdb\xb3\x01\x31\xc0\xb0\x04\xcd\x80\x31\xc0\xb0\x01\xcd\x80";

int main()
{

        printf("Shellcode Length:  %d\n", strlen(code));

        int (*ret)() = (int(*)())code;

        ret();


}

так что жеэта проблема ??и как я могу это решить?

1 Ответ

0 голосов
/ 03 декабря 2018

Я решаю это, изменяя

код шелл-кода []

на

константный шелл-код символа []

и использование метода JMP / CALL / POP

...