hacktricks/reversing/cryptographic-algorithms
2024-07-19 10:21:08 +00:00
..
README.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-07-19 10:21:08 +00:00
unpacking-binaries.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-07-19 10:21:08 +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

この関数が使用されている場合、第二のパラメータの値を確認することで使用されているアルゴリズムを見つけることができます:

可能なアルゴリズムとその割り当てられた値の表はここで確認できます:https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id

RtlCompressBuffer/RtlDecompressBuffer

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

CryptAcquireContext

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

CryptCreateHash

データストリームのハッシュ化を開始します。この関数が使用されている場合、第二のパラメータの値を確認することで使用されているアルゴリズムを見つけることができます:


可能なアルゴリズムとその割り当てられた値の表はここで確認できます:https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id

コード定数

時には、特別でユニークな値を使用する必要があるため、アルゴリズムを特定するのが非常に簡単です。

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

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

データ情報

コードに重要な定数がない場合、.dataセクションから情報を読み込んでいる可能性があります
そのデータにアクセスし、最初のDWORDをグループ化し、前のセクションで行ったようにGoogleで検索できます

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

RC4 (対称暗号)

特徴

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

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

{% hint style="info" %} 逆アセンブル/逆コンパイルされたコードでRC4を特定するには、サイズ0x100の2つのループキーを使用を確認し、その後、入力データを前の2つのループで作成された256の値とXORすることを確認します。おそらく%256mod 256を使用します。 {% 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 (非対称暗号)

特徴

  • 対称アルゴリズムよりも複雑です。
  • 定数はありません!(カスタム実装は特定が難しい)
  • KANAL暗号アナライザーはRSAに関するヒントを示すことができず、定数に依存しています。

比較による特定

  • 左の行11には+7) >> 3があり、右の行35と同じです+7) / 8
  • 左の行12はmodulus_len < 0x040を確認しており、右の行36ではinputLen+11 > modulusLenを確認しています。

MD5 & SHAハッシュ

特徴

  • 3つの関数Init、Update、Final
  • 初期化関数が似ています。

特定

Init

定数を確認することで両方を特定できます。sha_initにはMD5にはない1つの定数があることに注意してください

MD5 Transform

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

CRCハッシュ

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

特定

ルックアップテーブル定数を確認してください:

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

APLib圧縮

特徴

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

特定

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

それを認識するために3つの比較を確認してください:

{% hint style="success" %} AWSハッキングを学び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践するHackTricks Training GCP Red Team Expert (GRTE)

HackTricksをサポートする
{% endhint %}