-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGynveals-Mission-001-Szyfrowanie-XORem.html
207 lines (187 loc) · 29.2 KB
/
Gynveals-Mission-001-Szyfrowanie-XORem.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
<!DOCTYPE html> <html lang="pl"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1" /> <title>Gynveal's Mission 001: Szyfrowanie XORem · Rafal Makara</title> <meta property="og:title" content=" Gynveal's Mission 001: Szyfrowanie XORem "> <meta property="twitter:title" content=" Gynveal's Mission 001: Szyfrowanie XORem "> <meta property="og:description" content=" Hi! I am Rafal and I am a generalist. I was an software engineer, project manager, product owner, scrum master, chief digital officer. I know about people, collaboration, project management, software development and business operations. "> <meta name="twitter:card" content="summary" /> <meta name="twitter:site" content="@rafalmakara" /> <meta property="og:image" content="https://rmakara.github.io/assets/20170519_header.jpg" /> <meta name="twitter:image" content="https://rmakara.github.io/assets/20170519_header.jpg" /> <meta name="description" content="Misje Gynvaela Coldwinda"> <link rel="icon" href="https://rmakara.github.io//assets/favicon.ico"> <link rel="apple-touch-icon" href="https://rmakara.github.io//assets/apple-touch-icon.png"> <link rel="stylesheet" href="https://rmakara.github.io//assets/core.css"> <link rel="canonical" href="https://rmakara.github.io//Gynveals-Mission-001-Szyfrowanie-XORem"> <link rel="alternate" type="application/atom+xml" title="Rafal Makara" href="https://rmakara.github.io/feed.xml" /> </head> <body> <aside class="logo"> <a href="https://rmakara.github.io//"> <img src="https://avatars0.githubusercontent.com/u/1880231?v=4" class="logo-avatar"> </a> <span class="logo-prompt code">Back to Home</span> </aside> <aside> <p class="goodbye"> This blog is no longer maintained <br/><br/> Subscribe to new articles at <a href="https://www.sorryengineering.com/">https://www.sorryengineering.com/</a> </p> </aside> <p class="menu"> <br /><br /> <a href="/">EN Articles</a> | <a href="/pl">PL Articles</a> <br /> <a href="/about">About me</a> | <a href="/help">How can I help?</a> | <a href="https://www.linkedin.com/in/rafalmakara/">My LinkedIn Profile</a> </p> <div id="content"> <article> <div class="divider"></div> <div class="center"> <a class="prev" href="/OnEstimates-Czesc-II-Techniki-estymowania">Previous article - OnEstimates. Część II: Techniki estymowania</a> </div> <div class="divider"></div> <h1 class="title">Gynveal's Mission 001: Szyfrowanie XORem</h1> <div class="center"> <time class="code">2017-05-19</time> </div> <div class="divider"></div> <h1 id="misje-gynvaela-coldwinda">Misje Gynvaela Coldwinda</h1> <p>Gynveal pracuje jako Security Engineer w Google oraz jest kapitanem jednej z topowych drużyn CTF Security na świecie. Napisał takie książki jak <a href="https://zrozumiecprogramowanie.pl/#/mainPage">Zrozumieć programowanie</a> i <a href="http://gynvael.coldwind.pl/?id=630">Praktyczna Inżynieria Wsteczna</a>. Prowadzi <a href="http://gynvael.coldwind.pl/0">blog</a>, <a href="https://www.youtube.com/user/GynvaelEN">anglojęzyczny kanał YouTube</a> oraz <a href="https://www.youtube.com/user/GynvaelColdwind">polskojęzyczny kanał YouTube</a>. W ramach tego ostatniego, realizuje cotygodniowe live streamy dotyczące programowania oraz bezpieczeństwa oprogramowania. Ostatnimi czasy, chcąc bardziej zaangażować swoich widzów zaczął udostępniać zadania do wykonania nawiązujące do tematyki odcinka. Okazują się one być bardzo ciekawe. Seria Gynveal’s Mission omawiać będzie moje realizacje zadań, pochodzących ze streamów Gynveala.</p> <h1 id="jak-nie-szyfrować---xor">Jak nie szyfrować - XOR</h1> <p>W ramach odcinku <a href="https://www.youtube.com/watch?v=fBEe8DGZL5o">Gynvael’s Livestream #37: Jak nie szyfrować - XOR</a> omówiony został problem dotyczący pokładania wiary w bezpieczeństwo ciągów danych zaszyfrowanych przez XOR’owanie każdego bitu z nieznanym kluczem. Live stream prezentuje wykorzystanie <a href="https://pl.wikipedia.org/wiki/Atak_statystyczny">ataku statystycznego</a> celem odszyfrowanie tekstu. Z całego live streamu najbardziej spodobało mi się wykorzystanie hex editora z funkcjonalnością wizualizacji zapalonych i zgaszynych bitów do ustalenia długości wykorzystanego klucza. Polecam.</p> <p>W każdym razie, odcinek kończy się następującym zadaniem:</p> <blockquote> <p><strong>Misja 001</strong><br /> <strong>DIFFICULTY: [4/10]</strong></p> <p>Nasi przyjaciele z sekcji dziewiątej założyli podsłuch w biurze podejrzanego. Należy dodać, że to podsłuch najnowszej generacji. Posiada on m.in. wbudowaną sieć neuronową, która od razu zapisuje wszystkie rozpoznane słowa w formie tekstu. Co więcej, każde słowo jest oddzielnie szyfrowane XOR’em przy użyciu tego samego 160-bitowego klucza.</p> <p>Ii… no… zgubiliśmy klucz. Trochę wstyd prosić sekcję dziewiątą znowu o pomoc, więc zadanie odzyskania danych i klucza powierzamy Tobie. Oto dane, które otrzymaliśmy:</p> <p>1f9111 1799 0790001226d8 0a9e1e5c3ada 1f 099e195e 0a97075a21dac1 0a9710 199e075131d3 1199 12961350</p> <p>Wiemy, że podejrzany posługuje się wyłącznie językiem angielskim.</p> <p>Rozszyfruj słowa i podaj odzyskany fragment klucza.</p> </blockquote> <h1 id="czytanie-ze-zrozumieniem">Czytanie ze zrozumieniem</h1> <p>Na początek, wylistujmy istotne elementy z powyższej treści:</p> <ul> <li>Zaszyfrowane dane są tekstem.</li> <li>Tekst jest zapisany w języku angielskim, więc wszystkie słowa pochodzą z języka angielskiego.</li> <li>Do zaszyfrowania tekstu XOR’em został użyty 160-bitowy klucz.</li> <li>Wszystkie słowa zostały zaszyfrowane osobno, przy użyciu dokładnie tego samego klucza.</li> </ul> <p>Wiemy o języku angielskim, który występuje w wersji oryginalnej tekstu. Daje nam to możliwość przeprowadzenia ataku statystycznego, który został omówiony w firmie Gynveala. Tutaj jednak mamy dodatkową informację mówiącą o tym, że słowa zostały zaszyfrowane osobno. W związku z tym, że długość klucza (160 bitów) jest dłuższa od najdłuższego z zaszyfrowanych słów (56 bitów) można byłoby założyć, że mamy do czynienia z <a href="https://en.wikipedia.org/wiki/One-time_pad">one-time pad</a>. Jednak zaszyfrowanie każdego ze słów osobno sprawia, że tak nie jest i jednocześnie daje nam możliwość wykorzystania metody <a href="https://en.wiktionary.org/wiki/educated_guess">educated guessing</a>.</p> <h1 id="rozwiązanie">Rozwiązanie</h1> <p>Przygotujmy sobie tablicę zawierającą zaszyfrowany tekst. Dla ułatwienia odczytywania poszczególnych liter zapiszę każdy z bajtów osobno:</p> <div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">data</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">[</span><span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0x91</span><span class="p">,</span> <span class="mh">0x11</span><span class="p">],</span>
<span class="p">[</span><span class="mh">0x17</span><span class="p">,</span> <span class="mh">0x99</span><span class="p">],</span>
<span class="p">[</span><span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x90</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x26</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">],</span>
<span class="p">[</span><span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x9e</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x5c</span><span class="p">,</span> <span class="mh">0x3a</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">],</span>
<span class="p">[</span><span class="mh">0x1f</span><span class="p">],</span>
<span class="p">[</span><span class="mh">0x09</span><span class="p">,</span> <span class="mh">0x9e</span><span class="p">,</span> <span class="mh">0x19</span><span class="p">,</span> <span class="mh">0x5e</span><span class="p">],</span>
<span class="p">[</span><span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x97</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x5a</span><span class="p">,</span> <span class="mh">0x21</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xc1</span><span class="p">],</span>
<span class="p">[</span><span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x97</span><span class="p">,</span> <span class="mh">0x10</span><span class="p">],</span>
<span class="p">[</span><span class="mh">0x19</span><span class="p">,</span> <span class="mh">0x9e</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x51</span><span class="p">,</span> <span class="mh">0x31</span><span class="p">,</span> <span class="mh">0xd3</span><span class="p">],</span>
<span class="p">[</span><span class="mh">0x11</span><span class="p">,</span> <span class="mh">0x99</span><span class="p">],</span>
<span class="p">[</span><span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x96</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x50</span><span class="p">],</span>
<span class="p">]</span>
</code></pre></div></div> <p>W powyższym tekście widać, że:</p> <ul> <li>1 słowo składa się z jednego bajtu,</li> <li>2 słowa składają się z 2 bajtów,</li> <li>2 słowa składają się z 3 bajtów,</li> <li>2 słowa składają się z 4 bajtów,</li> <li>3 słowa składają się z 6 bajtów,</li> <li>1 słowo składa się z 7 bajtów.</li> </ul> <p>Pamiętając o tym, że jest to tekst anglojęzyczny możemy wywnioskować, że jedyne jednoliterowe słowa występujące w języku angielskim to <code class="language-plaintext highlighter-rouge">a</code> oraz <code class="language-plaintext highlighter-rouge">I</code>.</p> <p>Tablica prawdy XOR’a wygląda następująco:</p> <table> <thead> <tr> <th>p</th> <th>q</th> <th>p ^ q</th> </tr> </thead> <tbody> <tr> <td>0</td> <td>0</td> <td>0</td> </tr> <tr> <td>0</td> <td>1</td> <td>1</td> </tr> <tr> <td>1</td> <td>0</td> <td>1</td> </tr> <tr> <td>1</td> <td>1</td> <td>0</td> </tr> </tbody> </table> <p>Na jej podstawie można wywnioskować, że:</p> <blockquote> <p>a^k ^ b^k</p> </blockquote> <p>jest równoznaczne z:</p> <blockquote> <p>a^b</p> </blockquote> <p>Taką zależność można zobrazować poniższym kodem:</p> <div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">a</span> <span class="o">=</span> <span class="mb">0b111111</span>
<span class="n">b</span> <span class="o">=</span> <span class="mb">0b101001</span>
<span class="n">k</span> <span class="o">=</span> <span class="mb">0b010101</span>
<span class="k">print</span> <span class="nb">bin</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="c1"># 0b111111
</span><span class="k">print</span> <span class="nb">bin</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="c1"># 0b101001
</span><span class="k">print</span> <span class="nb">bin</span><span class="p">(</span><span class="n">k</span><span class="p">)</span> <span class="c1"># 0b10101
</span><span class="k">print</span> <span class="s">'-'</span>
<span class="k">print</span> <span class="nb">bin</span><span class="p">(</span><span class="n">a</span><span class="o">^</span><span class="n">k</span><span class="p">)</span> <span class="c1"># 0b101010
</span><span class="k">print</span> <span class="nb">bin</span><span class="p">(</span><span class="n">b</span><span class="o">^</span><span class="n">k</span><span class="p">)</span> <span class="c1"># 0b111100
</span><span class="k">print</span> <span class="s">'-'</span>
<span class="k">print</span> <span class="nb">bin</span><span class="p">(</span><span class="n">a</span><span class="o">^</span><span class="n">k</span> <span class="o">^</span> <span class="n">b</span><span class="o">^</span><span class="n">k</span><span class="p">)</span> <span class="c1"># 0b10110
</span><span class="k">print</span> <span class="nb">bin</span><span class="p">(</span><span class="n">a</span><span class="o">^</span><span class="n">b</span><span class="p">)</span> <span class="c1"># 0b10110
</span>
</code></pre></div></div> <p>Dzięki powyższym faktom, możemy spróbować wyciągnąć wykorzystać słowo <code class="language-plaintext highlighter-rouge">0x1f</code> przy założeniu, że jest to <code class="language-plaintext highlighter-rouge">a</code> lub <code class="language-plaintext highlighter-rouge">I</code>. Tworzymy funkcję:</p> <div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">Xor</span><span class="p">(</span><span class="n">hex_letter</span><span class="p">,</span> <span class="n">key_index</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">chr</span><span class="p">(</span><span class="n">hex_letter</span> <span class="o">^</span> <span class="n">keys</span><span class="p">[</span><span class="n">key_index</span><span class="p">])</span>
</code></pre></div></div> <p>oraz tablicę, która posłuży nam do przechowywania klucza i umieszczamy w niej pierwszy bajt powstały przez XOR <code class="language-plaintext highlighter-rouge">0x1f</code> ze słowem <code class="language-plaintext highlighter-rouge">a</code>:</p> <div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">keys</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">data</span><span class="p">[</span><span class="mi">4</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">^</span> <span class="nb">ord</span><span class="p">(</span><span class="s">'a'</span><span class="p">)</span>
<span class="p">]</span>
</code></pre></div></div> <p>Teraz tworzymy pętlę, która wyświetli nam na ekranie wszystkie z zaszyfrowanych słów odszyfrowanych przy użyciu klucza przechowywanego w tablicy <code class="language-plaintext highlighter-rouge">keys</code>:</p> <div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
<span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">i</span><span class="p">:</span>
<span class="n">sys</span><span class="p">.</span><span class="n">stdout</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">k</span><span class="p">)</span> <span class="o">+</span> <span class="s">' '</span><span class="p">)</span>
<span class="k">print</span> <span class="s">""</span>
<span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">keys</span><span class="p">)):</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="o">></span> <span class="n">j</span><span class="p">:</span>
<span class="n">sys</span><span class="p">.</span><span class="n">stdout</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="n">Xor</span><span class="p">(</span><span class="n">i</span><span class="p">[</span><span class="n">j</span><span class="p">],</span> <span class="n">j</span><span class="p">))</span>
<span class="k">print</span> <span class="s">""</span>
</code></pre></div></div> <p>Wynik:</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>0x1f 0x91 0x11
a
0x17 0x99
i
0x7 0x90 0x0 0x12 0x26 0xd8
y
0xa 0x9e 0x1e 0x5c 0x3a 0xda
t
0x1f
a
0x9 0x9e 0x19 0x5e
w
0xa 0x97 0x7 0x5a 0x21 0xda 0xc1
t
0xa 0x97 0x10
t
0x19 0x9e 0x7 0x51 0x31 0xd3
g
0x11 0x99
o
0x12 0x96 0x13 0x50
l
</code></pre></div></div> <p>Jeżeli pierwszy znak naszego klucza jest poprawny to możemy założyć, że pierwsze trzyliterowe słowo to <code class="language-plaintext highlighter-rouge">and</code>. Podstawiamy te znaki do tablicy z kluczem i testujemy:</p> <div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">keys</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">data</span><span class="p">[</span><span class="mi">4</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">^</span> <span class="nb">ord</span><span class="p">(</span><span class="s">'a'</span><span class="p">),</span>
<span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">^</span> <span class="nb">ord</span><span class="p">(</span><span class="s">'n'</span><span class="p">),</span>
<span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span> <span class="o">^</span> <span class="nb">ord</span><span class="p">(</span><span class="s">'d'</span><span class="p">)</span>
<span class="p">]</span>
</code></pre></div></div> <p>Wynik:</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>0x1f 0x91 0x11
and
0x17 0x99
if
0x7 0x90 0x0 0x12 0x26 0xd8
you
0xa 0x9e 0x1e 0x5c 0x3a 0xda
tak
0x1f
a
0x9 0x9e 0x19 0x5e
wal
0xa 0x97 0x7 0x5a 0x21 0xda 0xc1
thr
0xa 0x97 0x10
the
0x19 0x9e 0x7 0x51 0x31 0xd3
gar
0x11 0x99
of
0x12 0x96 0x13 0x50
lif
</code></pre></div></div> <p>Odszyfrowany fragment wygląda dobrze, ponieważ zawiera w pełni poprawne słówko <code class="language-plaintext highlighter-rouge">the</code>. Wyszukujemy słowo w którym brakuje nam tylko jednej literki (ostatnie) i domyślamy się, że <code class="language-plaintext highlighter-rouge">lif?</code> może oznaczać <code class="language-plaintext highlighter-rouge">life</code>. Podstawiamy do tablicy z kluczem:</p> <div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">keys</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">data</span><span class="p">[</span><span class="mi">4</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">^</span> <span class="nb">ord</span><span class="p">(</span><span class="s">'a'</span><span class="p">),</span>
<span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">^</span> <span class="nb">ord</span><span class="p">(</span><span class="s">'n'</span><span class="p">),</span>
<span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span> <span class="o">^</span> <span class="nb">ord</span><span class="p">(</span><span class="s">'d'</span><span class="p">),</span>
<span class="n">data</span><span class="p">[</span><span class="mi">10</span><span class="p">][</span><span class="mi">3</span><span class="p">]</span> <span class="o">^</span> <span class="nb">ord</span><span class="p">(</span><span class="s">'e'</span><span class="p">)</span>
<span class="p">]</span>
</code></pre></div></div> <p>Tym razem, wynik zawiera poprawnie odszyfrowane słówko <code class="language-plaintext highlighter-rouge">walk</code>:</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>0x1f 0x91 0x11
and
0x17 0x99
if
0x7 0x90 0x0 0x12 0x26 0xd8
you`
0xa 0x9e 0x1e 0x5c 0x3a 0xda
taki
0x1f
a
0x9 0x9e 0x19 0x5e
walk
0xa 0x97 0x7 0x5a 0x21 0xda 0xc1
thro
0xa 0x97 0x10
the
0x19 0x9e 0x7 0x51 0x31 0xd3
gard
0x11 0x99
of
0x12 0x96 0x13 0x50
life
</code></pre></div></div> <p>Skupiamy się na słowach sześcioznakowych i początku <code class="language-plaintext highlighter-rouge">you'</code>. Można zaryzykować, że chodzi o <code class="language-plaintext highlighter-rouge">you're</code>:</p> <div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">keys</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">data</span><span class="p">[</span><span class="mi">4</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">^</span> <span class="nb">ord</span><span class="p">(</span><span class="s">'a'</span><span class="p">),</span>
<span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">^</span> <span class="nb">ord</span><span class="p">(</span><span class="s">'n'</span><span class="p">),</span>
<span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span> <span class="o">^</span> <span class="nb">ord</span><span class="p">(</span><span class="s">'d'</span><span class="p">),</span>
<span class="n">data</span><span class="p">[</span><span class="mi">10</span><span class="p">][</span><span class="mi">3</span><span class="p">]</span> <span class="o">^</span> <span class="nb">ord</span><span class="p">(</span><span class="s">'e'</span><span class="p">),</span>
<span class="n">data</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">4</span><span class="p">]</span> <span class="o">^</span> <span class="nb">ord</span><span class="p">(</span><span class="s">'r'</span><span class="p">),</span>
<span class="n">data</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">5</span><span class="p">]</span> <span class="o">^</span> <span class="nb">ord</span><span class="p">(</span><span class="s">'e'</span><span class="p">)</span>
<span class="p">]</span>
</code></pre></div></div> <p>Wynik:</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>0x1f 0x91 0x11
and
0x17 0x99
if
0x7 0x90 0x0 0x12 0x26 0xd8
you`re
0xa 0x9e 0x1e 0x5c 0x3a 0xda
taking
0x1f
a
0x9 0x9e 0x19 0x5e
walk
0xa 0x97 0x7 0x5a 0x21 0xda 0xc1
throug
0xa 0x97 0x10
the
0x19 0x9e 0x7 0x51 0x31 0xd3
garden
0x11 0x99
of
0x12 0x96 0x13 0x50
life
</code></pre></div></div> <p>Do końcu słówka <code class="language-plaintext highlighter-rouge">throug</code> dodajemy literkę <code class="language-plaintext highlighter-rouge">t</code>:</p> <div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">keys</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">data</span><span class="p">[</span><span class="mi">4</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">^</span> <span class="nb">ord</span><span class="p">(</span><span class="s">'a'</span><span class="p">),</span>
<span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">^</span> <span class="nb">ord</span><span class="p">(</span><span class="s">'n'</span><span class="p">),</span>
<span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span> <span class="o">^</span> <span class="nb">ord</span><span class="p">(</span><span class="s">'d'</span><span class="p">),</span>
<span class="n">data</span><span class="p">[</span><span class="mi">10</span><span class="p">][</span><span class="mi">3</span><span class="p">]</span> <span class="o">^</span> <span class="nb">ord</span><span class="p">(</span><span class="s">'e'</span><span class="p">),</span>
<span class="n">data</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">4</span><span class="p">]</span> <span class="o">^</span> <span class="nb">ord</span><span class="p">(</span><span class="s">'r'</span><span class="p">),</span>
<span class="n">data</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">5</span><span class="p">]</span> <span class="o">^</span> <span class="nb">ord</span><span class="p">(</span><span class="s">'e'</span><span class="p">),</span>
<span class="n">data</span><span class="p">[</span><span class="mi">6</span><span class="p">][</span><span class="mi">6</span><span class="p">]</span> <span class="o">^</span> <span class="nb">ord</span><span class="p">(</span><span class="s">'t'</span><span class="p">),</span>
<span class="p">]</span>
</code></pre></div></div> <p>dzięki czemu otrzymujemy w pełni odszyfrowany tekst:</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>0x1f 0x91 0x11
and
0x17 0x99
if
0x7 0x90 0x0 0x12 0x26 0xd8
you`re
0xa 0x9e 0x1e 0x5c 0x3a 0xda
taking
0x1f
a
0x9 0x9e 0x19 0x5e
walk
0xa 0x97 0x7 0x5a 0x21 0xda 0xc1
througt
0xa 0x97 0x10
the
0x19 0x9e 0x7 0x51 0x31 0xd3
garden
0x11 0x99
of
0x12 0x96 0x13 0x50
life
</code></pre></div></div> <p>Możemy teraz odczytać pierwsze 7 bajtów klucza:</p> <div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">print</span> <span class="s">'Key: '</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">keys</span><span class="p">:</span>
<span class="n">sys</span><span class="p">.</span><span class="n">stdout</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="o">+</span> <span class="s">' '</span><span class="p">)</span>
</code></pre></div></div> <h1 id="wynik-rozwiązania">Wynik rozwiązania</h1> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Encrypted text:
1f9111 1799 0790001226d8 0a9e1e5c3ada 1f 099e195e 0a97075a21dac1 0a9710 199e075131d3 1199 12961350
Key:
0x7e 0xff 0x75 0x35 0x54 0xbd 0xb5
Decrypted text:
and if you`re taking a walk throught the garden of life
</code></pre></div></div> <h1 id="podsumowanie">Podsumowanie</h1> <p>Głównym wnioskiem, który moglibyśmy pozostawić w tym miejscu jest to, że dane niemożliwe do odczytania przez człowieka w żadnym stopniu nie mówią o stopniu ich bezpieczeństwa. Wytwarzając oprogramowanie należy inwestować w często pomijane bezpieczeństwo. Podobnie jak umowy zawierane między firmami, czas poświęcony na security okazuje się być bezcenny, a jego prawdziwą wartość można docenić dopiero w czasie ‘wojny’.</p> <p>Powyższy artykuł został napisany podczas jednego z najwięszych ataków Ransomware na swiecie - WannaCry.</p> <h4 id="źródła-i-pojęcia">Źródła i pojęcia</h4> <ul> <li>[1] <a href="https://zrozumiecprogramowanie.pl/#/mainPage">Gynveal Coldwind, Zrozumieć programowanie</a></li> <li>[2] <a href="http://gynvael.coldwind.pl/?id=630">Gynveal Coldwind, Praktyczna Inżynieria Wsteczna</a></li> <li>[3] <a href="http://gynvael.coldwind.pl/0">Gynveal Coldwind, Blog</a></li> <li>[4] <a href="https://www.youtube.com/user/GynvaelEN">Gynveal Coldwind, YouTube ENG</a></li> <li>[5] <a href="https://www.youtube.com/user/GynvaelColdwind">Gynveal Coldwind, YouTube PL</a></li> <li>[6] <a href="https://www.youtube.com/watch?v=fBEe8DGZL5o">Gynvael’s Livestream #37: Jak nie szyfrować - XOR</a></li> <li>[7] <a href="https://pl.wikipedia.org/wiki/Atak_statystyczny">Atak statystyczny</a></li> <li>[8] <a href="https://en.wikipedia.org/wiki/One-time_pad">One-time pad</a></li> <li>[9] <a href="https://en.wiktionary.org/wiki/educated_guess">Educated guessing</a></li> </ul> </article> <div class="divider"></div> <div class="page-navigation code"> <a class="home" href="https://rmakara.github.io//" title="Back to Home">Back to Home</a> <br/><br/> <a class="next" href="/Gynveals-Mission-003-Optymalizacja">Next article: Gynveal's Mission 003: Optymalizacja</a> </div> </div> <br/> <aside> <p class="goodbye"> This blog is no longer maintained <br/><br/> Subscribe to new articles at <a href="https://www.sorryengineering.com/">https://www.sorryengineering.com/</a> </p> </aside> <div class="footer"> <span class="block">© 2023 Rafal Makara</span> <span class="block"><small></> Powered by <a href="https://jekyllrb.com/">Jekyll</a> and <a href="https://github.com/heiswayi/the-plain">The Plain theme</a>.</small></span> </div> </body> <script> (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-92815270-1', 'auto'); ga('send', 'pageview'); </script> </html>