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