Я пытаюсь выполнить двоичный исполняемый файл внутри C кода без использования system
, поскольку у него есть проблемы с безопасностью и управлением ресурсами.
Используемая здесь система - Debian Buster с ядром 5.4.0- 2-amd64 и g cc 9.2.1.
Я использовал метод в этом вопросе: выполнить двоичный машинный код из C
, который должен быть преобразован исполняется в шестнадцатеричном коде с xxd -i
, но постоянно получает Segmentation fault
.
Я использовал следующие процедуры:
Первая попытка
исполняемый файл. c:
#include <stdio.h>
int main(void)
{
printf("Hello, World!\n");
return 0;
}
после компиляции с помощью gcc -o executable executable.c
xxd -i executable
отобразит двоичный файл в шестнадцатеричном формате
Затем скопируйте и вставьте вывод в embedded.c
встроенный. c:
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
const unsigned char[] executable = {
0x7f, 0x45, 0x4c, 0x46, 0x02, 0x01,
...
};
int main(void)
{
void *buf = mmap(
NULL, sizeof(executable), PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_PRIVATE | MAP_ANON, -1, 0);
memcpy(buf, sizeof(executable);
__builtin___clear_cache(buf, buf + sizeof(executable) - 1);
int i = ((int (*) (void)buf)();
return 0;
}
при компиляции и запуске терминал отображает Segmentation fault
.
Вторая попытка
Еще один метод, который я попробовал, - использовать ld
, который также отображал Segmentation fault
:
встроенный. c:
extern const char _binary_executable_start[];
extern const char _binary_executable_end[];
// And same as the previous code.
Код был скомпилирован с использованием:
gcc -c -o embedded.o embedded.c
ld -r -b binary -o executable.o executable
gcc -o embedded embedded.o executable.o
И не удалось.
Есть что-то, что я пропустил или невозможно вставить двоичный файл в C код и запустить его?