85
CTF 勉勉勉 #3 Crypto 勉 20151220 trmr (@trmr105) katagaitai

katagaitai CTF勉強会 #3 crypto

Embed Size (px)

Citation preview

Page 1: katagaitai CTF勉強会 #3 crypto

CTF 勉強会 #3Crypto 編20151220trmr (@trmr105)katagaitai

Page 2: katagaitai CTF勉強会 #3 crypto

注意事項 本スライドは勉強会で利用したものを元に作成しています。

勉強会では問題サーバを利用しましたが、既に停止しています。 問題サーバの IP やホスト名が出てくる箇所がありますが、随時読み替えをお願いいたします。 リンク切れ等ご容赦ください。

問題は下記 URL に配置しています。 http://pastebin.com/Ea3Gm8w2

最後のページに勉強会参加者有志の writeup を載せています。 私の writeup よりも 100 倍いい出来なので、ぜひそちらを参照してください。

2

Page 3: katagaitai CTF勉強会 #3 crypto

上級編とはなんぞや

好きなことを分かり合える人を増やしたい!

3

Page 4: katagaitai CTF勉強会 #3 crypto

楽しみにしていることTwitter の巡回 Writeup 収集

#katagaitaiCTF

4

Page 5: katagaitai CTF勉強会 #3 crypto

katagaitai と愉快な仲間たち 今回発表する人

bata(@bata_24) リーダー trmr(@trmr105) センセイ

資料レビュー askn(@asai_ken) エース

#  実は他にも結構いるらしい#  総数は誰も知らないWe are katagaitai!

5

Page 6: katagaitai CTF勉強会 #3 crypto

今日の問題 [Ghost in the shellcode CTF 2013] Q20 - Subme

CODE

6

Page 7: katagaitai CTF勉強会 #3 crypto

今日 subme をやるべき 4 つの理由 共通鍵暗号だから 公開鍵暗号の解き方がパターン化してる問題

あまり writeup ないから MSLC の writeup しか見つけられんかった たぶん MMA がもっと詳しい writeup 書いてくれるはず

暗号解析してるから 問題を解く過程が実際の暗号アルゴリズム解析に近い気がした

最近の問題についていけてないから 子育てに追われている 復帰目指して頑張る

7

Page 8: katagaitai CTF勉強会 #3 crypto

最初の問題

まずはじめに次の SHA1 ハッシュを要求される SHA1 ハッシュの末尾 16 ビットが” 1” 入力値が与えられた文字列で始まる 入力長は 21 バイト

腕慣らしにやってみましょう。 終わったら問題を解き始めてください。

20 分8

Page 9: katagaitai CTF勉強会 #3 crypto

共通鍵暗号と公開鍵暗号 共通鍵暗号 – 共通の鍵を利用して暗号化 / 復号を実施 公開鍵暗号 – 暗号化と復号に異なる鍵を利用

9

Page 10: katagaitai CTF勉強会 #3 crypto

共通鍵暗号のカテゴリー 大体このようなカテゴリわけできる(はず) ストリーム暗号

LFSR 型: snow, K-Cipher2 etc. 状態遷移型: RC4, trivium, chacha-20 etc.

ブロック暗号 Feistel 構造: DES, MISTY, Camellia etc. SPN 構造: AES, Serpent etc.

今日はこれ

10

Page 11: katagaitai CTF勉強会 #3 crypto

SPN 構造

© GaborPete

11

Page 12: katagaitai CTF勉強会 #3 crypto

SPN 構造

© GaborPete

AddRoundKey

Substitution

Permutation

1 Round is

and iterate it

12

Page 13: katagaitai CTF勉強会 #3 crypto

SPN 構造の概要 Substitution

非線形関数で乱雑化 小さい単位(バイト)ごとに処理することが多い 置換テーブル( S-box )が利用されることが多い

Permutation 全体をシャッフルして影響を広範化 ブロック全体に対する処理

Input

S S S S S S S S

Permutation

13

Page 14: katagaitai CTF勉強会 #3 crypto

SPN 構造の概要 Substitution

非線形関数で乱雑化 小さい単位(バイト)ごとに処理することが多い 置換テーブル( S-box )が利用されることが多い

Permutation 全体をシャッフルして影響を広範化 ブロック全体に対する処理

S S S S S S S S

Permutation

1byte の違いが全体に影響

14

Page 15: katagaitai CTF勉強会 #3 crypto

AES を見ていこう! AES: Advanced Encryption Standard

元 Rijndael 。リンデール?ラインダール? 2001 年に FIPS197 。米国標準なのにベルギー製 128, 192, 256bit があり、微妙に仕様が違う

15

Page 16: katagaitai CTF勉強会 #3 crypto

AES の構造 AES: Advanced Encryption Standard

初期化として KEY EXPANTION

通常処理として下記処理を 1 ラウンドとする AddRoundKey SubBytes ShiftRows MixColumns

上記処理を 10 ラウンド繰り返す (128bit の場合 )

16

Page 17: katagaitai CTF勉強会 #3 crypto

AES の構造 (1 ラウンド )Input

Key (K) (expanded)

Output

S S S S S S S S

MixColumns

1 AddRoundKey

2 SubBytes

ShiftRows 3 ShiftRows

4 MixColumns

17

Page 18: katagaitai CTF勉強会 #3 crypto

AES の構造 (1 ラウンド )Input

Key (K) (expanded)

Output

S S S S S S S S

MixColumns

1 AddRoundKey

2 SubBytes→ Substitution

ShiftRows 3 ShiftRows→ Permutation

4 MixColumns→ Permutation

Permutation

18

Page 19: katagaitai CTF勉強会 #3 crypto

AES の全体概観S S S S S S S S

ShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

平文

暗号文

19

Page 20: katagaitai CTF勉強会 #3 crypto

AES の全体概観S S S S S S S S

ShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

平文

暗号文

AES を書くのはしんどい

20

Page 21: katagaitai CTF勉強会 #3 crypto

subme のソースコード Subme.py

21

Page 22: katagaitai CTF勉強会 #3 crypto

subme のソースコード Subme.py

22

1 AddRoundKey

2 Substitution

3 Permutation

Page 23: katagaitai CTF勉強会 #3 crypto

subme のソースコード Subme.py

23

1 AddRoundKey

2 Substitution

3 Permutation

AES と同じ SPN 構造やん!

Page 24: katagaitai CTF勉強会 #3 crypto

subme のソースコード 説明の都合上、下記と定義

24

Step 1

Step 2

Step 3

Page 25: katagaitai CTF勉強会 #3 crypto

Subme の構造

Step1

Plaintext (P)

Key (K)

Ciphertext (C)

Step2

Step3

25

Page 26: katagaitai CTF勉強会 #3 crypto

Subme Step1Input

Key (K)

Output

S S S S S S S S

Permutation

26

Page 27: katagaitai CTF勉強会 #3 crypto

Subme Step1Input

Key (K)

Output

S S S S S S S S

Permutation

1-2 S-box変換=Substitution

1-3 置換テーブル変換=Permutation

1-1 入力に鍵の値を XoR=AddRoundKey

27

Page 28: katagaitai CTF勉強会 #3 crypto

Subme Step2Input

Key (K)

Output

S S S S S S S S

Permutation

1-2 S-box変換=Substitution

1-3 置換テーブル変換=Permutation

1-1 入力に鍵の値を XoR=AddRoundKey

Step2 は Step1 と同じ処理

28

Page 29: katagaitai CTF勉強会 #3 crypto

Subme Step3

Input

Key (K)

Output

3-1 入力値を byte 単位でリバース

3-2 鍵の値を足す ※ 桁上がり分は捨てる

Add

29

Page 30: katagaitai CTF勉強会 #3 crypto

Subme 全体概観

Output

S S S S S S S S

Permutation

S S S S S S S S

Permutation

+

平文

暗号文

30

Page 31: katagaitai CTF勉強会 #3 crypto

[再掲 ] AES の全体概観S S S S S S S S

ShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

平文

暗号文

31

Page 32: katagaitai CTF勉強会 #3 crypto

比較

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S S

Permutation

S S S S S S S S

Permutation

AES subme32

Page 33: katagaitai CTF勉強会 #3 crypto

比較

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S SShiftRowsPermutation

S S S S S S S S

Permutation

S S S S S S S S

Permutation

AES subme

Subme は解けそうな気がする!

33

Page 34: katagaitai CTF勉強会 #3 crypto

比較 ラウンド数

AES-128:10 ラウンド Subme:2 ラウンド

変換処理 Substitution

AES: [0x63, 0x7c, 0x77,….,0xbb, 0x16] Subme: [0x63, 0x7c, 0x77,….,0xbb, 0x16]

Permutation AES: Shift-Rows&MixColumns Subme: bit並び替え

AES と同じ処理でラウンド数が少ない = 十分鍵の情報が混ざらんのでは?

34

Page 35: katagaitai CTF勉強会 #3 crypto

入力情報の適切な攪拌

Key (K) Key (K)

暗号化 暗号化

入力情報(鍵・平文)の適切な攪拌ができてないと

暗号文に鍵の情報が残る

35

Page 36: katagaitai CTF勉強会 #3 crypto

差分解析

Plaintext A Plaintext A + ⊿

Key (K) Key (K)

暗号化 暗号化diff

入力に差分

入力情報(鍵・平文)ペアに差分を与える 出力に相関が生じないか解析

入力情報が得られる

36

Page 37: katagaitai CTF勉強会 #3 crypto

Subme の相関を見ていこう

S S S S S S S S

Permutation

S S S S S S S S

Permutation

+

平文

暗号文

Step ごとに相関を見ていく37

Page 38: katagaitai CTF勉強会 #3 crypto

定義

Output

S S S S S S S S

Permutation

S S S S S S S S

Permutation

+

平文

暗号文

K1

K2

K3

C11

C12

C13C21

C22

C23C31

C=C33

38

Page 39: katagaitai CTF勉強会 #3 crypto

Subme の相関( Step 1 )Input

Key (K)

Output

S S S S S S S S

Permutation

1-2 S-box変換=Substitution

1-3 置換テーブル変換=Permutation

1-1 入力に鍵の値を XoR=AddRoundKey

C11

C12

C13

39

Page 40: katagaitai CTF勉強会 #3 crypto

Subme の相関( Step 1 )Input

Output

S S S S S S S S

Permutation

Key (K)C11 に 1byte差分を与える

Key (K)Permutation で攪拌も8bit にしか影響しない

Key (K)S-box で非線形変換されるが他の byte に影響はしない

C11

C12

C13

40

Page 41: katagaitai CTF勉強会 #3 crypto

Subme の相関 (Step1)

S S S S S S S S

Permutation

S S S S S S S S

Permutation

Perm(S(A)) Perm(S(A+⊿))diff

AA + ⊿

B

41

Page 42: katagaitai CTF勉強会 #3 crypto

Subme の差分 (Step1)

diff

この差分パターン B が出ればC11 が特定ペア A と A+⊿ である可能性が高い

𝑃=𝑃 [𝑜𝑢𝑡𝑝𝑢𝑡に差分 パターン|𝑖𝑛𝑝𝑢𝑡に差分 ]∗𝑃 [ 𝑖𝑛𝑝𝑢𝑡に差分]

¿𝑃 [𝑜𝑢𝑡𝑝𝑢𝑡に差分パターン]

¿

42

Page 43: katagaitai CTF勉強会 #3 crypto

攻撃原理 (Step1) 前提:次の状況を仮定 (今回と同じ状況)

攻撃者は鍵の情報はわからない 任意の平文に対応した暗号文を取得可能(選択平文攻撃)

43

Page 44: katagaitai CTF勉強会 #3 crypto

攻撃原理 (Step1) 差分⊿を決定 ある C11 ペア (A, A+⊿) を決定し差分パターン B を取得

44

S S S S S S S S

Permutation

S S S S S S S S

Permutation

C11[0] = A C11[0] = A + ⊿

K

diff

B

Page 45: katagaitai CTF勉強会 #3 crypto

攻撃原理 (Step1)

S S S S S S S S

Permutation

S S S S S S S S

Permutation

下記の平文を入力 (σ は {0,..,255} の任意の値 )

K

45

P[0] = A+σ P[0] = A+⊿+σ

Page 46: katagaitai CTF勉強会 #3 crypto

攻撃原理 (Step1)

S S S S S S S S

Permutation

S S S S S S S S

Permutation

σ ≠ K[0] のとき : とくになし

K

46

P[0] = A+σ P[0] = A+⊿+σ

A + σ + K[0] A + ⊿ +σ + K[0]

Page 47: katagaitai CTF勉強会 #3 crypto

攻撃原理 (Step1)

S S S S S S S S

Permutation

S S S S S S S S

Permutation

σ = K[0] のとき : パターンが出る!

K

47

P[0] = A+σ P[0] = A+⊿+σ

A + K[0] + K[0] = A

A + ⊿ + K[0] + K[0]

= A + ⊿

Page 48: katagaitai CTF勉強会 #3 crypto

攻撃原理 (Step1)

S S S S S S S S

Permutation

S S S S S S S S

Permutation

σ = K[0] のとき : パターンが出る!

K

48

P[0] = A+σ P[0] = A+⊿+σ

A + K[0] + K[0] = A

A + ⊿ + K[0] + K[0]

= A + ⊿

暗号文に特定の差分パターン B が出た際の平文の差分 σ の値が鍵の 1 バイトと推測可能!

Page 49: katagaitai CTF勉強会 #3 crypto

現実は step は 2 回あるS S S S S S S S

Permutation

S S S S S S S S

Permutation

1byte目に差分

Step1 終了時に8bit差分

Step2 終了時に全体に広がる単に入力差分を与えるだけでは

Step2 終了時に全体に攪拌される→ 解析しづらい

Step1 の手法はこの時点の出力が得られることが前提

49

Page 50: katagaitai CTF勉強会 #3 crypto

現実は step は 2 回あるS S S S S S S S

Permutation

S S S S S S S S

Permutation

1byte目に差分

Step1 終了時に8bit差分

Step2 終了時に全体に広がる単に入力差分を与えるだけでは

Step2 終了時に全体に攪拌される→ 解析しづらい

Step1 の手法はこの時点の出力が得られるこあと前提

50

Step を 2 回実施することで対策済み?

Page 51: katagaitai CTF勉強会 #3 crypto

方針 問題点

1 回の Step だけなら鍵の推測が可能 2 回の Step 実施で鍵の推測が困難に

51

S S S S S S S S

Permutation

S S S S S S S S

Permutation

Step2への入力が様々な byte に広がることが問題

Page 52: katagaitai CTF勉強会 #3 crypto

方針 問題点

1 回の Step だけなら鍵の推測が可能 2 回の Step 実施で鍵の推測が困難に

考察 Step1 の出力が広がらなければ Step2 の出力は Step1 と同等に

52

S S S S S S S S

Permutation

S S S S S S S S

Permutation

都合のよい処理をする Step1

Step1 の出力が1byte にしか広がらなければ

Step2 の出力が先の Step1 と同等に

Page 53: katagaitai CTF勉強会 #3 crypto

方針 問題点

1 回の Step だけなら鍵の推測が可能 2 回の Step 実施で鍵の推測が困難に

考察 Step1 の出力が広がらなければ Step2 の出力は Step1 と同等に

53

S S S S S S S S

Permutation

全体に広がってしまう…。

入力差分を1bit にしてみる

S S S S S S S S

Permutation

S-box がbyte-to-byte変換

Page 54: katagaitai CTF勉強会 #3 crypto

方針 問題点

1 回の Step だけなら鍵の推測が可能 2 回の Step 実施で鍵の推測が困難に

考察 Step1 の出力が広がらなければ Step2 の出力は Step1 と同等に

54

S S S S S S S S

Permutation

全体に広がってしまう…。

入力差分を1bit にしてみる

S S S S S S S S

Permutation

S-box がbyte-to-byte変換

ここじゃね?

Page 55: katagaitai CTF勉強会 #3 crypto

方針 問題点

1 回の Step だけなら鍵の推測が可能 2 回の Step 実施で鍵の推測が困難に

考察 Step1 の出力が広がらなければ Step2 の出力は Step1 と同等に

55

S S S S S S S S

Permutation

鍵が解読できるパターンが出力!

ここの差分が1bit であれば

S S S S S S S S

Permutation

Permutation では影響範囲は広がらない

Page 56: katagaitai CTF勉強会 #3 crypto

方針 問題点

1 回の Step だけなら鍵の推測が可能 2 回の Step 実施で鍵の推測が困難に

考察 Step1 の出力が広がらなければ Step2 の出力は Step1 と同等に

56

S S S S S S S S

Permutation

鍵が解読できるパターンが出力!

ここの差分が1bit であれば

S S S S S S S S

Permutation

Permutation では影響範囲は広がらない

とは言っても直接内部状態はいじれない

Page 57: katagaitai CTF勉強会 #3 crypto

方針 問題点

1 回の Step だけなら鍵の推測が可能 2 回の Step 実施で鍵の推測が困難に

考察 Step1 の出力が広がらなければ Step2 の出力は Step1 と同等に

方針 S-box を 1 回通過後に 1bit差分を  生み出す平文ペアを入力 特定の出力が出る差分を探索

57

S S S S S S S S

Permutation

S S S S S S S S

Permutation

S-box 通過後に 1bit差分を生み出すような平文ペアを入力

特定の出力差分パターンをゲット!

Page 58: katagaitai CTF勉強会 #3 crypto

平文の作り方

S S S S S S S S

Permutation

S S S S S S S S

Permutation

実際に差分がある状態から逆算

K

58

C12[0] = D C12’[0] = D+1

Page 59: katagaitai CTF勉強会 #3 crypto

平文の作り方

S S S S S S S S

Permutation

S S S S S S S S

Permutation

実際に差分がある状態から逆算

K

59

C12[0] = D C12’[0] = D+1

C11[0] = inv_S[D] C12’[0] = inv_S[D+1]

Page 60: katagaitai CTF勉強会 #3 crypto

平文の作り方

S S S S S S S S

Permutation

S S S S S S S S

Permutation

実際に差分がある状態から逆算

K

60

C12[0] = D C12’[0] = D+1

C11[0] = inv_S[D] C12’[0] = inv_S[D+1]

P[0] = inv_S[D]+σ P’[0] = inv_S[D+1]+σ

Page 61: katagaitai CTF勉強会 #3 crypto

平文の作り方

S S S S S S S S

Permutation

S S S S S S S S

Permutation

実際に差分がある状態から逆算

K

61

C12[0] = D C12’[0] = D+ 1

C11[0] = inv_S[D] C12’[0] = inv_S[D+1]

P[0] = inv_S[D]+σ P’[0] = inv_S[D+1]+σ

σ=K[0] のとき暗号文に特定の差分パターン B が出力σ の値が鍵の 1 バイトと推測可能!

Page 62: katagaitai CTF勉強会 #3 crypto

K1, K2 の鍵が解読可能?S S S S S S S S

Permutation

S S S S S S S S

Permutation

1) 順次試していくことで K1 が解読

62

2) ここで同様の手順を実施することで K2 が解読

Page 63: katagaitai CTF勉強会 #3 crypto

K1, K2 の鍵が解読可能?S S S S S S S S

Permutation

S S S S S S S S

Permutation

1) 順次試していくことで K1 が解読

63

2) ここで同様の手順を実施することで K2 が解読

なんか忘れてない?

Page 64: katagaitai CTF勉強会 #3 crypto

Subme の相関 (Step3) 鍵の処理が XoR ではなく Add

2進数で見た際に桁上がりの概念が発生 XoR で差分をとった際にノイズが混じる

差分をとる際に桁上がりを意識する必要がある

Input = Step2 の出力Key (K)

Output

3-1 入力値を byte 単位でリバース

3-2 鍵の値を足す ※ 桁上がり分は捨てる

Add

64

Page 65: katagaitai CTF勉強会 #3 crypto

Subme の相関 (Step3) もし K3 が XoR であれば Step2 の出力が XoR で出る

Input = Step2 の出力

Output

65

Input = Step2 の出力

Outputdiff

Page 66: katagaitai CTF勉強会 #3 crypto

Subme の相関 (Step3) もし K3 が Add であれば Step2 の出力が XoR で出る

Input = Step2 の出力

Output

66

Input = Step2 の出力

Outputdiff

足し算なので XoR でStep2 の出力が出ない

Page 67: katagaitai CTF勉強会 #3 crypto

Add と XoR の違い XoR の場合1111 0 1111

1111 0 1 0 0 1

67

暗号文 C

暗号文 C’

0 1 0 0 1 1 0 1 0 K3

0 1 0 0 1 1 0 1 0 K3

1 0 1 1 1 0 1 0 1

1 0 1 1 0 0 0 1 1

C23

C23’

XoR

XoR

Page 68: katagaitai CTF勉強会 #3 crypto

Add と XoR の違い XoR の場合1111 0 1111

1111 0 1 0 0 1

暗号文の XoR

0 0 0 0 1 0 1 1 0

68

暗号文 C

暗号文 C’

0 1 0 0 1 1 0 1 0 K3

0 1 0 0 1 1 0 1 0 K3

1 0 1 1 1 0 1 0 1

1 0 1 1 0 0 0 1 1

C23

C23’

XoR

XoR

C23 の XoR

0 0 0 0 1 0 1 1 0

期待する差分パターン出力差分パターン

Page 69: katagaitai CTF勉強会 #3 crypto

Add と XoR の違い XoR の場合1111 0 1111

1111 0 1 0 0 1

暗号文の XoR

0 0 0 0 1 0 1 1 0

69

暗号文 C

暗号文 C’

0 1 0 0 1 1 0 1 0 K3

0 1 0 0 1 1 0 1 0 K3

1 0 1 1 1 0 1 0 1

1 0 1 1 0 0 0 1 1

C23

C23’

XoR

XoR

C23 の XoR

0 0 0 0 1 0 1 1 0

期待する差分パターン出力差分パターン

K3 が XoR であれば暗号文ペアの XoR はC23, C23’ の XoR と一致する

Page 70: katagaitai CTF勉強会 #3 crypto

Add と XoR の違い Add の場合

0 0 0 0 0 1 1 1 1

1 1 1 1 1 1 1 0 1

70

暗号文 C

暗号文 C’

0 1 0 0 1 1 0 1 0 K3

0 1 0 0 1 1 0 1 0 K3

1 0 1 1 1 0 1 0 1

1 0 1 1 0 0 0 1 1

C23

C23’

Add

Add

Page 71: katagaitai CTF勉強会 #3 crypto

Add と XoR の違い Add の場合

0 0 0 0 0 1 1 1 1

1 1 1 1 1 1 1 0 1

71

暗号文 C

暗号文 C’

0 1 0 0 1 1 0 1 0 K3

0 1 0 0 1 1 0 1 0 K3

1 0 1 1 1 0 1 0 1

1 0 1 1 0 0 0 1 1

C23

C23’

Add

Add

暗号文の XoR

1 1 1 1 1 0 0 1 0

C23 の XoR

0 0 0 0 1 0 1 1 0

期待する差分パターン出力差分パターン

Page 72: katagaitai CTF勉強会 #3 crypto

Add と XoR の違い Add の場合

0 0 0 0 0 1 1 1 1

1 1 1 1 1 1 1 0 1

72

暗号文 C

暗号文 C’

0 1 0 0 1 1 0 1 0 K3

0 1 0 0 1 1 0 1 0 K3

1 0 1 1 1 0 1 0 1

1 0 1 1 0 0 0 1 1

C23

C23’

Add

Add

暗号文の XoR

1 1 1 1 1 0 0 1 0

C23 の XoR

0 0 0 0 1 0 1 1 0

期待する差分パターン出力差分パターン

K3 が Add なので暗号文ペアの XoR はC23, C23’ の XoR と一致しない

Page 73: katagaitai CTF勉強会 #3 crypto

Add と XoR の違い Add と XoR の違い = 繰り上がり

XoR

1 1 1 1 0 0 1 0 0

73

0 0 0 0 1 0 1 1 0

1 1 1 1 1 0 0 1 0

C23,C23’ の差分Add の出力差分

Add の出力差分(繰り上がり)の特徴・ C23,C23’ の差分で 1 が立ってる場所以降に 1 が出力・必ず連続して出力

Page 74: katagaitai CTF勉強会 #3 crypto

trmr版 Step3攻略 下記手法で識別

もっといい方法はあるはず1 0 0 1 0 0 0 0 1

74

事前に C23,C23’ の差分パターン取得

Page 75: katagaitai CTF勉強会 #3 crypto

trmr版 Step3攻略 下記手法で識別

もっといい方法はあるはず1 0 0 1 0 0 0 0 1

75

事前に C23,C23’ の差分パターン取得1 0 1 0 0 1 0 1 1平文ペア P[0], P’[0]の diff 結果

XoR

0 0 1 1 0 1 0 1 0XoR 結果が次の条件を満たすか確認・ C23,C23’ で 1 が立ってる場所から連続して 1 が立っているかNG

Page 76: katagaitai CTF勉強会 #3 crypto

すべての鍵を解読可能

S S S S S S S S

Permutation

S S S S S S S S

Permutation

+

Step ごとに鍵を導出76

1) 順次試していくことで K1 が解読

2) 順次試していくことで K2 が解読

3)K3 = 暗号文 – C23

Page 77: katagaitai CTF勉強会 #3 crypto

実習 とりあえずやってみましょう

先に writeup を紹介します trmr版: http://pastebin.com/WQdc2knT MSLC版: http://mslc.ctf.su/wp/gits-ctf-2013-crypto-500

わかる人はガシガシやってください 残り 30 分になったら writeup のコード解説しようと思ってます

が、そんな良いコードでもないのであんまやりたくないです 誰か書き直して

音楽にリクエストがあれば@trmr105 または #katagaitai でツイートしてください

90 分77

Page 78: katagaitai CTF勉強会 #3 crypto

trmr版 Subme の解き方 差分を使った解き方はいろいろある、と思う。

あくまで一例。

78

Page 79: katagaitai CTF勉強会 #3 crypto

trmr版 Subme の解き方 1) C12 の差分リストを GET

79

C12 が 1bit 違うと C22 は 1byte 異なる。それぞれの出力差分が出る場所を、 subme のpermutation テーブルより求めれば、差分リストとなる

Page 80: katagaitai CTF勉強会 #3 crypto

trmr版 Subme の解き方 2) 鍵を戻すよー

80

C12 と差分 1 ビットの C12’ を作成Inv_S変換したものを暗号化※リスト処理してるのは、サーバ負荷と計算速度のため

出力の diff が差分リストに合致してるかチェック

Page 81: katagaitai CTF勉強会 #3 crypto

trmr版 Subme の解き方 3) 差分チェック (MSLC インスパイア )

そんな変わったことはしてないけど

81

差分リストの場所以降は繰り上がりの可能性あり

実際の出力差分とリストの違いが連続しなければ繰り上がりの可能性がなくなったと仮定繰り上がりの可能性がない状態で出力差分とリストに違いがあれば

NG

Page 82: katagaitai CTF勉強会 #3 crypto

解答 Key{HackerLikesHakkaAme}

※k1||k2||k3[::-1] の値

Flag{HackTheKatagaitai!}

と、いう値が勉強会の問題サーバでは入っていました。

82

Page 83: katagaitai CTF勉強会 #3 crypto

[余談 ]当日の trmr Step3

鍵を Add Add は XoR と高い相関 2 つの出力の差分をとればほぼ消せる

Step1,2 S-box

s = [0x63, 0x7c, 0x77,….,0xbb, 0x16]→ AES と同じ s-box を利用

Permutation → bit の並び替え 実施したこと

Step3 はいったん無視して 2 回 Step1 を通った入力と出力に着目 差分を与えたペアを作成し、相関分析 → 解けなかった

何かしら差分を与えて、それらのペアを XoR してやれば、面白い相関が出そう

AES と同じ s-box→ いったん安全と仮定置換テーブル

→ 1byte の違いを 8bit に攪拌→ 1 回のラウンドで大きく攪拌するわけではない

83

Page 84: katagaitai CTF勉強会 #3 crypto

参考文献 参考文献

More Smoked Leet Chicken http://mslc.ctf.su/wp/gits-ctf-2013-crypto-500/

Wikipedia[英語版 ] https://

en.wikipedia.org/wiki/Advanced_Encryption_Standard 暗号技術大全 ( アップデート希望 ) その他論文

84

Page 85: katagaitai CTF勉強会 #3 crypto

Writeup & Impression85

勉強会実施後の recon で見つけた writeup や感想です。 http://fish.minidns.net/news/55

kanata さんによる感想。今頃解いてくれてるはず? http://qiita.com/kusano_k/items/33d3d634f80a4999a400

kusano_k さんによる writeup 。 3段目の導出処理を変えてるのがさすがです。 https://bitbucket.org/snippets/nomeaning777/kEK5j

no_meaning さんによる writeup 。 ruby にて記述。これも 3段目の導出処理を変えてますね。

他載せられてない人。私の Recon 力不足です。ごめんなさい。 もし writeup 書いたら twitter 等で連絡いただけると助かります。