Maison >développement back-end >Golang >Comment puis-je exécuter un binaire depuis la mémoire sans écrire sur le disque ?

Comment puis-je exécuter un binaire depuis la mémoire sans écrire sur le disque ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-25 15:32:15603parcourir

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

Exécuter des binaires à partir de la mémoire sans écriture sur disque

Dans votre programme, vous avez intégré un binaire dans une variable et cherchez un moyen d'exécuter sans écriture sur disque. Cela implique de trouver un mécanisme pour exécuter le binaire directement à partir de la mémoire.

Approche C/C (utilisation de l'appel système mprotect())

Utilisation de C ou C (via CGO dans Go), vous pouvez exploiter l'appel système mprotect() sous Linux pour manipuler la protection de la mémoire. Cet appel vous permet de modifier les autorisations d'une région mémoire, la rendant exécutable. Une fois la région protégée comme exécutable, vous pouvez l'exécuter en y accédant.

#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)();
}

Approche Go (techniques d'assemblage)

Dans Go, il n'y a pas appels système directs qui vous permettent de spécifier la protection de la mémoire. Cependant, vous pouvez utiliser des techniques d'assemblage pour manipuler la protection de la mémoire à l'aide de la fonction syscall.Syscall pour appeler l'appel système mprotect() à partir du code Go.

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

Remarque :

  • Les techniques mentionnées ci-dessus sont spécifiques à la plate-forme et ne peuvent fonctionner que sur les systèmes Linux.
  • Vous devez examiner attentivement les implications de l'exécution du code. directement à partir de la mémoire, car cela peut entraîner des failles de sécurité.
  • Il est important de faire preuve de prudence lors de la manipulation des autorisations de mémoire et de s'assurer que toutes les vérifications nécessaires sont en place pour éviter tout comportement involontaire.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn