lincrackme3を断片に解析する

Windowsとは異なり、Linux環境は多くの異なるデバッグトリックを誇ることはできません。 オープンソースと、この点で彼らの役割を果たしたすべてのもの。 デバッガーの中

gdbがありますが、最も簡単なアンチデバッグ技術によって非常に簡単に検出されます。



したがって、バイナリのデバッグを大幅に複雑にするプロテクターはあまり知られておらず、その中で「シヴァ」しか思い出せませんが、それは長い間「死んで」います。



crackmes.deを含むlincrackme3プログラムは、今日の私たちのおもちゃとして機能します。複雑ではないと同時に、いくつかのアンチデバッグのトリックがあります。 逆アセンブラーのみを使用します。デバッガー、ltracers、さらにはバイナリパッチは使用しません。 逆アセンブラはIDAPro 5.5になります。



したがって、ロード...ロードに問題はありません。ELF仕様フィールドは正しいです。 次に、文字列またはインポートで何か面白いものを探すことから始めるのが最も論理的です。小さなバイナリの場合は、コンパイラ、可能性のある難読化、暗号化などに関する情報を検索する「シート」で組み立てられたリストを見てください 最初の方法でインポートを探します。 したがって、ptraceの呼び出しは興味深いものになります-保護メカニズムにつながります。





ここで、コードはそれ自体を「デバッグ」しようとし、失敗した場合(たとえば、デバッガーなどで既に誰かがこれを行っている場合)、ptaceは-1を返し、符号フラグが立てられ、プログラムは実行を終了します。 しかし、それだけではありません。 デバッガー行への相互参照もここにつながります:





デバッグに対する別のトリック:実行時に、プログラムは標準スレッドSTDIN = 0、STDOUT1、STDERR = 2を開き、同時にファイル記述子を閉じようとした場合、誰もそれを開いていない場合(たとえば、デバッガー)、エラーが発生しますそして、結果は、以前に開いたファイル記述子がある場合、close(3)=-1です。close(3)= 0。



だから、デバッグに対するトリックで-それだけです。 次に、シリアルのみを確認します。 興味深い「行への相互参照は、私たちをここに導くでしょう:





IDAはランタイム関数を認識し、すべてが非常に単純になります。sub_804862C関数は、単に「---」の形式のパスワードを「」に変換し、受け取ったパスワードの長さを0x10 = 16と比較します。



パスワードの長さが16文字の場合、ここにジャンプします。





このスレッドでは、パスワードと「それほど簡単ではない...」という行の比較を待っていますが、プログラムは結果に「興味」を持たず、次のステップは、デバッガー(トレース後)を使用して逆アセンブラーと対戦することです。心の中でトレースします。 すべての loc _8048847を 持つコマンドに注意してください 。これは08048841にあります。実行されると、それに続くコマンドのアドレスが配置されます。

「スタックのトップ。」 次に、戻りアドレスをeaxレジスタに入れ、オフセットを追加し、それをスタックの先頭に戻し、戻ります。 しかし、どこに?



08048846 時間 +09 Dh = 080488 E 3 時間





もう1つの秘:は、アドレスがスタックの深さのどこかにある隠しプロシージャコールです。 プログラムの実行中に値が変化するespレジスタを使用してアドレス指定が実行されるため、状況は複雑です。 デバッガで作業した場合、必要なプロシージャのアドレスを見つけることは簡単ですが、この場合(逆アセンブラでのみ作業する場合)、スタックセクションへのすべての呼び出しをトレースする必要があります。 さて、プログラムが適切に機能するには、バランスの取れたスタックが必要であるという事実から進めます。 したがって、「歓迎の手順」の最初に興味深いコマンドがすぐに疑われます。





ptrace()を使用した別の検証呼び出し。



すべてが検証でうまくいった場合は、ここにジャンプしてください:





このサイクルでは、パスワードはASCII形式からHEXに変換されますが、実装では、パスワード文字の中にデジタル値のみが存在します。 得られた値は、「スタックの深さ」に順次書き込まれます。シリアルの最初の4文字がここに書き込まれます[ esp +36]

2番目は[ esp +34] 、3番目は[ esp +32] 、4番目は[ esp +30]です。 次は、パスワードと「望ましい移行」の最も興味深い検証です。





ご覧のとおり、1つのブロックに5回条件付きでジャンプしているため、誤ったパスワードを報告する可能性があります。 次に、すべてのチェックに合格するためにジャンプすることなく、順番に「正しく」必要です。 それでは始めましょう...





1番目と2番目の4つのパスワード値の合計は、3番目と4番目の2倍の合計に等しくなければなりません。





2番目の4つの値は、3番目の値より大きいです。





1番目と4番目の4の合計はペアです。





最初の4つの値は、5より大きく24未満です。





そして、これが最後の移行です。 今回はジャンプする必要はありません。 これは、最後の(4番目の)4つの値がペアになっていない場合にのみ可能です。 つまり、1番目と4番目の4の合計がペアであれば、

最初の4つの意味も対になっていないことがわかります。 すべての条件が正しく満たされている場合、正しいパスワードについて通知し、そのような画像を見る行の「復号化」(デクソリング)が期待されます。





keygenを書くことは難しくないと思います。



ご清聴ありがとうございました。



PS:グリーツはアレクサ・ナクテ​​ィガルに飛びます。

著者、Paul H.の要請により発行されたPPS記事

PPPSジープのコードでごめんなさい、私は責任を負いません:-)



All Articles