디스크 쓰기 저장 없이 메모리에서 바이너리 실행
프로그램에서 변수 내에 바이너리를 내장하고 실행 방법을 찾고 있습니다. 디스크 쓰기 저장이 없습니다. 여기에는 메모리에서 직접 바이너리를 실행하는 메커니즘을 찾는 것이 포함됩니다.
C/C 접근 방식(mprotect() 시스템 호출 사용)
C 또는 C 사용(CGO를 통해) Go에서는 Linux의 mprotect() 시스템 호출을 활용하여 메모리 보호를 조작할 수 있습니다. 이 호출을 통해 메모리 영역의 권한을 변경하여 실행 가능하게 만들 수 있습니다. 영역이 실행 파일로 보호되면 해당 영역으로 점프하여 실행할 수 있습니다.
#include <sys/mman.h> int main() { // ... (Load binary into memory) // Change memory protection to executable mprotect(binary_buffer, binary_size, PROT_READ | PROT_WRITE | PROT_EXEC); // Jump into the executable region ((void (*)(void))binary_buffer)(); }
Go Approach(Assembly Techniques)
Go에는 메모리 보호를 지정할 수 있는 직접 시스템 호출. 그러나 어셈블리 기술을 사용하면 syscall.Syscall 함수를 사용하여 Go 코드에서 mprotect() 시스템 호출을 호출하여 메모리 보호를 조작할 수 있습니다.
import ( "syscall" "unsafe" ) // ... (Load binary into memory) // Change memory protection to executable syscall.Syscall(syscall.SYS_MPROTECT, uintptr(unsafe.Pointer(&binary_buffer[0])), uintptr(binary_size), syscall.PROT_READ|syscall.PROT_WRITE|syscall.PROT_EXEC) // Jump into the executable region (((func()) unsafe.Pointer(&binary_buffer[0])))()
참고:
위 내용은 디스크에 쓰지 않고 메모리에서 바이너리를 어떻게 실행할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!