cracking prng

34
Cracking PRNG @_193s #Ph_ctf 1

Upload: ikumi-shimizu

Post on 15-Aug-2015

994 views

Category:

Technology


12 download

TRANSCRIPT

Page 1: Cracking PRNG

Cracking PRNG @_193s #Ph_ctf

1

Page 2: Cracking PRNG

(改めて)自己紹介• @_193s

• #Ph_ctf Organizer

• CTF

2

Page 3: Cracking PRNG

Agenda• 前置き(RNGの話)

• LCG

• Mersenne Twister

• ハンズオン

• まとめ

3

Page 4: Cracking PRNG

今回の発表でやること• 暗号論的に安全でないPRNGに対して攻撃する

• 基本的にはアルゴリズム/実装を理解することが重要

• いくつかの連続したPRNGの出力から次の出力を予測する

4

Page 5: Cracking PRNG

PRNG• pseudorandom number generator - 擬似乱数生成器

• 擬似?

• ランダムに見えるが実際は決定的なアルゴリズム

• 擬似じゃないRNG?

• TRNG (true random number generator)

• hardware random number generatorとも

• マウスの動き, 大気のノイズやbackground noiseなどを利用する

5

Page 6: Cracking PRNG

PRNG• 乱数生成器(RNG)のうち決定的なものを指す

• そのままの意味ですね

6

Page 7: Cracking PRNG

CSPRNG• cryptographically secure pseudo-random number

generator

• 暗号論的擬似乱数生成器

• PRNGのうち暗号論的に安全なものを指す

• Dual_EC_DRBGも

7

Page 8: Cracking PRNG

LCG

8

Page 9: Cracking PRNG

LCG - 線形合同法• 最も基本的な擬似乱数生成アルゴリズム

• Linear congruential generator

• 古い(?)glibcのsrand/randやjava.util.Randomなどでも使われている

9

Page 10: Cracking PRNG

LCG• X: 乱数列, m > 0, 0 < a < m, 0 <= c < m, X_0: seedで与えられる

• たまに用いられる用語m: modulusa: multiplierc: increment

10

Page 11: Cracking PRNG

LCG• パラメータ(a, c, m)は一般にpublic

• https://en.wikipedia.org/wiki/Linear_congruential_generator とかに載ってる

11

Page 12: Cracking PRNG

LCG• パラメータ(a, c, m)は一般にpublic

• 1つ乱数が得られればその後/前の乱数列も予測できる

• !!

12

Page 13: Cracking PRNG

LFSR - 線形帰還シフトレジスタ• linear feedback shift register

• これも有名ですが今回は省略します

• 最近のglibcはこっち

13

Page 14: Cracking PRNG

Mersenne Twister

14

Page 15: Cracking PRNG

Mersenne Twister• 2^19937 - 1の周期を持つ擬似乱数生成アルゴリズム

• Mersenne Twisterには2つのバージョンがあり,そのうち最新で広く使われている方がmt19937

• 暗号学的に安全ではないとされている

15

Page 16: Cracking PRNG

mt19937• 開発者によるMTの実装

• http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/mt19937ar.c

• https://gist.github.com/193s/eea5c00dbd1fbb99b1ce

• コードを追ってみましょう

16

Page 17: Cracking PRNG

mt19937• MTの内部状態?

• L53: static unsigned long mt[N];/* the array for the state vector */ L54: static int mti=N+1; /* mti==N+1 means mt[N] is not initialized */

• L47: #define N 624

• 624個の要素を持つ配列(mt)と整数値(mti)

17

Page 18: Cracking PRNG

mt19937 - 内部状態の再現• 少なくとも連続した624個の(mtが返した)乱数値が必要

• 623+624 = 1247個あれば十分

18

Page 19: Cracking PRNG

mt19937

19

mti: N 初期化済みのMT

0 1 2 623

genr

and

Tempering

?!

Page 20: Cracking PRNG

Tempering• /* Tempering */

y ^= (y >> 11);y ^= (y << 7) & 0x9d2c5680UL; y ^= (y << 15) & 0xefc60000UL; y ^= (y >> 18);

• これだけ

20

Page 21: Cracking PRNG

Tempering• Temperingと呼ばれる処理は可逆

• reverse_tempering?

• 拾ってきたコードを組み合わせて実装しました

• https://gist.github.com/193s/52cf7628825b23525233

21

Page 22: Cracking PRNG

Library?• https://github.com/altf4/untwister

• 良さげなツールを見つけた(試してない)

• “Bsides LV 2014 - Untwisting The Mersenne Twister: How I killed the PRNG - 05Aug2014”https://www.youtube.com/watch?v=f841Y7d3oDo

22

Page 23: Cracking PRNG

実践

23

Page 24: Cracking PRNG

ハンズオン• VolgaCTF Quals CTF 2015: lcg (Crypto 100)

• flagは入れ替えてあります

• 問題ファイルは http://bit.ly/1NQFQQb

24

Page 25: Cracking PRNG

ヒント (1/2)• lcgベースのVernam暗号

• lcgのパラメータ(seed, a, c)がkeyになっている

• keyはos.urandomから生成しているので予測不能

• X_{n+1} = (a*X + c) mod m

25

Page 26: Cracking PRNG

ヒント (2/2)• 元の平文はpng

• pngのシグネチャから最初の4バイトぐらいは予測できる

• まずlcgのパラメータが求まる?

26

Page 27: Cracking PRNG

解けましたか?

27

Page 28: Cracking PRNG

解答

• やるだけです

28

Page 29: Cracking PRNG

解説

29

• pngの先頭8バイト: [137, 80, 78, 71, 13, 10, 26, 10]

• これとflag.enc.binをxorして整数値に変換すると

• round: [40464, 44749, 59984, 60098]

• 40464*a + c ≡ 44749 (mod 65521)

• 44749*a + c ≡ 59984 (mod 65521)

Page 30: Cracking PRNG

解説

30

• 40464*a + c ≡ 44749 (mod 65521) 44749*a + c ≡ 59984 (mod 65521)

• 4285*a ≡ 15235 (mod 65521)

• a = 15235*modinv(4285, 65521)

• c = (44749 - 40464*a) mod 65521

Page 31: Cracking PRNG

解説

31

• a = 965365775, c = 50579

• あとはlcgのパラメータが復元できたので復号するだけ

• 詳しくはwriteupを読みましょう

• https://github.com/smokeleeteveryday/CTF_WRITEUPS/tree/master/2015/VOLGACTF/crypto/lcg

Page 32: Cracking PRNG

まとめ• PRNGの代表的な例として

lcgとMersenne Twisterを紹介しました

• CTFでもたまに役に立つ

32

Page 33: Cracking PRNG

References• “Cracking Random Number Generators” . https://jazzy.id.au/

2010/09/20/cracking_random_number_generators_part_1.html

• “PRNG vs. CSPRNG” . http://www.karlin.mff.cuni.cz/jarniskola/files/prednasky/prng_1_linkeova.pdf

• “Mersenne Twister Home Page” . http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html

• “Design and Implementation of a Quantum True Random Number Generator” . https://www.defcon.org/images/defcon-17/dc-17-presentations/defcon-17-sean_boyce-quantum_random.pdf

• “Secure Random by Default” . http://www.slideshare.net/dakami/yet-another-dan-kaminsky-talk-black-ops-2014

• “Bsides LV 2014 - Untwisting The Mersenne Twister: How I killed the PRNG - 05Aug2014” . https://www.youtube.com/watch?v=f841Y7d3oDo

33

Page 34: Cracking PRNG

おしまい 👏

34