問題タブ [mprotect]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Linux 上の Python でインライン化されたマシン コードを呼び出すにはどうすればよいですか?
Linux で純粋な Python コードからインライン マシン コードを呼び出そうとしています。この目的のために、コードをバイトリテラルに埋め込みます
mprotect()
次にviaを呼び出してctypes
、コードを含むページの実行を許可します。最後にctypes
、コードを呼び出すために使用してみます。ここに私の完全なコードがあります:
このコードは、最後の行でセグメンテーション違反を起こします。
セグメンテーション違反が発生するのはなぜですか? 呼び出しは
mprotect()
成功を通知するので、ページでコードを実行することを許可する必要があります。コードを修正する方法はありますか?純粋な Python と現在のプロセス内で実際にマシン コードを呼び出すことはできますか?
(さらにいくつかの発言:私は実際に目標を達成しようとしているわけではありません-私は物事がどのように機能するかを理解しようとしています。また、5バイトのコードが落ちるケースを除外するために、2*pagesize
代わりにpagesize
呼び出しで使用しようとしましたmprotect()
ページ境界 -- とにかく不可能なはずです. テストには Python 3.1.3 を使用しました. 私のマシンは 32 ビットの i386 ボックスです. 考えられる解決策の 1 つは、純粋な Python コードから ELF 共有オブジェクトを作成し、それをロードすることです.経由ctypes
ですが、それは私が探している答えではありません:)
編集: 次の C バージョンのコードは正常に動作しています。
編集 2 : コードにエラーが見つかりました。この線
まず、インスタンスchar*
の先頭を指すctypes を作成します。 このポインターに適用されると、このポインターが指しているアドレスではなく、ポインター自体のアドレスが返されます。bytes
code
addressof()
コードの先頭のアドレスを実際に取得するために私が見つけた最も簡単な方法は
より簡単な解決策のヒントをいただければ幸いです:)
この行を修正すると、上記のコードが「機能」します (つまり、segfaulting の代わりに何もしません...)。
assembly - シンボルがないコードを GDB に強制的に実行させるにはどうすればよいですか?
(正当な理由で) メモリを割り当て、いくつかのコードをコピーし、mprotect() を使用して実行権限を付与し、そのコードを呼び出す C プログラムがあります。はい、これが移植性がなく安全でないことはわかっていますが、それには十分な理由があります。とにかく、アセンブリ コードを (si コマンドを使用して) gdb でシングル ステップする必要がありますが、それはできません。「選択したフレームのプログラム カウンタを含む関数はありません」
gdb にこのコードを強制的に実行させる方法はありますか? このタイプのものの代わりに使用する必要がある別のデバッガーはありますか?
ありがとう!
c++ - メモリ領域の保護フラグを取得する方法、フラグは mprotect の PROT_READ /PROT_EXEC です
mprotect() を使用して、メモリ領域に保護フラグを設定します。後で、このメモリ領域の保護フラグを復元したいと考えています。
私の質問は、メモリ領域の保護フラグを取得する方法ですか? フラグには PROT_READ が含まれます ...
私の回避策は、/proc/self/maps を手動で解析することです。しかし、この解決策は不器用です...
使えるシステムコールはないかな。
c - バイトレベルの書き込みアクセス保護?
カーネルレベルでオン/オフできるページテーブルエントリにビットがあるため、読み取りおよび/または書き込みアクセスのページを保護することが可能です。メモリの特定の領域を書き込みアクセスから保護する方法はありますか。たとえば、C 構造体に書き込み保護が必要な特定の変数があり、それらへの書き込みアクセスによってセグメンテーション違反とコア ダンプがトリガーされるとします。mprotect() の縮小機能のようなものは、ページ レベルで機能するため、ユーザー空間のバイト レベルで同様のメカニズムがあります。
ありがとう、カピル・ウパダヤイ。
c - プログラム全体を保護し、危険なコードを実行する
潜在的に危険な実行可能コードを(PROT_EXECを使用して)mmapprctl(PR_SET_SECCOMP, 1)
し、このmmapされたコードを呼び出して実行する小さなプログラムがあります。これはすべて問題なく、mmapされた領域をディスクに同期して評価の状態を「保存」し、後で再ロードすることを可能にします(ほとんどの場合、負荷分散のために別のマシンに)。ただし、この手法は常に機能するとは限りません。このコードは、mmapされた領域にないプログラムに変更を加えた可能性があり、この情報は失われるためです。
したがって、私がやりたいのは、コードを呼び出す前に、(このmmapされた領域を除く)すべてを読み取り専用にすることです。このようにして、実行可能コードが、自由にシリアル化/逆シリアル化できるmmapされた領域以外の状態を変更できないことが保証されます。
ところで、これはx86_64上のLinuxです
ありがとう
loader - 実行時に命令を挿入するときの SIGSEGV ハンドラーと mprotect およびループ効果。ハンドラが情報を取得できません ->si_addr
これに関連するさまざまなトピックを見てきましたが、私が抱えているこの特定の問題を見つけることができませんでした。
私が調べたこと: 実行時にコードを実行可能ファイルに挿入する C SIGSEGV Handler & Mprotect Linux プロセスのアドレス空間内のすべてのページを書き込み保護できますか? SIGSEGV をキャッチするシグナルハンドラを作成するには?
ハンドラーで保護を PROT_READ または PROT_WRITE に設定する必要がある場合、SIGSEGV を正常に処理できます。ただし、mmap を使用して命令を挿入しようとしてから、mprotect を使用して PROT_READ のみに設定し、インライン アセンブリを介して命令を実行すると、意図したとおりに SIGSEGV が発生しますが、ハンドラーは元のアドレスを取得できません。信号なので、PROT_READ | に mprotect できません。PROT_EXEC.
例:
結果の出力は次のとおりです。
受信シグナル番号: 11
プロセス 0
SIGSEGV からのシグナルは、このアドレスによって発生します: ? (なし)
//そのページを「再保護」できないため、上記の出力は繰り返しループします。
アーキテクチャ: x86 32 ビット OS: Ubuntu 11.04 - Linux バージョン 2.6.38-12-generic (buildd@vernadsky) (gcc バージョン 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4) )
何か案は?上記のロジックは、メモリへの単純な読み取りと書き込みには問題なく機能します。インライン アセンブリとは対照的に、実行時に命令を実行するより良い方法はありますか?
前もって感謝します!
linux - Linux で mprotect
PROT_NONEをmprotect
持つセグメントであり、SIGSEGV
によって処理される書き込みが原因で発生したsigaction
場合、sa_sigaction
を使用して障害が発生したアドレスを見つけることができsiginfo_t
ますsi_addr
。しかし、書き込まれようとしたデータとデータの長さを見つける方法はありますか?
プロジェクトでコピーオンライトメカニズムを試しているため、これを実行しようとしています。
android - Android mprotect()は保護を変更しません
私はAndroidのメモリの特定の領域の保護を変更するためにmprotect()を使用しようとしています。ただし、何をしてもリージョンを書き込み可能にすることはできません(何をしても、PROT_READ | PROT_EXECのままになります。Androidのメモリ保護について理解していないことがあるかもしれません。実行可能ファイルに書き込む権利を常に拒否しますか?メモリ領域?もしそうなら、これを無効にするシステムオプションがありますか?
コードは次のようになります。
mmapを使用してmprotectsyscallを直接呼び出してみましたが、役に立ちませんでした。PROT_READ|PROT_WRITEも試しました。
私はiOSで同様のことをしましたが、これは絶対にうまく機能します...
linux - Linuxでのメモリ許可の詳細の取得
割り当てメモリにmmapを使用しており、mprotectを使用して一部のページをPROT_READとしてマークし、いくつかのページをPROT_NONEとしてマークしています。私の実装には、メモリ権限に基づくロジックがあります。現在、メモリの場所情報を持っていますが、現在の保護状態を取得するにはどうすればよいですか?(PROT_READ / PROT_NONE)
c - C プログラミング: fork() 全体でメモリを保護
親のページを子のページから保護する必要があります
- mmap で MAP_ANONYMOUS フラグと fd = -1 を指定して shm_open を使用しないようにしました。
- 基になるメモリを fchmod で保護しようとしました。
現在、次のセットアップを利用しています。
親プロセスがページを読み書きできないように、子プロセスがページを保護できるようにする必要があります (mprotect などを使用)。
受信した出力は次のとおりです。
行 *z = 3 でセグメンテーション違反が発生することを期待している (というか、望んでいる) 場合。
残念ながら、子は TCP サーバーとしても機能し、ページをブロックする要求は TCP 接続を介して受信されるため、この機能が必要です (私が考えていない別の方法がない限り?)。
何かアドバイス?