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 (375) (1) (1) (1) (1).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 (376).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 (370).png>)
最初の定数をGoogleで検索すると、次のような結果が得られます
![](<../../images/image (371).png>)
したがって、逆コンパイルされた関数は**sha256計算機**であると推測できます。\
他の定数を検索すれば、(おそらく)同じ結果が得られます。
### データ情報
コードに重要な定数がない場合、**.dataセクションから情報を読み込んでいる可能性があります**。\
そのデータにアクセスし、**最初のDWORDをグループ化**し、前のセクションで行ったようにGoogleで検索できます
![](<../../images/image (372).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 (377).png>)
### **スクランブリングステージ:**
![](<../../images/image (378).png>)
### **XORステージ:**
![](<../../images/image (379).png>)
## **AES (対称暗号)**
### **特徴**
- **置換ボックスとルックアップテーブルの使用**
- **特定のルックアップテーブルの値**定数の使用によりAESを**区別することが可能です**。_定数は**バイナリに保存**されるか、_ _**動的に作成**_されることがあります。_
- **暗号化キー**は**16で割り切れる**必要があります通常32Bし、通常は16Bの**IV**が使用されます。
### SBox定数
![](<../../images/image (380).png>)
## Serpent **(対称暗号)**
### 特徴
- それを使用しているマルウェアはあまり見られませんが、例Ursnifがあります。
- アルゴリズムがSerpentであるかどうかは、その長さ非常に長い関数に基づいて簡単に判断できます。
### 特定
次の画像では、定数**0x9E3779B9**が使用されていることに注意してください(この定数は**TEA**Tiny Encryption Algorithmなどの他の暗号アルゴリズムでも使用されています。\
また、**ループのサイズ****132**)と**逆アセンブル**命令および**コード**例における**XOR操作の数**にも注意してください:
![](<../../images/image (381).png>)
前述のように、このコードは**非常に長い関数**として任意の逆コンパイラ内で視覚化できます。内部に**ジャンプ**がないためです。逆コンパイルされたコードは次のように見えることがあります:
![](<../../images/image (382).png>)
したがって、**マジックナンバー**と**初期XOR**を確認し、**非常に長い関数**を見て、**長い関数のいくつかの命令を実装と比較する**ことで、このアルゴリズムを特定することが可能です例えば、7ビット左シフトや22ビット左回転など
## RSA **(非対称暗号)**
### 特徴
- 対称アルゴリズムよりも複雑です。
- 定数はありません!(カスタム実装は特定が難しい)
- KANAL暗号アナライザーはRSAに関するヒントを示すことができず、定数に依存しています。
### 比較による特定
![](<../../images/image (383).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 (385).png>)
**MD5 Transform**
より多くの定数の使用に注意してください。
![](<../../images/image (253) (1) (1) (1).png>)
## CRCハッシュ
- データの偶発的な変更を見つけるための機能として、小型で効率的です。
- ルックアップテーブルを使用します(したがって、定数を特定できます)。
### 特定
**ルックアップテーブルの定数**を確認してください:
![](<../../images/image (387).png>)
CRCハッシュアルゴリズムは次のようになります
![](<../../images/image (386).png>)
## APLib圧縮
### 特徴
- 認識可能な定数はありません。
- アルゴリズムをPythonで書いて、オンラインで類似のものを検索してみることができます。
### 特定
グラフはかなり大きいです:
![](<../../images/image (207) (2) (1).png>)
それを認識するための**3つの比較**を確認してください:
![](<../../images/image (384).png>)
{{#include ../../banners/hacktricks-training.md}}