태그 보관물: stdout

stdout

파이프에서 네이티브 바이너리를 실행하는 방법이 있습니까? 출력 바이너리를 실행하는 방법이 있습니까? 편집 :

echo 'main(){}' | gcc -xc - -o /dev/stdout | ???

유닉스 계열 시스템에서 출력 바이너리를 실행하는 방법이 있습니까?

편집 : 내가 쓸 수있는 샌드 박스 환경에서 g의 출력 ++ 실행하는 데 필요한 모든 (I 약속, 악성 아무것도) 파일을.



답변

나는 이것이 가능하다고 생각하지 않습니다. 간부 (2) 시스템 콜은 항상 파일 이름 또는 절대 경로 요구 (파일명 항상이다 char*). posix_spawn파일 이름에 대한 요구 사항도 비슷합니다.

가장 가까운 것은 출력을 명명 된 파이프로 파이프하고 파이프에서 실행을 시도하는 것입니다. 셸에서 --x--x--x비트가 설정 되지 않은 파일의 실행을 거부 할 수도 있지만 작동 할 수 있습니다 . 파이프를 작성하고 mkfifo(1)작동시킬 수 있는지 확인하십시오.

또 다른 방법은 표준 입력을 읽고, 파일을 템포 레이 영역에 쓰고, -x 비트를 설정하고, 포크와 execs를 삭제 한 파일을 작성하는 것입니다. inode와 내용은 프로그램 실행이 끝날 때까지 유지되지만 파일 시스템을 통해 액세스 할 수 없습니다. 프로세스가 종료되면 inode가 해제되고 스토리지가 사용 가능 목록으로 리턴됩니다.

편집 : Mat가 지적한 것처럼 로더가 실행 파일에서 요청 페이지를 요청하려고 시도하면 파일에서 무작위 탐색 트래픽이 생성되고 파이프에서는 불가능하므로 첫 번째 접근 방식이 작동하지 않습니다. 이것은 두 번째와 같은 접근 방식을 남깁니다.


답변

memfd syscall을 사용하는 솔루션 : 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);


답변

tcc를 시도 하면 중간 파일을 쓰지 않고도 한 단계로 프로그램을 컴파일하고 실행할 수 있습니다. gcc가 아니므로 문제가 될 수 있지만 놀랍도록 빠르므로 목적에 따라 gcc보다 더 좋을 수도 있습니다.


답변

그러면 코드 컴파일이 자동으로 실행되지만이를 수행하기 위해 파일 시스템에 파일이 생성됩니다.

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

(나는 현재 이것을 테스트하고 있지만, 이것이 확실하거나 그와 비슷한 것이 당신을 위해 효과가 있다고 확신합니다)

편집 : 파이핑의 목표가 물리 디스크를 속도 방정식에서 잘라내는 것이라면 중간 파일을 보관할 램 디스크 를 만드는 것을 고려 하십시오.


답변

@TheQUUX가 제안한 것처럼 자체 테스트하지는 않았지만 cling“LLVM 및 Clang 라이브러리 위에 구축 된 대화식 C ++ 인터프리터” 를 사용해 볼 수 있습니다 .

자세한 정보는 여기에서 확인하십시오 : https://cdn.rawgit.com/root-project/cling/master/www/index.html


답변