실행 파일 없이 완전히 새로운 프로세스를 실행할 수 있나요?

실행 파일 없이 완전히 새로운 프로세스를 실행할 수 있나요?

모든 파일 시스템이 읽기 전용으로 마운트된 64비트 시스템에서 루트가 아닌 32비트 애플리케이션을 실행하고 있다고 가정해 보겠습니다. 애플리케이션은 메모리에 64비트 ELF 이미지를 생성합니다. 그러나 읽기 전용 파일 시스템으로 인해 이 이미지를 파일로 덤프하여 작업을 수행할 수 없습니다 execve. 이 이미지에서 프로세스를 시작하는 지원되는 방법이 아직 있습니까?

참고: 여기서 가장 큰 문제는 32비트 모드에서 64비트 모드로 전환해도 아무런 효과가 없다는 것입니다.잠재적으로 신뢰할 수 없는 해킹. 이 문제가 해결되면 전체 문제는 사소한 것이 됩니다. 그냥 사용자 정의 로더를 만드세요.

답변1

응, 합격memfd_create그리고fexecve:

int fd = memfd_create("foo", MFD_CLOEXEC);
// write your image to fd however you want
fexecve(fd, argv, envp);

답변2

"userland exec"와 같은 것을 찾고 있습니다.여기서 구현됨. 기본적으로 여기에는 외부 참조가 없는 일부 위치 독립적 코드를 메모리에 로드하고 실행 가능한 것으로 표시하는 작업이 포함됩니다. 이 위치 독립적 코드는 이전에 실행된 실행 파일을 삭제하고 다시 로드합니다. 내가 작성한 userland 실행 파일을 최소한 수정해야 할 수도 있는 것 같습니다.

답변3

user732의 댓글과 링크가 오래되었습니다. 그러나 요점은 정확합니다. "userland exec" 구현이 필요하며 그 중 몇 가지가 있습니다. 어디에서나 Python 스크립트를 작성할 수 없지만 실행할 수 있는 경우 다음에서 유용한 스크립트를 찾을 수 있습니다.https://github.com/anvilsecure/ulexecve/. 저는 이 게시물을 썼으며 개요 블로그 게시물을 통해 이 게시물을 세상에 소개함으로써 좀 더 자세한 내용을 알고 싶을 수도 있습니다.https://www.anvilsecure.com/blog/userland-execution-of-binaries-directly-from-python.html

ulexecve32비트 모드에서 64비트 모드로 또는 그 반대로 전환하도록 위의 코드를 변경하는 것은 매우 간단합니다 . 이는 제가 고려하거나 구현한 적이 없는 흥미로운 사용 사례입니다. 그러나 @Ruslan이 제안한 접근 방식은 효과가 있을 것입니다.

noexecRapid7의 Mettle에는 기본적으로 동일한 작업을 수행하는 Mettle이라는 유틸리티도 있습니다 .https://github.com/rapid7/mettle. 이것은 C로 작성된 하위 수준 유틸리티이므로 또 다른 ELF 바이너리로 끝나고 이를 통해 사용자 영역 실행을 수행할 수 있습니다.

관련 정보