summaryrefslogtreecommitdiff
path: root/pages
diff options
context:
space:
mode:
author46halbe <46halbe@berlin.ccc.de>2012-02-19 18:24:46 +0000
committer46halbe <46halbe@berlin.ccc.de>2020-05-23 13:39:12 +0000
commit3131832b7d708ab24f88ea9edd6c5c74887d247f (patch)
tree208ab7aae4f23e4b31feebebe1c6e2d2308beb7d /pages
parent4f2462ed05067bde61f334589de80f5750a0ed3c (diff)
committing page revision 7
Diffstat (limited to 'pages')
-rw-r--r--pages/hackabike.md69
1 files changed, 35 insertions, 34 deletions
diff --git a/pages/hackabike.md b/pages/hackabike.md
index ac5f669b..e215fc8d 100644
--- a/pages/hackabike.md
+++ b/pages/hackabike.md
@@ -1,15 +1,15 @@
1title: Hack a Bike 1title: Hack a Bike
2date: 2009-11-02 01:04:00 2date: 2009-11-02 01:04:00
3updated: 2012-02-18 21:09:17 3updated: 2012-02-19 18:24:46
4author: erdgeist 4author: erdgeist
5tags: deutsche bahn, hack, bike, call, avr, hackabike 5tags: deutsche bahn, hack, bike, call, avr, hackabike
6previewimage: /images/01.jpg 6previewimage: /images/01.jpg
7 7
8Schon immer mal nachts ohne Transportmöglichkeit in einem fremden Bezirk aufgewacht? "Mal schnell" ein Fahrrad benötigt? In Berlin und anderen Großstädten Deutschlands bietet Die Deutsche Bahn mit dem Call-A-Bike Service Abhilfe. 8Schon mal nachts ohne Transportmöglichkeit in einem fremden Bezirk aufgewacht? "Mal schnell" ein Fahrrad benötigt? In Berlin und anderen Großstädten Deutschlands bietet die Deutsche Bahn mit dem Call-A-Bike-Service Abhilfe.
9 9
10<!-- TEASER_END --> 10<!-- TEASER_END -->
11 11
12## Kurzeinführung in das Call a Bike System {#kurzeinführung-in-das-call-a-bike-system .quote} 12## Kurzeinführung in das Call-a-Bike-System {#kurzeinführung-in-das-call-a-bike-system .quote}
13 13
14Als Kunde ruft man die CallABike-Zentrale und gibt per DTMF-Wahl die 14Als Kunde ruft man die CallABike-Zentrale und gibt per DTMF-Wahl die
15vierstellige Radnummer durch. Von der Zentrale erhält man dann den 15vierstellige Radnummer durch. Von der Zentrale erhält man dann den
@@ -95,12 +95,12 @@ Es dauerte eine Weile, bis wir merkten, dass das System nach dem Booten
95durch ein Infrarot-Signal aktiviert werden muss. Das war mehr oder 95durch ein Infrarot-Signal aktiviert werden muss. Das war mehr oder
96weniger Zufall. 96weniger Zufall.
97 97
98Wenn man eine normale Glühlampe benutzt, um besser sehen zu koennen, 98Wenn man eine normale Glühlampe benutzt, um besser sehen zu können,
99piepte die Elektronik gelegentlich scheinbar unmotiviert. Wie sich 99piepte die Elektronik gelegentlich scheinbar unmotiviert. Wie sich
100später herausstellte, reichte der durch die Glühlampe emittierte 100später herausstellte, reichte der durch die Glühlampe emittierte
101IR-Anteil aus, um den IR-Receiver zu triggern und den Bootvorgang 101IR-Anteil aus, um den IR-Receiver zu triggern und den Bootvorgang
102fortzusetzen. Beim Booten testet sich das System selbst, und der Empfang 102fortzusetzen. Beim Booten testet sich das System selbst, und der Empfang
103eines Infrarot Signals gehört eben dazu. Im Zuge fortschreitender 103eines Infrarot-Signals gehört eben dazu. Im Zuge fortschreitender
104Professionalisierung™ wurde in der Folgezeit die Glühlampe durch ein 104Professionalisierung™ wurde in der Folgezeit die Glühlampe durch ein
105Infrarot-Photon-Micro-Light ersetzt. Bei unserer weiteren Analyse des 105Infrarot-Photon-Micro-Light ersetzt. Bei unserer weiteren Analyse des
106Systems begannen wir damit, alle Anschlüsse des Atmel durchzumessen, um 106Systems begannen wir damit, alle Anschlüsse des Atmel durchzumessen, um
@@ -119,46 +119,47 @@ an. Zum Auslesen wurde hauptsächlich das freie
119AVR microcontrollers which can interface to many hardware in-system 119AVR microcontrollers which can interface to many hardware in-system
120programmers”) benutzt. Die auf dem Atmel vorhandenen 120programmers”) benutzt. Die auf dem Atmel vorhandenen
121„Intellectual-Property“-Bits waren in einem undefinierten Zustand, 121„Intellectual-Property“-Bits waren in einem undefinierten Zustand,
122deswegen konnten wir das Flash des Atmels mit der 8KB großen Firmware 122deswegen konnten wir das Flash des Atmels mit der acht KB großen
123auslesen. 123Firmware auslesen.
124 124
125In den nächsten Wochen waren mehrere Hacker damit beschäftigt, den 125In den nächsten Wochen waren mehrere Hacker damit beschäftigt, den
126ausgelesenen Assemblercode zu verstehen und zu dokumentieren. Dazu 126ausgelesenen Assemblercode zu verstehen und zu dokumentieren. Dazu
127verwendeten wir AVR-Studio und [Ida 127verwendeten wir AVR-Studio und [Ida
128Pro](http://www.datarescue.com/idabase/). Den Scramble Code (zum 128Pro](http://www.datarescue.com/idabase/). Den Scramble Code (zum
129berechnen der Ausleih- und Abgabecodes) fanden wir relativ schnell, da 129Berechnen der Ausleih- und Abgabecodes) fanden wir relativ schnell, da
130sich dort eine Menge rotate-und-shift-Befehle befanden. Den 130sich dort eine Menge rotate-und-shift-Befehle befanden. Den
131Initialisierungscode erkannten wir wieder, da wir wussten, dass der 131Initialisierungscode erkannten wir wieder, da wir wußten, daß sich der
132Motor sich beim Einschalten zweimal herumdreht. So konnten wir das 132Motor beim Einschalten zweimal herumdreht. So konnten wir das Gelernte
133gelernte immer wieder an unserem Prototyp auf Richtigkeit überprüfen. 133immer wieder an unserem Prototyp auf Richtigkeit überprüfen.
134 134
135Die Ausleih- und Abgabecodes werden durch einen Scrambler generiert, der 135Die Ausleih- und Abgabecodes werden durch einen Scrambler generiert, der
136mit einem 16Bit-Counter des CallABikes und einem Zustandswert aufgerufen 136mit einem 16-Bit-Counter des Call-a-Bikes und einem Zustandswert
137wird. Ein gerader Counterwert erzeugt Ausleihcodes und ein ungerader 137aufgerufen wird. Ein gerader Counterwert erzeugt Ausleihcodes und ein
138erzeugt die Abgabecodes. Der Scrambler nutzt den Counter und das 138ungerader erzeugt die Abgabecodes. Der Scrambler nutzt den Counter und
139Zustandsbyte, um ein Offset auf ein 1024 Bit großes Feld zu errechnen. 139das Zustandsbyte, um ein Offset auf ein 1024 Bit großes Feld zu
140Dieses Feld ist ein für jedes CallABike eindeutiger binärer String, der 140errechnen. Dieses Feld ist ein für jedes Call-a-Bike eindeutiger binärer
141als der (wahrscheinlich) eindeutige Key des CallABikes bezeichnet werden 141String, der als der (wahrscheinlich) eindeutige Key des Call-a-Bikes
142könnte. Von diesem Offset aus werden dann 4x4 Bit genutzt, die die vier 142bezeichnet werden könnte. Von diesem Offset aus werden dann 4x4 Bit
143Ziffern für die Ausleih- und Abgabecodes repräsentieren. Die 16 Bit des 143genutzt, welche die vier Ziffern für die Ausleih- und Abgabecodes
144Counters werden aber schlecht genutzt, denn schon nach 1024 Iterationen 144repräsentieren. Die 16 Bit des Counters werden aber schlecht genutzt,
145wiederholen sich die Ausleih- und Abgabecodes. Das bedeutet auch, dass 145denn schon nach 1024 Iterationen wiederholen sich die Ausleih- und
146es nur 512 Ausleihcodes je CallABike gibt, da es nur 512 gerade Offsets 146Abgabecodes. Das bedeutet auch, daß es nur 512 Ausleihcodes je
147gibt die auf den Key (1024 Bit) zeigen können. CallABikes, die wir 147Call-a-Bike gibt, da es nur 512 gerade Offsets gibt, die auf den Key
148geöffnet haben und die wir wegen der Lockbits nicht auslesen konnten, 148(1024 Bit) zeigen können. Call-a-Bikes, die wir geöffnet haben und die
149haben wir mit einem Script 511 mal resetten lassen (bei einem Reset 149wir wegen der Lockbits nicht auslesen konnten, haben wir mit einem
150erhöht sich der Counter immer um zwei). Damit haben wir den 150Script 511 mal resetten lassen (bei einem Reset erhöht sich der Counter
151ursprünglichen Zustand wiederhergestellt, und das CallABike war wieder 151immer um zwei). Damit haben wir den ursprünglichen Zustand
152‘in sync’ mit der Zentrale. 152wiederhergestellt, und das Call-a-Bike war wieder ‘in sync’ mit der
153Zentrale.
153 154
154Wer sich das Display mal genauer angeschaut hat, wird festgestellt 155Wer sich das Display mal genauer angeschaut hat, wird festgestellt
155haben, dass der Zeichensatz ein proportionaler ist. Dazu gibt es im Code 156haben, daß der Zeichensatz ein proportionaler ist. Dazu gibt es im Code
156eine Tabelle, in der die Länge des Zeichens und die Position im Flash 157eine Tabelle, in der die Länge des Zeichens und die Position im Flash
157gespeichert sind. Ein ‘i’ und ein ‘!’ belegen nur ein Byte, wogegen z.B. 158gespeichert sind. Ein ‘i’ und ein ‘!’ belegen nur ein Byte, wogegen z.
158ein ‘w’ sieben Bytes belegt. Die großen Logos und das Zahleneingabefeld 159B. ein ‘w’ sieben Bytes belegt. Die großen Logos und das
159liegen als 400 Byte große Bitmaps vor. Die lange schwarze Linie im 160Zahleneingabefeld liegen als 400 Byte große Bitmaps vor. Die lange
160CallABike-Logo zeigt die Stärke der Spule im Schloss an. Das haben wir 161schwarze Linie im Call-a-Bike-Logo zeigt die Stärke der Spule im Schloß
161nur durch das Code-Auditing herausgefunden. 162an. Das haben wir nur durch das Code-Auditing herausgefunden.
162 163
163Unser erstes Ziel war es, den aus unserem Disassembler erhaltenen 164Unser erstes Ziel war es, den aus unserem Disassembler erhaltenen
164Sourcecode so anzupassen, dass nach dem Assemblieren mit dem Commandline 165Sourcecode so anzupassen, dass nach dem Assemblieren mit dem Commandline