2010-11-25 43 views
9

objdump -dを呼び出して返されるアセンブリ結果のコントロールフローグラフを作成しようとしています。現時点で最善の方法は、結果の各行をリンクリストに入れ、各行のメモリアドレス、オペコード、オペランドを区切ることです。私はobjdumpの結果の規則的な性質に依存してそれらを分けています(メモリアドレスは各行を表す文字列の文字2から文字7までです)。Objdumpの結果を使用してコントロールフローグラフを作成する

これが完了したら、私は実際のCFG命令を開始します。 CFGの各ノードは、開始および終了メモリアドレス、前の基本ブロックへのポインタ、および任意の子基本ブロックへのポインタを保持する。次に、objdumpの結果を調べて、オペコードとx86_64のすべての制御フローオペコードの配列を比較します。オペコードが制御フローの場合、アドレスを基本ブロックの最後に記録し、オペコードに応じて2つの子ポインタ(条件付きオペコード)または1つ(コールまたはリターン)を追加します。

私はこれをC言語で実装する段階にありますが、うまくいくと思われますが、非常に薄いと感じます。誰にも何か提案や、私が考慮していないことはありますか?

お読みいただきありがとうございます!

編集:

アイデアは、ターゲットバイナリのために予想されるCFGに対してDynamoRIOによって生成されたシステムコールのスタックトレースを比較するためにそれを使用することで、私はこのようにそれを構築することが容易になることを願っています。私は利用可能なものを再利用していない。なぜなら、A)私はそれについて実際には思っていなかったし、B)グラフを使用可能なデータ構造にしてパス比較を行う必要があるからだ。私はあなたが並んでいるページのいくつかのユーティリティを見ていきます。私に正しい方向を教えてくれてありがとう。あなたのコメントをありがとう、私は本当にそれを感謝します!

+0

考えられる全体的なアプローチのように聞こえます。あなたは、間接的な呼び出しを見たときに何をすべきか考えてみたいかもしれません。また、返信指示には、複数の発信者を持つ機能のために、それが正確には1つの後継者があると言います。コールやリターンはCFG(LLVM IRなど)には含まれないことがよくあります。 「正しい」答えは、CFGを作成した後にCFGで何をする予定かによって異なります。 –

+0

興味深いアプローチ。ソースコードからCFGを作成するためのツールがいくつかあります(http://en.wikipedia.org/wiki/Call_graphを参照)。利用可能なものを再利用するのではなく、このアプローチを採用する理由は何ですか? – Sudhanshu

+0

どのように関数ポインタを解決していますか?同様の種類のプログラムを書いていますが、私はどのように関数ポインタを解決するのだろうと思っていますか? – prap19

答えて

3

プログラム解析用に設計されたILを使用してください。いくつかあります。

DynInstプロジェクト(dyninst.org)には、ELFバイナリから関数/プログラムのCFGに変換できるリフターがあります(または前回の見た目でした)。 DynInstはC++で書かれています。

BinNaviは、IDAが識別する制御フローグラフからILを作成するために、IDA(インタラクティブディスアセンブラ)の出力を使用します。私はIDAのコピーをお勧めします。それは、あなたが視覚的にCFGをチェックすることを可能にします。 BinNaviでプログラムを作成すると、関数/ CFGのIL表現を得ることができます。

機能ポインタは、制御フローグラフを静的に識別するためのトラブルの始まりに過ぎません。ジャンプテーブル(特定のケースではスイッチケースステートメントのために生成された種類、手作業で生成された種類)も同様にレンチを投げます。私が知っているすべてのコード分析フレームワークは、非常にヒューリスティックス重いアプローチのものを扱っています。その後、例外や例外処理、また自己修正コードがあります。

幸運を祈る!すでにDynamoRIOトレースから多くの情報を得ているので、そのトレースからできるだけ多くの情報を利用することをお勧めします。

0

私は同じことを探していたので質問を見つけました。 私は何も見つからなかったし、このための簡単なPythonスクリプトを書き、githubの上でそれを投げた:私は32ビットのx86などに、gccのスタック保護を返すことはありません機能に対処するためのいくつかのヒューリスティックを持っている https://github.com/zestrada/playground/blob/master/objdump_cfg/objdump_to_cfg.py

注...あなたはそのようなことを望むかもしれません。

私はあなたのやり方に似た間接的な呼び出しを扱います(基本的に、間接から返ってきたときにグラフのノードがあります)。

これは、同様の分析を同様の制限で実行しようとする人にとっては便利です。

関連する問題