2013-07-24 6 views
1

Testing Shellcode From C Bus Error 10Чтение и выполнение Shellcode из текстового файла

Выше был мой предыдущий вопрос, который участвует excuting шеллкода из программы с, когда код оболочки находится внутри источника. Он был решен Карлом Норумом и был связан с защитой памяти. У меня другая проблема, но она похожа. Вместо того, чтобы иметь код оболочки в том же файле, я хочу прочитать код оболочки из TXT-файла и выполнить его. Ниже я попытался маркировать раздел памяти как PROT_EXEC и прочитать содержимое .txt-файла в нем и выполнить. Но это не сработает, я получаю ту же ошибку, KERN_PROTECTION_FAILURE, я попытался использовать mprotect и mmap, чтобы отметить раздел памяти как PROT_EXEC.

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

int (*ret)(); 

unsigned char* buf; 

int main() 
{ 
    FILE* file; 
    file = fopen("text.txt", "rb"); 

    fseek(file, 0, SEEK_END); 
    unsigned int len = ftell(file); 
    fseek(file, 0, SEEK_SET); 

    buf = valloc(len); 
    fread(buf, 1, len, file); 

    fclose(file); 

    mprotect(buf, len, PROT_EXEC); 

    // I also tried mmap, but same error. 
    /* void *ptr = mmap(0, 1024, PROT_EXEC, MAP_ANON | MAP_PRIVATE, -1, 0); 

    if (ptr == MAP_FAILED) 
    { 
     perror("mmap"); 
     exit(-1); 
    } 

    memcpy(ptr, buf, 1024);*/ 

    ret = buf; 

    ret(); 

    return 0; 
} 

Это text.txt файл я читаю в его тот же привет мир кода, из моего предыдущего вопроса:

\x55\x48\x89\xe5\xeb\x33\x48\x31\xff\x66\xbf\x01\x00\x5e\x48\x31\xd2\xb2\x0e\x41\xb0\x02\x49\xc1\xe0\x18\x49\x83\xc8\x04\x4c\x89\xc0\x0f\x05\x31\xff\x41\xb0\x02\x49\xc1\xe0\x18\x49\x83\xc8\x01\x4c\x89\xc0\x0f\x05\x48\x89\xec\x5d\xe8\xc8\xff\xff\xff\x48\x65\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c\x64\x21\x0a 

Поскольку я копирование содержимого текстового файла в память PROC_EXEC, я не понимаю, почему я получаю KERN_PROTECTION_FAILURE.

ответ

5

Опираясь на мой ответ на Ваш предыдущий вопрос, вот решение:

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

int main(void) 
{ 
    FILE *file = fopen("text.txt", "r"); 
    unsigned char *buf; 
    int length = 0; 
    struct stat st; 
    int v; 

    // get file size and allocate. We're going to convert to bytes 
    // from text, so this allocation will be safely large enough 
    fstat(fileno(file), &st); 
    buf = valloc(st.st_size); 
    while (fscanf(file, "\\x%02x", &v) == 1) 
    { 
     buf[length++] = v; 
    } 

    fclose(file); 

    mprotect(buf, length, PROT_EXEC); 

    int (*ret)() = (int (*)())buf; 
    ret(); 

    return 0; 
} 

Единственная вещь, которая должна была изменить из вашей программы является цикл для преобразования текста ASCII в двоичные данные. Я использовал fscanf для целесообразности, но это довольно хрупко.

+0

Следуйте по вопросу: я написал простую программу «hello world» в C, запустил otool -t на скомпилированном двоичном файле, заменил код text.txt на выход из otool (в том же \ x (...) формат) и попытался запустить. Seg fault 11, но не знаю, почему. Как я могу создать собственный «шелл-код»? –

+0

@Charybdis, Трудно сказать, не видя больше вашего кода и/или двоичного кода. Вероятно, если вы запрограммировали его на C, вы связали C-библиотеку и среду выполнения для вашей ОС, последняя из которых вы, разумеется, не хотите включать. Попробуйте просто сделать очень простую основную процедуру и извлечь только этот код. –

Смежные вопросы