.. | ||
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
この関数が使用されている場合、第2パラメータの値をチェックすることで、使用されているアルゴリズムを特定できます:
ここで、可能なアルゴリズムとそれに割り当てられた値の表を確認できます: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
RtlCompressBuffer/RtlDecompressBuffer
与えられたデータバッファを圧縮および解凍します。
CryptAcquireContext
ドキュメントによると、CryptAcquireContext関数は、特定の暗号化サービスプロバイダ(CSP)内の特定のキーコンテナへのハンドルを取得するために使用されます。この返されたハンドルは、選択したCSPを使用するCryptoAPI関数の呼び出しで使用されます。
CryptCreateHash
データストリームのハッシュ化を開始します。この関数が使用されている場合、第2パラメータの値をチェックすることで、使用されているアルゴリズムを特定できます:
ここで、可能なアルゴリズムとそれに割り当てられた値の表を確認できます: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
コード定数
アルゴリズムを特定するのが非常に簡単な場合があります。それは特別でユニークな値を使用する必要があるためです。
最初の定数をGoogleで検索すると、次のようになります:
したがって、逆コンパイルされた関数がsha256計算機であると仮定できます。
他の定数のいずれかを検索すると、おそらく同じ結果が得られます。
データ情報
コードに有意義な定数がない場合、.dataセクションから情報を読み込んでいる可能性があります。
そのデータにアクセスし、最初のdwordをグループ化して、前述のセクションで行ったようにGoogleで検索できます:
この場合、0xA56363C6を検索すると、AESアルゴリズムのテーブルに関連していることがわかります。
RC4 (対称暗号)
特徴
- 初期化ステージ/: 0x00から0xFF(合計256バイト、0x100)までの値のテーブルを作成します。このテーブルは一般的に置換ボックス(またはSBox)と呼ばれます。
- スクランブルステージ: 以前に作成されたテーブルをループします(0x100回のループ、再び)し、各値を半ランダムバイトで変更します。この半ランダムバイトを作成するために、RC4 キーが使用されます。RC4 キーは1から256バイトの長さである可能性がありますが、通常は5バイト以上であることが推奨されています。一般的に、RC4キーは16バイトの長さです。
- XORステージ: 最後に、平文または暗号文が以前に作成された値とXORされます。暗号化および復号化のための関数は同じです。これにより、作成された256バイトを必要な回数だけループします。これは通常、逆コンパイルされたコードで**%256(mod 256)**として認識されます。
{% hint style="info" %} 逆アセンブリ/逆コンパイルされたコードでRC4を特定するには、2つの0x100サイズのループ(キーを使用)をチェックし、おそらく%256(mod 256)を使用して2つのループで作成された256値との入力データのXORを行うことを確認できます。 {% endhint %}
初期化ステージ/置換ボックス:(256というカウンターと、256文字の各場所に0が書かれていることに注目)
スクランブルステージ:
XORステージ:
AES(対称暗号)
特徴
- 置換ボックスとルックアップテーブルの使用
- 特定のルックアップテーブル値(定数)の使用により、AESを区別することができます。定数はバイナリに格納されるか、動的に作成される_ **ことができます。
- 暗号化キーは16で割り切れる必要があります(通常32B)、通常16BのIVが使用されます。
SBox定数
Serpent (対称暗号)
特徴
- 使用例は少ないですが、マルウェアが使用している例もあります(Ursnif)
- 非常に長い関数に基づいて、アルゴリズムがSerpentであるかどうかを簡単に判断できます。
特定
次の画像で、定数0x9E3779B9が使用されていることに注目してください(この定数はTEA(Tiny Encryption Algorithm)などの他の暗号アルゴリズムでも使用されていることに注意してください)。
また、ループのサイズ(132)、XOR操作の数(逆アセンブリ命令およびコード例で)に注目してください:
前述のように、このコードは非常に長い関数として任意のデコンパイラ内で視覚化でき、内部にジャンプがないため、次のように見える可能性があります:
したがって、マジックナンバーと初期XORをチェックし、非常に長い関数を見て、いくつかの命令を実装と比較することで、このアルゴリズムを特定することができます。
RSA (非対称暗号)
特徴
- 対称暗号より複雑
- 定数が存在しない!(カスタム実装は難しい)
- RSAに関するヒントを示すKANAL(暗号解析ツール)は定数に依存していないため失敗する。
比較による識別
- 11行目(左)には
+7) >> 3
があり、35行目(右)には+7) / 8
がある - 12行目(左)は
modulus_len < 0x040
をチェックしており、36行目(右)はinputLen+11 > modulusLen
をチェックしている
MD5 & SHA(ハッシュ)
特徴
- 初期化、更新、終了の3つの関数
- 似たような初期化関数
識別
初期化
両方を識別するには定数をチェックできます。MD5には存在しない1つの定数がsha_initにあることに注意してください:
MD5変換
より多くの定数の使用に注意してください
CRC(ハッシュ)
- データの偶発的な変更を見つけるための関数としてより小さく効率的
- ルックアップテーブルを使用する(定数を識別できる)
識別
ルックアップテーブルの定数をチェック:
CRCハッシュアルゴリズムは次のようになります:
APLib(圧縮)
特徴
- 識別できない定数
- Pythonでアルゴリズムを書いて類似のものをオンラインで検索できます
識別
グラフはかなり大きいです:
それを認識するための3つの比較をチェック: