3

私はしばらく遊んでいptraceます。私はこれまたはこれのようないくつかのチュートリアルに従いました。これまでのところ、ptrace-d子プロセスがある場合、次のことができます。

  • システムコールを検出し、レジスタを参照します。
  • PTRACE_PEEKDATAのオプションのおかげで、レジスタが指すアドレスに含まれる文字列をフェッチしますptrace
  • PTRACE_POKEDATAのオプションを使用して、これらのレジスタの値を変更し、子プロセスのユーザースペースのメモリ値を変更しますptrace

open私の問題は次のとおりです。たとえば、システムコールを検出したとしましょう。ebxレジスタに格納されているアドレスのおかげで、開くファイルのファイル名を変更できます。ただし、ファイル名を任意のサイズに変更できるのではないかと思います。変更する名前が非常に大きい場合(たとえば、元のファイル名の長さの50倍)、書き込むべきではないメモリをいじっていませんか?子供のメモリ空間にメモリを「割り当てる」必要がありますか?もしそうなら、これはどのように行われますか?

子プロセスはで実行されるプログラムであることに注意してくださいexecve。そのソースコードにアクセスできません。

4

1 に答える 1

3

openに渡されるパス名は、プログラムによって動的に割り当てられるか(つまり、ヒープまたはスタックのどこかにある)、コンパイル時定数の場合は読み取り専用セクションにある可能性があります。どちらの場合も、プログラムの他の部分がそれを使用している可能性があるかどうかわからないため、その内容を変更することはおそらく良い考えではありません。現在の長さを超えて書き込んだ場合は、隣接するメモリを確実に上書きします(これにより、ヒープメタデータの破損や他のランダム割り当てオブジェクトの破損などの微妙な問題が発生する可能性があります)。

子プロセスでメモリを割り当てる方法に関するいくつかのランダムなアイデア(完全にテストされていません)は次のとおりです。

  • 代わりにmmapsyscallを呼び出します(これはおそらくかなりトリッキーです)が、再生するメモリのページ(またはそれ以上)を取得します
  • 現在のスタックにいくらかのスペースを割り当てます(子のレジスターを変更しないでください。ただし、子がスタックのどの部分を使用しているかについての知識を使用して、未使用のセクションに一時オブジェクトを配置してください)。技術的には、子プロセスがこれと同じことを行うことは合法です(したがって、そのデータが破損する可能性があります)が、その可能性はほとんどありません。
  • スタックの遠端にあるものを非表示にします(ここでも、子供がこのトリックをプレイしていないと仮定します)。
  • mallocを呼び出すのは簡単だとは思いませんでしたが、「ptrace childlocatememory」をグーグルで検索しました。http ://www.hick.org/code/skape/papers/needle.txt ( ELFダイナミックリンカは、メモリを割り当てるためにそこへの呼び出しを構築します)。
于 2012-11-11T16:11:43.707 に答える