問題タブ [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.
c++ - フック関数呼び出し linux mint
数日前、単一の呼び出し命令にパッチを当てて簡単なフック/迂回路を書きました。Ubuntu 12.xyz (32 ビット) で動作しましたが、Linux Mint 17.1 (32 ビット) に更新すると、セグメンテーション エラーが発生します。
私は2つのプロジェクトを持っています
- goodGuy という名前の関数を呼び出すターゲット プロジェクト
- ターゲット アプリケーションの呼び出し命令からのオフセットを上書きする dlopen() によってロードされたライブラリ プロジェクト
呼び出し命令のオフセットを上書きする前に、ページの保護を次のように変更します。
これは正常に機能します (0 を返します)。
プログラムをデバッグすると、呼び出しのアドレスに書き込もうとしてクラッシュします。
命令を上書きすることは許可されていないようですが、なぜですか?
ALSR を無効に-z execstack -fno-stack-protector
し、g++ でフラグを使用しました。
私のアプリケーションが命令を書くことを許可する方法を知っていますか?
ありがとう、アレックス
編集
申し訳ありませんが、コードは次のとおりです。
対象アプリケーション:
および共有ライブラリ コード:
addressOfCall を見つけるには、gdb でターゲット アプリケーションを開き、gdb target
main 関数を表示しdisas main
て、+29
c - libc によって作成/アクセスされる匿名領域はどれですか?
どの匿名仮想メモリ領域が libc によって作成/アクセスされているかを調べる方法はありますか?
mprotect
アドレス空間で VMA を使用するプログラムがあります。ただし、mprotect
libc がアクセスする領域の場合は、SIGSEGV が発生します。残念ながら、私がインストールしたシグナル ハンドラーは、libc ではなく、私のコードで発生した障害のみを処理します。
詳細には、可変引数を使用しているため、私が得ている障害がありprintf
ます。構造reg_save_area
内にある場所にアクセスしようとします。その場所は、以前編集va_list
した匿名の VMA に属しています。mprotect
それで、私がそれらの領域である前に、これらの領域がどれであるかを知ることはありmprotect
ますか? または、少なくともstdarg.h
配置する場所を知る方法はありreg_save_area
ますか?
最もクリーンな方法は、libc 内で発生する SIGSEGV を処理することです。しかし、私はそのような方法があるとは思えません。
注: libc の data/bss セグメントは匿名ではないため、簡単に識別できます。私mprotect
もその VMA を使用すると、未処理の SIGSEGV が発生するため、そうしないことにしました。
c++ - マルチスレッド アプリケーションで挿入された mprotect 呼び出しのフラグの切り替え
私は、動的ライブラリ ( .so
) が実行時にターゲット プログラムに挿入されるプロジェクト (動的インストルメンテーション) に取り組んでいます。ライブラリは、 を使用して独自のメモリを処理しmmap/munmap
ます。セキュリティ上の理由から、ライブラリ内の一部のマップされた領域は、ライブラリから公開された API を介してのみ書き込み可能にする必要があります。
私たちが行ったことは、ライブラリ関数のプロローグ/エピローグを使用してメモリ領域の書き込みフラグを切り替えることです。mprotect
PROT_WRITE
これは、シングル スレッド アプリケーションでは問題なく機能します。マルチスレッド アプリケーションの場合、(メモリが書き込み可能になるように) が設定された後に(同じプロセス内の別のタスクへの) コンテキスト スイッチが行われると、同じプロセス内の他のタスクがマップされたライブラリ領域に書き込むことができる場合があります。クリア前です。PROT_WRITE
foo
質問は次のとおりです。返されるまでプロセス内の他のタスクを無効にすることは可能ですか? そうでない場合、これをどのように回避することをお勧めしますか?
c - メイン スレッドのスタックで mprotect を呼び出すと常に失敗する
mprotect
メイン スレッドのスタックを呼び出そうとしましたが、常に失敗します。試行するたびに、ENOMEM
エラーが発生します。そして、/proc/[pid]/maps で確認したところ、スタック全体がアドレス空間にマップされています。ただし、mprotect
メイン スタックから子スレッドのスタックを正常に呼び出すことができます。によって変更されるのを防ぐメイン スレッドのスタックには、特別な何かが必要mprotect
です。しかし、これに関するドキュメントが見つかりません。誰にもアイデアがありますか?
ios - mprotect errno 22 iOS
iOS でジェイルブレイクされたアプリを開発していますが、呼び出し時に errno 22 が返されます
errno 22 は無効な引数を意味しますが、何が問題なのかわかりません。p をページ サイズの倍数になるように調整し、mprotect を呼び出す前に以前にメモリを割り当てました。
これが私のコードとサンプル出力です
そして出力:
memory - mips プラットフォームでメモリ変更を監視する方法
MIPS でメモリ破損の問題をデバッグしています。アドレスに特定の値を書き込む人を知りたいです。
x86-64 では、mprotect+sigsegv+sigtrap を使用して、指定したアドレスへのメモリ書き込みアクセスをログに記録できます。
sigsegv ハンドラーで mprotect を使用する場合、メモリの保護を解除する必要があります。そうしないと、プログラムが常にシグナル ハンドラーをトリガーします。また、シグナルハンドラでは、どのような値がメモリに書き込まれるかを知ることは容易ではありません。
ハードウェア ウォッチ ポイントについても、同様の問題があります。メモリが書き込まれた後ではなく、その前に例外が発生します。
とにかく、メモリに書き込まれる値を知りたいですか? そして、それが期待値である場合、メモリを再度保護して実行を継続できますか?
c - ヒープにある関数を呼び出すときのセグメンテーション違反
ここでルールとバッファを少し調整してmalloc
から、関数をバッファにコピーしようとしています。
バッファリングされた関数の呼び出しは機能しますが、関数内で別の関数を呼び出そうとすると、セグメンテーション エラーがスローされます。
なぜ何か考えはありますか?
foo
関数を次のように変更しない限り、このコードは segfault をスローします。
ノート:
コードはバッファに正常にコピーfoo
されます。いくつかの仮定を行ったことは知っていますが、私のプラットフォームでは問題ありません。