ホームページ  >  記事  >  バックエンド開発  >  ディスクに書き込まずにメモリからバイナリを実行するにはどうすればよいですか?

ディスクに書き込まずにメモリからバイナリを実行するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-25 15:32:15546ブラウズ

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 アプローチ (アセンブリ手法)

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。