問題タブ [dynamic-analysis]
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.
memory - Intel の PinTool を使用してスタック ポインターの内容を取得する
objdump ユーティリティを使用すると、変数の相対アドレスを取得できます。たとえば、単純な C プログラムを考えてみましょう。
gcc でコンパイル:
$ gcc -g example.c -o example
ELF 情報については、dwarf フラグを指定して objdump ユーティリティを実行します。
$objdump --dwarf=info の例
出力:
私は次のようにしたい: -
- my_local などの変数のアドレスを取得したい。最初に DW_TAG_Variable、次に DW_AT_name、上から関数 -20 でベース レジスタによって指定された DW_AT_location を調べます。
質問: 実行時にベース レジスタの内容を知るにはどうすればよいですか。PinTool を使用して実装できますか。
より広い意味での質問: dwarf と Pintool からの情報が与えられたメモリ内のアドレスへの変数 my_local マップが必要です。
前もって感謝します。
c - GDB リバース デバッグを使用して関数呼び出しによる値の伝播を追跡するにはどうすればよいですか?
GDBリバースデバッグを使用して、プログラム内の関数呼び出しと変数コピーによる値の伝播を追跡する方法を見つけようとしています。私は過去に GDB をよく使用していましたが、リバース デバッグは比較的初めてです。
例を挙げて質問を組み立てるのが最も簡単だと思います。このプログラムを見てください。
プログラムをコンパイルし、リバース デバッグを使用して GDB を起動し、コンパイル済みの実行可能ファイルを実行します。printf
inにブレークポイントを設定しFnA
、プログラムの実行を開始すると、そのブレークポイントに到達します。x
ここからは、「最後に書かれたのはどこですか?」という質問に答えたいと思います。私はすることができたしwatch -l x
、その後reverse-continue
。ただし、スタック上での有効期間が始まったFnA
場所であるため、それはの最初に移動するだけです。x
私が本当に興味を持っているのは、の値がどこから来たかということですi = 5
。その時から、本当にmain
x
i = 5
x
次のように、関数パラメーターと変数のコピーを介して伝播されましたmain:i -> FnC:z -> FnB:y -> FnB:y_copy -> FnA:x
。
明らかに、GDB-fu と人間の直感を組み合わせることでこれを理解できますが、このプロセスを可能な限り自動化しようとしています。最終的には、人間の直感と GDB-fu を使用するのはかなり面倒な、より複雑なソフトウェアでこれを試してみたいと思います。
リバースデバッグを使用して GDB でこれを達成する便利な方法はありますか? GDB は、これらの値の伝播を自動的に把握して追跡することができますか?
PS: 具体的には、実際にrrで GDB を使用しています。rr は、確定的で再現可能な実行コンテキストを可能にする gdb の単なるラッパーです。rr の有無にかかわらず、gdb を使用しているかどうかに関係なく、コアの質問は同じままであると思います/願っています。
c# - アプリケーション コードとシステム ライブラリを介したデータ入力の追跡
私はセキュリティ担当者であり、これについて広範な調査を行ってきました。この時点で、次にどこへ行くべきかについてのガイダンスを探しています。
また、長文失礼しました、重要な部分を太字にしました。
私が高レベルでやろうとしていることは単純です。 あるデータをプログラムに入力し、このデータを「たどり」、データがどのように処理され、どこに到達するかを追跡しようとしています。
たとえば、ログイン資格情報を FileZilla に入力した場合、アクセスするすべてのメモリ参照を追跡し、トレースを開始して、そのデータがどこに移動したのか、どのライブラリに送信されたのかを追跡したいと考えています。ネットワークパケット。
現在、私は Windows プラットフォームに焦点を当てていますが、私の主な質問は次のようなものになると思います: Windows フォームとシステム ライブラリを理解するデバッガーをリモート コントロールするための優れた API はありますか?
これまでに見つけた主な属性は次のとおりです。
- この分析手法の名前は「Dynamic Taint Analysis」です。
- デバッガーまたはプロファイラーが必要になります
- Inspect.exe は、入力を受け取る Windows UI 要素を見つけるための便利なツールです。
- Windows 自動化フレームワーク全般が役立つ場合があります
- デバッガーの自動化は面倒なようです。IDebugClient インターフェイスはより豊富なデータを可能にしますが、IDAPro や CheatEngine などのデバッガーはより優れたメモリ分析ユーティリティを備えています
- メモリ ブレーク ポイントを配置し、入力に関連付けられている参照とレジスタを追跡する必要があります。
私が試したツールのコレクションは次のとおりです。
WinDBG (素晴らしいツール)、IDA Pro、CheatEngine、x64dbg、vdb (python デバッガー)、Intel の PIN、Valgrind などのすべてのツールで遊んだことがあります。
次に、いくつかの動的汚染分析ツールがありますが、それらは .NET コンポーネントの検出や、Inspect.exe などのユーティリティによってネイティブに提供される Windows デバッグ フレームワークが提供するその他の便利さをサポートしていません。
次に、IDebugClient インターフェイスを使用して独自の C# プログラムを作成しようとしましたが、ドキュメントが不十分であり、見つけることができた最高のプロジェクトは、このフェローからのもので、3 歳です: C# app to act like WINDBG's "step into" feature
このユースケースに適合する既存のプロジェクトにコードを提供したいと思っていますが、現時点ではどこから始めればよいかさえわかりません。
全体として、動的プログラムの分析ツールとデバッグ ツールにいくらかの愛が必要なように感じます...ちょっと立ち往生しているように感じます。この問題を解決するためのさまざまなツールやアプローチが非常に多くありますが、いずれも何らかの形で欠けています。
とにかく、どんな指示やガイダンスにも感謝します。ここまでできたら、ありがとう!!
-デイブ
c - C プログラムのサーバー側 GET 要求をシミュレートする
私は現在、コンパイルされた C プログラムを調査しています。socket
、gethostbyname
およびconnect
コード全体の複数の呼び出しにより、複数のネットワーク要求が行われることを私は知っています。さらに、私はプログラムを実行して見つけたGET
ので、それが要求を行っていることを知っています。strings
このプログラムを実行して、ネットワーク呼び出しを行わずに調査できるようにしたいと考えています。ただし、これを行うには、指定された関数だけで get リクエストをシミュレートする必要があります。
コンパイルして追加した次のコードがありますLD_PRELOAD
。
これは機能しているように見えますが、ソケットから出力して受信するものをほとんど理解できません。
私はまた、問題に対する他の解決策にもオープンです。