hacktricks/reversing/cryptographic-algorithms
2023-07-07 23:42:27 +00:00
..
README.md Translated to Japanese 2023-07-07 23:42:27 +00:00
unpacking-binaries.md Translated to Japanese 2023-07-07 23:42:27 +00:00

暗号化/圧縮アルゴリズム

暗号化/圧縮アルゴリズム

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

アルゴリズムの特定

もし、コードがシフト演算、XOR演算、およびいくつかの算術演算を使用している場合、それはおそらく暗号化アルゴリズムの実装である可能性が高いです。ここでは、各ステップを逆にする必要なしに使用されているアルゴリズムを特定するいくつかの方法を紹介します。

API関数

CryptDeriveKey

この関数が使用されている場合、第2パラメータの値をチェックすることで、どのアルゴリズムが使用されているかを特定できます。

可能なアルゴリズムとそれに割り当てられた値の表はこちらを参照してください:https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id

RtlCompressBuffer/RtlDecompressBuffer

指定されたデータのバッファを圧縮および展開します。

CryptAcquireContext

CryptAcquireContext関数は、特定の暗号化サービスプロバイダCSP内の特定のキーコンテナへのハンドルを取得するために使用されます。選択したCSPを使用するCryptoAPI関数への呼び出しで使用される返されたハンドルです。

CryptCreateHash

データストリームのハッシュ化を開始します。この関数が使用されている場合、第2パラメータの値をチェックすることで、どのアルゴリズムが使用されているかを特定できます。

可能なアルゴリズムとそれに割り当てられた値の表はこちらを参照してください:https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id

コード定数

アルゴリズムを特定するのは非常に簡単な場合があります。なぜなら、特別でユニークな値を使用する必要があるからです。

最初の定数をGoogleで検索すると、次のような結果が得られます。

したがって、逆コンパイルされた関数はsha256の計算機であると推定できます。他の定数のいずれかを検索しても(おそらく)同じ結果が得られます。

データ情報

コードに有意義な定数がない場合、おそらく**.dataセクションから情報を読み込んでいる可能性があります。そのデータにアクセスし、最初のdwordをグループ化**し、前のセクションと同様にGoogleで検索します。

この場合、0xA56363C6を検索すると、AESアルゴリズムのテーブルに関連していることがわかります。

RC4 (対称暗号)

特徴

RC4は3つの主要な部分で構成されています

  • 初期化ステージ0x00から0xFFまでの値のテーブル合計256バイト、0x100を作成します。このテーブルは一般的に置換ボックスまたはSBoxと呼ばれます。
  • スクランブルステージ以前に作成したテーブルをループします再び0x100回のループ。このループでは、RC4のキーを使用して各値を半ランダムバイトで変更します。この半ランダムバイトを作成するためには、通常、RC4のキーは1バイトから256バイトの長さであることが推奨されます。一般的に、RC4のキーは16バイトの長さです。
  • XORステージ最後に、平文または暗号文は、以前に作成した値とXOR演算されます。暗号化および復号化のための関数は同じです。そのため、作成された256バイトを必要な回数だけループします。これは通常、デコンパイルされたコードで**%256mod 256**として認識されます。

{% hint style="info" %} 逆アセンブリ/デコンパイルされたコードでRC4を特定するには、2つの0x100サイズのループキーを使用と、おそらく%256mod 256を使用して2つのループで作成された256個の値との入力データのXORをチェックできます。 {% endhint %}

初期化ステージ/置換ボックス:256という数字がカウンターとして使用され、256文字の各桁に0が書かれていることに注意してください

スクランブルステージ:

XORステージ:

AES対称暗号

特徴

  • 置換ボックスとルックアップテーブルの使用
  • 特定のルックアップテーブルの値定数の使用により、AESを区別することが可能です。注意:この定数はバイナリに格納されるか、動的に作成されることができます。
  • 暗号化キーは16で割り切れる必要があります通常は32B、通常は16BのIVが使用されます。

SBoxの定数

Serpent (対称暗号)

特徴

  • 一部のマルウェアで使用されることは稀ですが、例がありますUrsnif
  • 非常に長い関数に基づいて、アルゴリズムがSerpentであるかどうかを簡単に判断できます。

識別

次の画像では、定数0x9E3779B9が使用されていることに注意してください(この定数はTEATiny Encryption Algorithmなどの他の暗号アルゴリズムでも使用されます。また、ループのサイズ132)とXOR操作の数逆アセンブリの命令とコードの例で確認してください。

前述のように、このコードはジャンプがないため、デコンパイラ内で非常に長い関数として視覚化することができます。デコンパイルされたコードは次のようになります。

したがって、このアルゴリズムは、マジックナンバー初期のXORをチェックし、非常に長い関数を見て、その関数のいくつかの命令左に7ビットシフトし、左に22ビット回転するなど実装と比較することで識別することができます。

RSA (非対称暗号)

特徴

  • 対称アルゴリズムよりも複雑です
  • 定数はありません!(カスタム実装は判断が難しいです)
  • RSAに関するヒントを表示するためには、KANAL暗号解析ツールは失敗します。

比較による識別

  • 左側の11行目には+7) >> 3があり、右側の35行目には+7) / 8があります。
  • 左側の12行目ではmodulus_len < 0x040をチェックし、右側の36行目ではinputLen+11 > modulusLenをチェックしています。

MD5SHAハッシュ

特徴

  • 初期化、更新、最終の3つの関数があります
  • 類似した初期化関数

識別

初期化

両方を識別するには、定数をチェックします。MD5には存在しないsha_initに1つの定数があることに注意してください。

MD5変換

さらに多くの定数の使用に注意してください。

CRCハッシュ

  • データの偶発的な変更を検出するための機能として、より小さく効率的です
  • ルックアップテーブルを使用します(定数を識別できます)

識別

ルックアップテーブルの定数をチェックします。

CRCハッシュアルゴリズムは次のようになります。

APLib圧縮

特徴

  • 識別可能な定数はありません
  • Pythonでアルゴリズムを書いて、オンラインで類似のものを検索することができます

識別

グラフは非常に大きいです。

3つの比較をチェックしてそれを認識します。

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥