Post on 15-Aug-2015
Cracking PRNG @_193s #Ph_ctf
1
(改めて)自己紹介• @_193s
• #Ph_ctf Organizer
• CTF
2
Agenda• 前置き(RNGの話)
• LCG
• Mersenne Twister
• ハンズオン
• まとめ
3
今回の発表でやること• 暗号論的に安全でないPRNGに対して攻撃する
• 基本的にはアルゴリズム/実装を理解することが重要
• いくつかの連続したPRNGの出力から次の出力を予測する
4
PRNG• pseudorandom number generator - 擬似乱数生成器
• 擬似?
• ランダムに見えるが実際は決定的なアルゴリズム
• 擬似じゃないRNG?
• TRNG (true random number generator)
• hardware random number generatorとも
• マウスの動き, 大気のノイズやbackground noiseなどを利用する
5
PRNG• 乱数生成器(RNG)のうち決定的なものを指す
• そのままの意味ですね
6
CSPRNG• cryptographically secure pseudo-random number
generator
• 暗号論的擬似乱数生成器
• PRNGのうち暗号論的に安全なものを指す
• Dual_EC_DRBGも
7
LCG
8
LCG - 線形合同法• 最も基本的な擬似乱数生成アルゴリズム
• Linear congruential generator
• 古い(?)glibcのsrand/randやjava.util.Randomなどでも使われている
9
LCG• X: 乱数列, m > 0, 0 < a < m, 0 <= c < m, X_0: seedで与えられる
• たまに用いられる用語m: modulusa: multiplierc: increment
10
LCG• パラメータ(a, c, m)は一般にpublic
• https://en.wikipedia.org/wiki/Linear_congruential_generator とかに載ってる
11
LCG• パラメータ(a, c, m)は一般にpublic
• 1つ乱数が得られればその後/前の乱数列も予測できる
• !!
12
LFSR - 線形帰還シフトレジスタ• linear feedback shift register
• これも有名ですが今回は省略します
• 最近のglibcはこっち
13
Mersenne Twister
14
Mersenne Twister• 2^19937 - 1の周期を持つ擬似乱数生成アルゴリズム
• Mersenne Twisterには2つのバージョンがあり,そのうち最新で広く使われている方がmt19937
• 暗号学的に安全ではないとされている
15
mt19937• 開発者によるMTの実装
• http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/mt19937ar.c
• https://gist.github.com/193s/eea5c00dbd1fbb99b1ce
• コードを追ってみましょう
16
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
mt19937 - 内部状態の再現• 少なくとも連続した624個の(mtが返した)乱数値が必要
• 623+624 = 1247個あれば十分
18
mt19937
19
mti: N 初期化済みのMT
0 1 2 623
genr
and
Tempering
…
?!
Tempering• /* Tempering */
y ^= (y >> 11);y ^= (y << 7) & 0x9d2c5680UL; y ^= (y << 15) & 0xefc60000UL; y ^= (y >> 18);
• これだけ
20
Tempering• Temperingと呼ばれる処理は可逆
• reverse_tempering?
• 拾ってきたコードを組み合わせて実装しました
• https://gist.github.com/193s/52cf7628825b23525233
21
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
実践
23
ハンズオン• VolgaCTF Quals CTF 2015: lcg (Crypto 100)
• flagは入れ替えてあります
• 問題ファイルは http://bit.ly/1NQFQQb
24
ヒント (1/2)• lcgベースのVernam暗号
• lcgのパラメータ(seed, a, c)がkeyになっている
• keyはos.urandomから生成しているので予測不能
• X_{n+1} = (a*X + c) mod m
25
ヒント (2/2)• 元の平文はpng
• pngのシグネチャから最初の4バイトぐらいは予測できる
• まずlcgのパラメータが求まる?
26
解けましたか?
27
解答
• やるだけです
28
解説
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)
解説
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
解説
31
• a = 965365775, c = 50579
• あとはlcgのパラメータが復元できたので復号するだけ
• 詳しくはwriteupを読みましょう
• https://github.com/smokeleeteveryday/CTF_WRITEUPS/tree/master/2015/VOLGACTF/crypto/lcg
まとめ• PRNGの代表的な例として
lcgとMersenne Twisterを紹介しました
• CTFでもたまに役に立つ
32
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
おしまい 👏
34