>백엔드 개발 >Golang >디스크에 쓰지 않고 메모리에서 바이너리를 어떻게 실행할 수 있나요?

디스크에 쓰지 않고 메모리에서 바이너리를 어떻게 실행할 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2024-11-25 15:32:15573검색

How Can I Execute a Binary from Memory Without Writing to Disk?

디스크 쓰기 저장 없이 메모리에서 바이너리 실행

프로그램에서 변수 내에 바이너리를 내장하고 실행 방법을 찾고 있습니다. 디스크 쓰기 저장이 없습니다. 여기에는 메모리에서 직접 바이너리를 실행하는 메커니즘을 찾는 것이 포함됩니다.

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])))()

참고:

  • 위에 언급된 기술은 플랫폼별로 다르며 Linux 시스템에서만 작동할 수 있습니다.
  • 주의해서 사용해야 합니다. 메모리에서 직접 코드를 실행하면 보안 취약점이 발생할 수 있다는 점을 고려하세요.
  • 메모리 권한을 조작할 때는 주의를 기울이고 의도하지 않은 동작을 방지하기 위해 필요한 모든 검사가 이루어졌는지 확인하는 것이 중요합니다.

위 내용은 디스크에 쓰지 않고 메모리에서 바이너리를 어떻게 실행할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.