Существует ли способ выполнить собственный двоичный файл от канала?

Или, Вы могли попробовать некоторое awk волшебство. Howewer, я не хороший awk пользователь и не могу подтвердить, что это работало бы правильно, и как сделать это.

12
11.05.2012, 16:45
5 ответов

Я не полагаю, что это возможно. Должностное лицо (2) системный вызов всегда требует имени файла, или полный путь (имя файла всегда a char*). posix_spawn также имеет подобные требования для имени файла.

Самое близкое, которое Вы могли сделать, передать вывод по каналу в именованный канал и попытаться выполниться от канала. Это может работать, хотя оболочка может отказаться выполнять любой файл, который не имеет --x--x--x биты установлены. Создайте канал с mkfifo(1) и посмотрите, можно ли заставить это работать.

Другой подход должен был бы записать что-то, что читает стандартный вход, выписывает файл к временной области, устанавливает - x биты на нем, ветвления и должностные лица затем удаляет файл. inode и содержание останутся, пока программа не заканчивает выполняться, но это не будет доступно через файловую систему. Когда процесс завершится, inode будет выпущен, и устройство хранения данных будет возвращено к бесплатному списку.

Править: Как Циновка указывает, первый подход не будет работать, поскольку загрузчик попытается к странице спроса в исполняемом файле, который генерирует случайный, ищут трафик в файле, и это не возможно на канале. Это оставляет своего рода подход как второе.

9
27.01.2020, 19:55
  • 1
    я был бы действительно удивлен, работал ли прием канала - Вы не можете сделать случайный, ищет на канале, и не может mmap их - я вполне уверен, который будет раздражать загрузчик/компоновщика во время выполнения :) Ваше второе предложение кажется хорошим, хотя, ничего не может придумать без временного файла. –  Mat 07.10.2011, 17:05
  • 2
    @Mat - Я думаю, что Вы правы. Подкачка по обращению в исполняемом файле вызвала бы трафик произвольного доступа, который не будет работать над каналом. Иронически это, возможно, на самом деле работало над SVR2.0 (последняя версия, которая не использовала подкачку по обращению) - Только для показа моего возраста, я на самом деле раньше имел AT&T 3B2/400 однажды с SVR2.0 как O/S. –  ConcernedOfTunbridgeWells 07.10.2011, 18:49
  • 3
    Думая об этом еще немного, я - вполне уверенные exe упаковщики как UPX, может сделать распаковку и выполнение на медиа только для чтения. Измените любой тупик, который они прикрепляют на упакованных исполняемых файлах для чтения из канала, а не распаковки, и... могли бы работать. –  Mat 07.10.2011, 19:05
  • 4
    @Mat уже загрузили изображение, они не запускают новый процесс. Чтобы сделать подобное, у меня должен быть один из процессов для превращения произвольного перехода во входные данные (который считали бы уязвимостью системы обеспечения безопасности). –  Alex B 08.10.2011, 04:16
  • 5
    @Alex B ответов других людей: Вы конкретно спрашиваете, как превратить произвольный переход во входные данные. Почему Вы жаловались бы, когда предложено сделать точно это? Цель песочницы конкретно для предотвращения то, что Вы пытаетесь сделать? –  David Schwartz 08.10.2011, 08:10

Это автоматически выполнит компиляцию Вашего кода, но создает файл (temparaily) в файловой системе, чтобы сделать это.

echo 'main(){}' | gcc -xc -o /tmp/a.out && chmod u+x /tmp/a.out && /tmp/a.out && rm -f /tmp/a.out

(Я в настоящее время тестирую это теперь, но я вполне уверен это, или что-то близко к нему будет работать на Вас),

Править: Если цель Вашей передачи по каналу состоит в том, чтобы сократить физические диски из уравнения для скорости, полагайте, что создание диска поршня содержит промежуточный файл.

2
27.01.2020, 19:55
  • 1
    Это будет работать, конечно, но это упускает основную суть вопроса - для выполнения двоичного кода, который никогда не пишется к диску. –  rozcietrzewiacz 07.10.2011, 17:47
  • 2
    @rozcietrzewiacz Моя надежда была этим, был бы полезен, если бы цель состояла в том, чтобы легко выполнить отрывок кода на лету, не имея дело с необходимым физическим файлом. –  dtyler 07.10.2011, 17:59
  • 3
    Да, я понимаю. Но для этого, можно было просто использовать csh. –  rozcietrzewiacz 07.10.2011, 18:03

Вы могли попробовать tcc, который скомпилирует и выполнит программу за один шаг, не пишущий промежуточных файлов. Это не gcc, который может быть проблемой для Вас, но это эффектно быстро, таким образом, это может даже держать пари лучше, чем gcc в Ваших целях.

4
27.01.2020, 19:55

Как и предложил @TheQUUX , я не проверял его на себе, но вы можете попробоватьcling-«интерактивный интерпретатор C++, построенный поверх библиотек LLVM и Clang».

Подробнее здесь:https://cdn.rawgit.com/root-project/cling/master/www/index.html

0
27.01.2020, 19:55

Решение с использованием системного вызова memfd:https://github.com/abbat/elfexec

Он создает в памяти именованный файловый дескриптор, который можно использовать в exec. Псевдо -код:

#include <linux/memfd.h>
...
int memfd = syscall(SYS_memfd_create, "someName", 0);
...
write(memfd,... elf-content...);
...
fexecve(memfd, argv, environ);
7
27.01.2020, 19:55

Теги

Похожие вопросы