hacktricks/reversing/cryptographic-algorithms
2024-02-09 02:33:52 +00:00
..
README.md Translated ['forensics/basic-forensic-methodology/memory-dump-analysis/R 2024-02-09 02:33:52 +00:00
unpacking-binaries.md Translated ['forensics/basic-forensic-methodology/memory-dump-analysis/R 2024-02-09 02:33:52 +00:00

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

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

ゼロからヒーローまでAWSハッキングを学ぶ htARTEHackTricks AWS Red Team Expert

HackTricks をサポートする他の方法:

アルゴリズムの特定

コードがシフト右と左、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 が使用されていることに注意してください(この定数は TEA -Tiny Encryption Algorithm などの他の暗号アルゴリズムでも使用されています)。
また、ループのサイズ132)、XOR 演算の数逆アセンブリの命令およびコードの例で)に注目してください:

前述のように、このコードは非常に長い関数として任意の逆コンパイラ内で視覚化でき、その中にジャンプがないためです。逆コンパイルされたコードは次のように見える可能性があります:

したがって、このアルゴリズムを特定するには、マジックナンバー初期 XORをチェックし、非常に長い関数を見て、いくつかの命令実装と比較することが可能です(たとえば、左に 7 ビットシフトおよび左に 22 ビット回転)。

RSA (非対称暗号)

特徴

  • 対称アルゴリズムよりも複雑
  • 定数はありません!(カスタム実装は特定が難しい)
  • KANAL暗号解析ツールは RSA についてのヒントを表示できず、定数に依存しています。

比較による特定

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

MD5 & SHAハッシュ

特徴

  • 初期化、更新、最終の 3 つの関数
  • 似た初期化関数

特定

Init

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

MD5 変換

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

CRCハッシュ

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

特定

ルックアップテーブルの定数をチェックしてください:

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

APLib圧縮

特徴

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

特定

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

認識するために3 つの比較をチェックしてください:

ゼロからヒーローまでAWSハッキングを学ぶ htARTEHackTricks AWS Red Team Expert

HackTricks をサポートする他の方法: