2016-06-25 3 views
2

私はcrackmeチャレンジの一部として、難読化されたバイナリで作業しています。 pushpopおよびnop命令(これは何千回も繰り返されます)のシーケンスを持っています。機能的には、これらのチャンクはプログラムに何の影響も与えません。しかし、彼らはCFGの生成とその逆行のプロセスを非常に難しくしています。ELFからのアセンブリ命令の削除

命令をnopに変更する方法があります。は、を削除できます。しかし、私の場合は、CFGの見通しを良くするために、その指示を完全に取り除きたいと思います。命令が削除された場合、私はメモリオフセットも変更する必要があることを理解しています。私が見る限り、これを直接達成するためのツールはありませんでした。

私はIDA Proの評価版を使用しています。私は他のリバース・エンジニアリング・フレームワークを使用したソリューションも公開しています。スクリプティングが可能であれば、それが望ましい。

私はsimilar questionて行ったが、提案された解決策は、私の場合には適用されません。一般的に

+3

スクリプト、CLI、WEB、シンプルTUIと、まだ完成していないGUIとUnixの世界のためにR2(radare.org)フレームワークがあります。また、http://reverseengineering.stackexchange.com/ – osgx

+0

にお尋ねしてみてください。いつもそうすることはできません。コードは、自動的に検出するのが難しい方法で、物の相対的なオフセットに依存する可能性があります。 (例えば、除去されたinsnを横切るジャンプアドレス上の変位を修正することよりも複雑である)。しかし、私はそれがプログラムを壊すことなく動作するかどうかを試してみる価値があると思う。 –

+0

あるいは、CFGを生成している間に、コードの一部( 'push'、' pop'、 'nop'シーケンスのようなもの)を無視する方法を探してみてください。それに対処するために質問を編集すべきですか、新しい質問を開くべきですか? – gtux

答えて

7
、私は完全にその手順を取り除きたい

が...私はメモリオフセットがあまりにも修正されなければならないことを理解し...

が、これは事実上不可能である:

  1. バイナリ輸出任意のダイナミックシンボル場合は、(これらはおそらくあなたが考えているオフセットです).dynsymを更新しなければなりません。

  2. あなたはすべての静的に割り当てられた関数ポインタを見つけ、新しいアドレスで更新しなければならないが、そのようなポインタを見つけるための効果的な方法はありません。

  3. GOTO Sを計算し、文を切り替えるいずれもプログラムソースに存在しない場合でも、関数ポインタテーブルを作成します。

  4. Peter Cordes氏は、2つのアセンブリラベルの間にデルタを使用するプログラムを記述し、プログラムフローを制御するためにそのようなデルタ(命令に直接エンコードされた小さな即値)を使用することが可能であると指摘しました。

それはあなたのターゲットプログラムは、上記の合併症のすべてから自由であることも可能だが、その1つのプログラムが無駄と思われるためにだけ働く技術に多くの労力を費やし。

関連する問題