hacktricks/crypto-and-stego/cryptographic-algorithms
2024-07-19 04:03:05 +00:00
..
README.md Translated ['README.md', 'backdoors/salseo.md', 'binary-exploitation/arb 2024-07-18 17:48:22 +00:00
unpacking-binaries.md Translated ['crypto-and-stego/cryptographic-algorithms/unpacking-binarie 2024-07-19 04:03:05 +00:00

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

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

{% hint style="success" %} AWSハッキングの学習と実践:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングの学習と実践: HackTricks Training GCP Red Team Expert (GRTE)

HackTricksをサポート
{% endhint %}

アルゴリズムの特定

コードがシフト右および左、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 (対称暗号)

特徴

  • 初期化ステージ/: 0x00から0xFF合計256バイト、0x100までの値のテーブルを作成します。このテーブルは一般的に置換ボックスまたはSBoxと呼ばれます。
  • スクランブルステージ: 以前に作成されたテーブルをループします0x100回のループ、再びし、各値を半ランダムバイトで変更します。この半ランダムバイトを作成するために、RC4 キーが使用されます。RC4 キー1から256バイトの長さである可能性がありますが、通常は5バイト以上であることが推奨されています。一般的に、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をチェックし、非常に長い関数を見て、いくつかの命令実装と比較することで、このアルゴリズムを特定することができます。

RSA (非対称暗号)

特徴

  • 対称暗号より複雑
  • 定数が存在しない!(カスタム実装は難しい)
  • RSAに関するヒントを示すKANAL暗号解析ツールは定数に依存していないため失敗する。

比較による識別

  • 11行目には +7) >> 3 があり、35行目には +7) / 8 がある
  • 12行目modulus_len < 0x040 をチェックしており、36行目inputLen+11 > modulusLen をチェックしている

MD5 & SHAハッシュ

特徴

  • 初期化、更新、終了の3つの関数
  • 似たような初期化関数

識別

初期化

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

MD5変換

より多くの定数の使用に注意してください

CRCハッシュ

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

識別

ルックアップテーブルの定数をチェック:

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

APLib圧縮

特徴

  • 識別できない定数
  • Pythonでアルゴリズムを書いて類似のものをオンラインで検索できます

識別

グラフはかなり大きいです:

それを認識するための3つの比較をチェック: