.. | ||
README.md | ||
unpacking-binaries.md |
暗号化/圧縮アルゴリズム
暗号化/圧縮アルゴリズム
{% hint style="success" %}
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 DiscordグループまたはTelegramグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
アルゴリズムの特定
コードがシフト右と左、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)**として認識されます。
{% hint style="info" %} 逆アセンブル/逆コンパイルされたコードでRC4を特定するには、サイズ0x100の2つのループ(キーを使用)を確認し、その後、入力データを前の2つのループで作成された256の値とXORすることを確認します。おそらく%256(mod 256)を使用します。 {% 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、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をサポートする
- サブスクリプションプランを確認してください!
- **💬 DiscordグループまたはTelegramグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。