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

Reading time: 11 minutes

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

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

アルゴリズムの特定

コードが右シフトと左シフト、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バイトを必要な回数だけループします。これは通常、逆コンパイルされたコードで**%256(mod 256)**として認識されます。

note

逆アセンブル/逆コンパイルされたコードでRC4を特定するには、サイズ0x100の2つのループ(キーを使用)を確認し、その後、2つのループで前に作成された256の値と入力データのXORを行うことを確認します。おそらく%256(mod 256)を使用します。

初期化ステージ/置換ボックス:(カウンタとして使用される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、Update、Final
  • 初期化関数が似ています。

特定

Init

定数を確認することで両方を特定できます。sha_initにはMD5にはない1つの定数があります:

MD5 Transform

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

CRC(ハッシュ)

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

特定

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

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

APLib(圧縮)

特徴

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

特定

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

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

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする