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.
Следуйте по вопросу: я написал простую программу «hello world» в C, запустил otool -t на скомпилированном двоичном файле, заменил код text.txt на выход из otool (в том же \ x (...) формат) и попытался запустить. Seg fault 11, но не знаю, почему. Как я могу создать собственный «шелл-код»? –
@Charybdis, Трудно сказать, не видя больше вашего кода и/или двоичного кода. Вероятно, если вы запрограммировали его на C, вы связали C-библиотеку и среду выполнения для вашей ОС, последняя из которых вы, разумеется, не хотите включать. Попробуйте просто сделать очень простую основную процедуру и извлечь только этот код. –