問題タブ [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を使用してシステム コールをトラップできることは知っています。しかし、私がやりたいのは、システム コールを無視することです。ptraceがシステム コールをトラップし、その番号を確認して、無視する必要があるシステム コールの番号である場合、ptraceはシステム コールの進行を停止するか、システム コールをすぐに返すことができます。
ポイントは、 ptraceを使用してアプリケーションに特定のシステム コールを無視させる効果を持たせる必要があるということです。
c++ - PTRACE_SYSCALL と orig_eax
子プロセスが読み取りと書き込み以外のシステムコールを実行する場合(さらにこれらの呼び出しもフィルタリングしますが、それは別の話です)、子プロセスを強制終了したいのですが、デフォルトでいくつかのシステムコールが実行されます。
私は空のテスト子 (即座に終了) プログラムをコンパイルしました。また、子プログラムをフォークし、ptracing を有効にして実行する親プロセスもあります。親プロセスは PTRACE_SYSCALL を使用し、毎回 orig_eax をチェックします。私のテスト プログラムは、子が 49 回停止したことを報告します (これは、48 / 2 + 1 システム コールを意味すると思います)。
システム コール シーケンスが常に同じ (初期化) かどうか、および/または親で kill-on-syscall を開始できるタイミングと停止するタイミングを知ることができるかどうかを知りたいですか?
c - C-popenで開いたプロセスのPIDを取得します
私はCで書かれたプログラムを持っています。それはpopenを使って別のプログラムを開きます。そのプログラムのpidまたはそのためのある種のハンドラーを取得して、特定の制限時間後に、またはRAMとstdoutの制限を超えた場合にそれを強制終了したいと思います。これは、取得方法がわからないPIDを必要とするptraceを使用して実行する必要があると思います。
c - Linuxの特定のプロセスで使用されるメモリの量を計算する
子プロセスによって呼び出されたすべてのシステムコールをトレースし、その正確なメモリ使用量(共有メモリを除く)を判別するプログラムを作成しています。
これが私の計画です。
子プロセスを父プロセスに追跡させ、
子プロセスがシステムコールを行う場合、親プロセスはSIGTRAPを受け取ります。
次に、ptrace(PTRACE_PEEKUSER、child_pid、4 * ORIG_EAX、NULL)を使用してシステムコールIDを取得します。
idがSYS_brk、SYS_sbrk、SYS_mmap2、SYS_mmap、SYS_mremap、SYS_munmap、
呼び出しのパラメータを取得し、メモリ使用量を計算することができます。
でもそれは私を悩ませます
計算方法がわかりません。
SYS_mmap2には6つを超えるパラメーターがありますが、どのように取得すればよいですか?
c - ptrace を使用して機械語命令を取得する
ptrace を使用してプロセスの指示を取得する簡単なプログラムを作成しました。ここでコードを見つけることができます
Ubuntu 64ビットでコンパイルして実行しました。
私が得たものは次のようなものです:
gdb を使用したとき、EIP: 400dab の下にある命令しか見ることができません... 7f の下にある命令が見つかりません...だから、間違っていたと思います...
私のコードが間違っている理由と、正しい EIP と指示のみを印刷する方法を誰かが説明できますか?
c - プロセスがより多くの子を生成するのを防ぐ方法
私は、大学の LAN で ACM-ICPC のような競技を実施するためのオンライン審査員に取り組んでいます。そのためには、サーバー上で悪意のあるプログラムが実行されないように、裁判官が十分に安全である必要があります。(そのようなプログラムの例は次のようになります)
このプログラムtestcodeの実行可能ファイルを呼び出しましょう。
このプログラムは、ジャッジを実行しているサーバーをフリーズさせます。明らかに、私はそれが起こることを望んでいません。それを防ぐために、ptraceを使用してみました。次のコードを思いつきました:(このコードモニターの実行可能ファイルを呼び出しましょう)
このコードは、問題を引き起こす可能性のあるシステム コールをブロックするのに非常にうまく機能します。しかし、監視対象のコードに、テストコードのようなループ内の fork 呼び出しが含まれている場合、マシンはスラッシングのためにフリーズします。元のプロセスが強制終了されている間、私が理解できる理由は次のとおりです。モニターコードによって、その子は生き残り、フォーク爆弾を運び続けます。正常にデプロイできるようにモニター・コードを修正するにはどうすればよいですか?
PS: 移植性は問題ではありません。Linux 固有の回答を探しています。
編集: exec を呼び出す前に子プロセスの最大数を 0 に設定するために setrlimit を使用しました。
c++ - GDB strace は、無効なアドレスで ptrace を試みていることを示しています
gdb のデバッグ中に ni コマンドを実行すると、次のようなエラーが発生しました。
警告:
ブレークポイント 0 を挿入できません
。メモリ アドレス 0x3ac706a へのアクセス中にエラーが発生しました: 入出力エラー。
/lib/libc.so.6 からの siglongjmp () の 0xf6fa4771
gdb が遭遇する問題を調査するために、gdb を strace してそのような出力を取得します。
rt_sigprocmask(SIG_BLOCK、NULL、[RT_1]、8) = 0
ptrace(PTRACE_PEEKTEXT、651、0xcc4fdf60、[0x1cc4fe470]) = 0
ptrace(PTRACE_PEEKTEXT、651、0xcc4fe480、[0x3ac706a4506fa1d]) =
0 ], 8) = 0
…<br> ...
rt_sigprocmask(SIG_BLOCK, NULL, [RT_1], 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [RT_1], 8) = 0
ptrace(PTRACE_GETREGS, 27781, 0, 0x7fff8990e8b0 ) = 0
ptrace(PTRACE_PEEKTEXT, 27781, 0x3ac7068, [0x28b]) = -1 EIO (入出力エラー)
ptrace(PTRACE_PEEKTEXT, 27781, 0x3ac7068, [0x28b]) = -1 EIO (入出力エラー)
これは、gdb がメモリ アドレス0xcc4fe480で最初に ptrace を実行し、値0x3ac706a4506fa1d (実際には 8 バイトの値0x03ac706a4506fa1d ) を取得することを意味します。その後、その値の最初の 4 バイトからアラインされたアドレス0x3ac7068を取得します。これは無効なアドレスであり、gdb が ptrace に失敗する原因となります。
/proc/[pid]/maps の内容:
CBCE2000-CC353000 R-XP 00000000 08:03 295479 XXX.SO
CC353000-CC3F0000 R-P 00670000 08:03 295479 XXX.SO
CC3F0000-CC3F6000 RW
P 00:00 0
CC3FE000-CC3FF000 --- P CC3FE000 00:00 0
CC3FF000-CC4FF000 RWXP CC3FF000 00:00 0
CC4FF000-CC500000 --- P
CC4FF000
-xp 00000000 08:03 295545 yyy.so
cc673000-cc674000 ---p 00046000 08:03 295545 yyy.so
cc674000-cc675000 r--p 00046000 08:03 295545 yyy.so
cc675000-cc676000 rw-p 00047000 08:03 295545 yyy.so
アドレス0xcc4fe480が上記の太字のセクションからのものであることを示しています。このセクションは、.so または bin ファイルとは関係ありません。
この質問は、実際には別の質問http://stackoverflow.com/questions/9564417/gdb-cant-insert-internal-breakpointに関連していますが、まだ解決されていません。これらの問題は、前号の調査中に見つかりました。
ここで 3 つの質問があり
ます
。
最後のパラメーターが角括弧で注釈されているのはなぜですか? 戻り値を表すということですか?マニュアルページには、ptrace は PTRACE_PEEKTEXT に対して読み取った単語を返す必要があると書かれていますが、strace の出力はそれに従っていないように見えるため、最後のパラメーターに戻り値が表示されていると思われます。
2. 2 つの .so の間にセクション (太字の who) がありますが、どの i ノードにも関連付けられていません。そのようなセクションは何を表していますか?
3. Gdb はそのセクションから 1 ワードを読み取り、そのワードをアドレスとして使用しますが、実際には無効なアドレスです。このようなエラーの考えられる原因は何ですか?
ありがとう!
c - システムコールの追跡
私は次のコードを持っています:
次のように、奇妙な結果が得られています。
通常、strace
sshdセッションでストラッシングする場合、シェルに書き込むときに、読み取りおよび書き込みのsyscallへの呼び出しを常に取得します。しかし、その関数では、私はその(私が推測する偽の)システムコールを取得していません(あなたが見ることができるように):1、0など...
誰か助けてもらえますか?ありがとう。
c - ptrace を使用したシステム コールのトレース
コマンド (/bin/ls など) によって実行されるすべてのシステム コールを一覧表示するプログラムを作成しました。今私がやろうとしているのは、それに渡される可能性のあるすべてのシステムコール引数、環境変数、コマンドライン引数を見つけることです
例:ファイルを開いた場合。システムコール sys_access はファイルを正しく開きますか? しかし、これらの値を取得する方法は?
open、read、write、close などのシステム コールに対してこれを行いたい。
私の調査によると、これらはレジスタ (ebx - edx) にある必要があります。そうであれば、これらのレジスタ値は何を意味しますか? このリンクを取得しました。
しかし、私はそこから多くを得ることができませんでした。また、これに関するその他の参考文献は非常に役立ちます。
c - Ptraceを使用して、引数がシステムコールに対して正確に何を意味するかを調べます
私はすでに次の質問を投稿して解決策を得て、前進
するためにptraceを使用して、システムコールに渡されるすべての引数を見つけています。
プログラムは、ebx、ecx、edxの値を取得しています。今、オープンシステムコールのために私は次のようになりました
SYSCALL 5:ebx:bf9748af ecx:00008000 edx:00000000 / open
SYSCALL 5:ebx:80485b3 ecx:00000242 edx:000001b6 / open
私はstraceを使用しましたが、上記のように魔法のように変換されます。
open( "test.txt"、O_RDONLY | O_LARGEFILE)= 3
open( "test.txt"、O_RDWR | O_CREAT | O_TRUNC、0666)= 3
これを手動で行うにはどうすればよいですか?O_LARGEFILEの値を見つけることができる場所はありますか?
たくさん検索してこれに出くわしましたが、すべてが揃っているわけではありません。また、straceコードを読み取ろうとしましたが、この変換のコードは見つかりませんでした。
誰かが私を助けてくれるなら、それは私にとって非常に役に立ちます。また、これがstraceのどこに書かれているのかを知っているなら、私はそれを覗き見したいと思います。前もって感謝します。