問題タブ [ptrace]
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 - ptraceを使用してchar*を取得する方法
私は現在、彼のシステムコールを知るためにプログラムを追跡しなければならないツールを開発しています。今のところ、システムコールの数値パラメータを取得することはできますが、文字列に適切にアドレス指定することはできません。
これが私が進む方法です:
そのコードで文字列の先頭(最初の3文字または4文字)を取得できますが、末尾が破損しているため、理由はわかりません。
解決策はありますか?ありがとうございました。
c - ptrace_detach、SIGINT、およびトレース/ブレークポイントトラップ(コアダンプ)
ptrace(PTRACE_ATTACH, ...)
プログラムの実行中に、、などを使用してプログラムをトレースしようとしていptrace(PTRACE_SINGLESTEP, ...)
ます。
すべて問題ないようですが、でトレースプログラムを終了すると、トレースプログラムからCTRL-C(で)デタッチしたいPTRACE_DETACH
のですが、このアクションを実行すると、トレースプログラムがエラーでクラッシュしますTrace/BPT trap (core dumped)
。
私の質問は、トレースされたプログラムをクラッシュさせずに適切にデタッチするにはどうすればよいですか?
SIGINT
信号をキャッチしている関数は次のとおりです。
編集:
他のコードは次のとおりです。
これは、トレースの最初の部分を実行するループの一部です。
ios - PT_CONTINUEは、iOSで「操作はサポートされていません」を返します
iOSの脱獄でptraceを使用する小さなデバッガーを作成したいと思います。
これで、他のプロセスを正常にアタッチできましたが、「PTRACE(PT_CONTINUE、m_tid、(caddr_t)1、data)」は常に「操作はサポートされていません」を返します。errno番号は45です。
PT_CONTINUEを使用してiOSでプロセスを再開できませんでしたか?アタッチした後にプロセスを再開する同等の方法はありますか?
linux - Linux でのリモート スレッドの作成
Windows でCreateRemoteThreadを使用していますが、Linux でも同じことが可能かどうかを知りたいです。Linuxでこれを行うことは可能ですか?
c - SINGLESTEP を使用して ptrace で戻り値を取得する
Linux 64ビットで小さなデバッガーに取り組んでいますが、システムコールの戻り値を探すのに苦労しています.
RIP 値をテストしています。つまり、PEEK_USERDATA を実行して ptrace を実行すると、RIP アドレスではなくオペコードが直接返されます (ここで、0x050f は SYSCALL のオペコードです)。
次に、システムコール名の引数などを取得します
問題は、これらのシステムコールの戻り値をどのように取得するかです。ptrace が PTRACE_SYSCALL を提供して、カーネルモードの開始/終了について警告することは知っていますが、RIP 値を直接確認したいので、SINGLESTEP を使用しています。私のリップがSYSLEAVEおよびSYSEXITオペコードと一致するが、一致しない場合。戻り値を確認できる唯一の方法は、実際には orig_rax を確認することですが、この方法では exit_group retval を取得できません。
Linux ABI が戻り値を RAX に格納することを望んでいることは知っていますが、ユーザーランドへの戻りを確認する方法がわかりません。
ありがとうございます。
c - 異なる実行フローに従ってstraceを実行するのはなぜですか?
シンボリックリンク攻撃を学習する次の記事を参照しています。
プログラムがスリープ状態にrm
なると、ファイル名であるarg [1](別の端末を使用)を使用して、同じファイルのシンボリックリンクを作成します。記事で述べたように実行したとき、リンクが指しているファイルに書き込んでいます。
次に、straceを使用して同じ引数を渡し、「cant open」を取得しました。これは、arg[1]として渡されたファイルにアクセスできないことを意味します。しかし、これは私が通常実行した場合には当てはまりません。straceはこれをどのように検出しますか?どんな助けも非常に価値があります。
このような攻撃を検出するために、ptraceを使用して独自のアプリケーションを作成しています。これを検出するためにiノード番号を使用しようとしましたが、アプリケーションはまだ渡したファイルのiノード番号を参照しています。
elf - LinuxでCからELF文字列テーブルを読み取る
バイナリの文字列テーブルを読み取るプログラムを書きたい。BinaryはREDHATlinux32で実行されているELFにあります。私は次のことを行いました-
- エルフヘッダーを読む
- すべてのセクションを読む
以下は私のプログラムの出力です。
Elf32_Shdrのsh_nameは基本的に、NULLで終了する文字列を実際に含む文字列テーブルへのインデックスであることを理解しています。このnullで終了する文字列を表示したいと思います。ここに質問があります-
- 上記の出力では、sh_type = 3(SHT_STRTAB)を持つセクションヘッダーのエントリが複数あることがわかります。だから私はどのようにインデックス(Elf32_Shdrのsh_name)をどのセクションにマップするのか分かりませんか?
sh_type = 3のセクションのElf32_Shdrを出力すると、次の出力が得られます-
c - システムコールのプロセスを追跡するには?
システムコールをトレースするプログラムをコーディングしようとしています。私はこの仕事をするのに苦労しています。fork() を呼び出してそれ自体 (コード) のインスタンスを作成し、結果の子プロセスを監視してみました。
目標は、親プロセスが子プロセスによって行われたすべてのシステム コールのインデックスを返し、それを画面に出力することです。どういうわけか、計画どおりに機能していません。
コードは次のとおりです。
このコードは、次のコードに基づいていました。
この出力は次のとおりです。
これは、exec システム コールのインデックスです。
wait() のマニュアルページによると:
私が理解している方法は、システムコールがユーザープログラムによって呼び出されるたびに、カーネルはシステムコールルーチンを実行する前にプロセスがトレースされているかどうかを最初に検査し、シグナルでそのプロセスを一時停止し、親に制御を返すということです. それはすでに状態変化ではないでしょうか?
c - (ORIG_EAX * 4)ptrace呼び出し
私はここで記事を読んでいて、以下にコピーしたコードスニペットを試していました:-
ORIG_EAX
正確に何が、なぜ4*ORIG_EAX
ptrace呼び出しに渡されるのかについて疑問があります。私は当初、、、などがレジスタの値が格納される特定の構造へのオフセットであると想定していORIG_EAX
ましたEBX
。ECX
そこで、待機直後にORIG_EAXの値を使用して出力することにしましたprintf("origeax = %ld\n", ORIG_EAX);
。値はでした11
。したがって、オフセットに関する私の以前の仮定は間違っていました。
wait
子の状態が変化すると(この場合はシステムコールが発行され)、コールが終了し、ORIG_EAXにシステムコール番号が含まれることを理解しています。
しかし、なぜORIG_EAX * 4がptrace呼び出しに渡されるのですか?
c - レジスターの ptrace ウォッチポイント
いくつかのデバッグ機能を備えた C プログラムを作成しています。ptraced プロセスのレジスタ アクセスにブレークポイントを設定する必要があります。それを行う最善の方法は何ですか?