カスペルスキーのリバースエンジニアリングテストcrackme

コミュニティへのご挨拶! かなり前の2013年、Habréに「インタビューのためのリバースエンジニアリング:採用方法」という投稿が掲載されました。 それは、ウイルス分析者の地位の申請者にテストクラックを提供しました。 インターネット上のテストファイルの完全な分析がないことを確認したので、私は独自の分析を書くことにしました。 それでは始めましょう。 Crackme 64ビット。 IDA Proで実行します。



画像








関数のリストの左側に3つの関数があります。start-プログラムの起動に使用する関数、DialogFunc-この関数は、私たちといくつかの関数sub_140001000と通信します。 ダイアログ機能を検討してください。 Hex Raysで逆コンパイルします。



画像






条件の分岐が目を引きます。sub_140001000関数がTRUEを返した場合、ジョブが正常に完了したことを通知するメッセージが表示されます。そうでない場合は間違っています。 大切な関数sub_140001000を分析しましょう。 逆コンパイラを介して渡すと、1つの値へのポインタが引数として渡されることがわかります。 おそらく、この値はダイアログボックスから取得され、入力されたキーです。 次に、アセンブラーのリストを検討してください。 入力されたデータの有効性の条件の最初のチェックがあります。 条件が満たされた場合、プログラムはさらに実行され、満たされない場合、プログラムはサブプログラムから戻ります。



画像






デバッガーの下でcrackmeを実行します。 x64dbgを使用します 。 最初のテストにブレークポイントを置きます。 入力されたキーとして、一連の数字1234567を使用します。



画像






ご覧のとおり、レジスタedxの値と数値13hがチェックされます(10進表記では19です)。 これはおそらく、入力されたキー文字の数のチェックです(7があり、edxレジスタの数は7です)。 別の文字数を入力してみましょう。 デバッガーを再度実行します。 9桁の123456789を入力します。



画像






そのようです。 したがって、キーには19文字を含める必要があります。 19文字の1234567890123456789を入力して、次の確認手順に進みます。



画像






このステップでは、キーの5文字ごとに2Dhの値と等しいかどうかがチェックされます。 実際、2Dhという数字は「-」文字の16進コードです。 つまり キーはxxxx-xxxx-xxxx-xxxxでなければなりません。 キーとして1234-5678-9012-3456を使用し、次の手順に進みます。



画像






そして、次のステップで、 数字の所属について文字チェックされます。 検証手順は次のとおりです。キーから文字が取得され(キーの5文字ごとにカウントされません)、数値-30が16進コードに追加され、結果が数値9と比較されます。キーが正しくないというメッセージが表示されます。 どうぞ



画像






このステップでは、ブロック内の数値合計が等しいことを確認します 上の図では、数値の合計とこれらの金額が入力されるスタック領域を計算するコードブロックが選択されています。 並行して、ブロックの合計が加算され、レジスタr10に入力されます。 次に、レジスタr10の結果を4で除算し(shr r10d、2-2桁のシフトは4で除算することと同等です)、レジスタr10の値をスタックに以前入力した値と比較します。 素晴らしい。 各キーブロックの数字の合計が等しいことを確認し(たとえば、1122-0123-2112-0006)、次の検証手順に進みます。



画像






上記の図で強調表示されているコードセクションは、キーの後続の各ブロックの文字配置が前のブロックと一致しないことを確認します。 その結果、キーの形式は1478-7814-1478-7814になります。 確認します。



画像






画像






素晴らしい仕事です!



All Articles