184 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 暗号化/圧縮アルゴリズム
{{#include ../../banners/hacktricks-training.md}}
## アルゴリズムの特定
コードが**シフト右および左、XORおよびいくつかの算術演算**を使用している場合、それは**暗号化アルゴリズム**の実装である可能性が高いです。ここでは、**各ステップを逆にすることなく使用されているアルゴリズムを特定する方法**をいくつか示します。
### API関数
**CryptDeriveKey**
この関数が使用されている場合、第二のパラメータの値を確認することで**使用されているアルゴリズム**を見つけることができます:
![](<../../images/image (156).png>)
可能なアルゴリズムとその割り当てられた値の表をこちらで確認してください: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
**RtlCompressBuffer/RtlDecompressBuffer**
指定されたデータバッファを圧縮および解凍します。
**CryptAcquireContext**
[ドキュメント](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta)から: **CryptAcquireContext**関数は、特定の暗号サービスプロバイダーCSP内の特定のキーコンテナへのハンドルを取得するために使用されます。**この返されたハンドルは、選択されたCSPを使用するCryptoAPI**関数への呼び出しで使用されます。
**CryptCreateHash**
データストリームのハッシュを開始します。この関数が使用されている場合、第二のパラメータの値を確認することで**使用されているアルゴリズム**を見つけることができます:
![](<../../images/image (549).png>)
\
可能なアルゴリズムとその割り当てられた値の表をこちらで確認してください: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
### コード定数
時には、特別でユニークな値を使用する必要があるため、アルゴリズムを特定するのが非常に簡単です。
![](<../../images/image (833).png>)
最初の定数をGoogleで検索すると、次のような結果が得られます
![](<../../images/image (529).png>)
したがって、逆コンパイルされた関数は**sha256計算機**であると推測できます。\
他の定数を検索すれば、(おそらく)同じ結果が得られます。
### データ情報
コードに重要な定数がない場合、**.dataセクションから情報を読み込んでいる可能性があります**。\
そのデータにアクセスし、**最初のdwordをグループ化**し、前のセクションで行ったようにGoogleで検索できます
![](<../../images/image (531).png>)
この場合、**0xA56363C6**を検索すると、**AESアルゴリズムのテーブル**に関連していることがわかります。
## RC4 **(対称暗号)**
### 特徴
3つの主要な部分で構成されています
- **初期化ステージ/**: **0x00から0xFFまでの値のテーブルを作成**します合計256バイト、0x100。このテーブルは一般に**置換ボックス**またはSBoxと呼ばれます。
- **スクランブリングステージ**: 前に作成したテーブルを**ループ**し0x100回のイテレーションのループ、各値を**半ランダム**なバイトで修正します。この半ランダムなバイトを作成するために、RC4の**キーが使用されます**。RC4の**キー**は**1バイトから256バイトの長さ**であることができますが、通常は5バイト以上が推奨されます。一般的に、RC4のキーは16バイトの長さです。
- **XORステージ**: 最後に、平文または暗号文は**前に作成された値とXORされます**。暗号化と復号化の関数は同じです。これには、作成された256バイトを必要な回数だけループします。これは通常、逆コンパイルされたコードで**%256mod 256**として認識されます。
> [!TIP]
> **逆アセンブル/逆コンパイルされたコードでRC4を特定するには、サイズ0x100の2つのループキーを使用を確認し、その後、2つのループで前に作成された256の値と入力データのXORを行うことを確認します。おそらく%256mod 256を使用します。**
### **初期化ステージ/置換ボックス:**カウンタとして使用される256という数字と、256文字の各場所に0が書かれていることに注意
![](<../../images/image (584).png>)
### **スクランブリングステージ:**
![](<../../images/image (835).png>)
### **XORステージ:**
![](<../../images/image (904).png>)
## **AES (対称暗号)**
### **特徴**
- **置換ボックスとルックアップテーブルの使用**
- **特定のルックアップテーブルの値**定数の使用によりAESを**区別することが可能です**。_注意すべきは、**定数**は**バイナリに保存**されるか、_ _**動的に作成**_される可能性があります。_
- **暗号化キー**は**16で割り切れる**必要があり通常32B、通常は16Bの**IV**が使用されます。
### SBox定数
![](<../../images/image (208).png>)
## Serpent **(対称暗号)**
### 特徴
- それを使用しているマルウェアはあまり見られませんが、例Ursnifがあります。
- アルゴリズムがSerpentかどうかは、その長さ非常に長い関数に基づいて簡単に判断できます。
### 特定
次の画像では、定数**0x9E3779B9**が使用されていることに注意してください(この定数は**TEA**Tiny Encryption Algorithmなどの他の暗号アルゴリズムでも使用されています。\
また、**ループのサイズ****132**)と**逆アセンブル**命令および**コード**例における**XOR操作の数**にも注意してください:
![](<../../images/image (547).png>)
前述のように、このコードは、内部に**ジャンプ**がないため、任意の逆コンパイラ内で**非常に長い関数**として視覚化できます。逆コンパイルされたコードは次のようになります:
![](<../../images/image (513).png>)
したがって、**マジックナンバー**と**初期XOR**を確認し、**非常に長い関数**を見て、**長い関数のいくつかの命令を実装**左に7シフトし、22に左回転すると**比較する**ことで、このアルゴリズムを特定することが可能です。
## RSA **(非対称暗号)**
### 特徴
- 対称アルゴリズムよりも複雑です。
- 定数はありません!(カスタム実装は特定が難しい)
- KANAL暗号アナライザーはRSAに関するヒントを示すことができず、定数に依存しています。
### 比較による特定
![](<../../images/image (1113).png>)
- 行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つの定数があります
![](<../../images/image (406).png>)
**MD5 Transform**
より多くの定数の使用に注意してください。
![](<../../images/image (253) (1) (1).png>)
## CRCハッシュ
- より小さく、データの偶発的な変更を見つけるために効率的です。
- ルックアップテーブルを使用します(したがって、定数を特定できます)。
### 特定
**ルックアップテーブルの定数**を確認してください:
![](<../../images/image (508).png>)
CRCハッシュアルゴリズムは次のようになります
![](<../../images/image (391).png>)
## APLib圧縮
### 特徴
- 認識可能な定数はありません。
- アルゴリズムをPythonで書いて、オンラインで類似のものを検索することを試みることができます。
### 特定
グラフはかなり大きいです:
![](<../../images/image (207) (2) (1).png>)
特定するために**3つの比較**を確認してください:
![](<../../images/image (430).png>)
{{#include ../../banners/hacktricks-training.md}}