問題タブ [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.

0 投票する
0 に答える
531 参照

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 targetmain 関数を表示しdisas mainて、+29

0 投票する
2 に答える
99 参照

c - libc によって作成/アクセスされる匿名領域はどれですか?

どの匿名仮想メモリ領域が libc によって作成/アクセスされているかを調べる方法はありますか?

mprotectアドレス空間で VMA を使用するプログラムがあります。ただし、mprotectlibc がアクセスする領域の場合は、SIGSEGV が発生します。残念ながら、私がインストールしたシグナル ハンドラーは、libc ではなく、私のコードで発生した障害のみを処理します。

詳細には、可変引数を使用しているため、私が得ている障害がありprintfます。構造reg_save_area内にある場所にアクセスしようとします。その場所は、以前編集va_listした匿名の VMA に属しています。mprotect

それで、私がそれらの領域である前に、これらの領域がどれであるかを知ることはありmprotectますか? または、少なくともstdarg.h配置する場所を知る方法はありreg_save_areaますか?

最もクリーンな方法は、libc 内で発生する SIGSEGV を処理することです。しかし、私はそのような方法があるとは思えません。

注: libc の data/bss セグメントは匿名ではないため、簡単に識別できます。私mprotectもその VMA を使用すると、未処理の SIGSEGV が発生するため、そうしないことにしました。

0 投票する
1 に答える
322 参照

c++ - マルチスレッド アプリケーションで挿入された mprotect 呼び出しのフラグの切り替え

私は、動的ライブラリ ( .so) が実行時にターゲット プログラムに挿入されるプロジェクト (動的インストルメンテーション) に取り組んでいます。ライブラリは、 を使用して独自のメモリを処理しmmap/munmapます。セキュリティ上の理由から、ライブラリ内の一部のマップされた領域は、ライブラリから公開された API を介してのみ書き込み可能にする必要があります。

私たちが行ったことは、ライブラリ関数のプロローグ/エピローグを使用してメモリ領域の書き込みフラグを切り替えることです。mprotectPROT_WRITE

これは、シングル スレッド アプリケーションでは問題なく機能します。マルチスレッド アプリケーションの場合、(メモリが書き込み可能になるように) が設定された後に(同じプロセス内の別のタスクへの) コンテキスト スイッチが行われると、同じプロセス内の他のタスクがマップされたライブラリ領域に書き込むことができる場合があります。クリア前です。PROT_WRITE

foo質問は次のとおりです。返されるまでプロセス内の他のタスクを無効にすることは可能ですか? そうでない場合、これをどのように回避することをお勧めしますか?

0 投票する
2 に答える
181 参照

c - メイン スレッドのスタックで mprotect を呼び出すと常に失敗する

mprotectメイン スレッドのスタックを呼び出そうとしましたが、常に失敗します。試行するたびに、ENOMEMエラーが発生します。そして、/proc/[pid]/maps で確認したところ、スタック全体がアドレス空間にマップされています。ただし、mprotectメイン スタックから子スレッドのスタックを正常に呼び出すことができます。によって変更されるのを防ぐメイン スレッドのスタックには、特別な何かが必要mprotectです。しかし、これに関するドキュメントが見つかりません。誰にもアイデアがありますか?

0 投票する
1 に答える
1292 参照

ios - mprotect errno 22 iOS

iOS でジェイルブレイクされたアプリを開発していますが、呼び出し時に errno 22 が返されます

errno 22 は無効な引数を意味しますが、何が問題なのかわかりません。p をページ サイズの倍数になるように調整し、mprotect を呼び出す前に以前にメモリを割り当てました。

これが私のコードとサンプル出力です

そして出力:

0 投票する
0 に答える
163 参照

memory - mips プラットフォームでメモリ変更を監視する方法

MIPS でメモリ破損の問題をデバッグしています。アドレスに特定の値を書き込む人を知りたいです。

x86-64 では、mprotect+sigsegv+sigtrap を使用して、指定したアドレスへのメモリ書き込みアクセスをログに記録できます。

sigsegv ハンドラーで mprotect を使用する場合、メモリの保護を解除する必要があります。そうしないと、プログラムが常にシグナル ハンドラーをトリガーします。また、シグナルハンドラでは、どのような値がメモリに書き込まれるかを知ることは容易ではありません。

ハードウェア ウォッチ ポイントについても、同様の問題があります。メモリが書き込まれた後ではなく、その前に例外が発生します。

とにかく、メモリに書き込まれる値を知りたいですか? そして、それが期待値である場合、メモリを再度保護して実行を継続できますか?

0 投票する
3 に答える
3357 参照

c - ヒープにある関数を呼び出すときのセグメンテーション違反

ここでルールとバッファを少し調整してmallocから、関数をバッファにコピーしようとしています。

バッファリングされた関数の呼び出しは機能しますが、関数内で別の関数を呼び出そうとすると、セグメンテーション エラーがスローされます。

なぜ何か考えはありますか?

foo関数を次のように変更しない限り、このコードは segfault をスローします。

ノート:

コードはバッファに正常にコピーfooされます。いくつかの仮定を行ったことは知っていますが、私のプラットフォームでは問題ありません。