Dumper un Arduino.

Bon, je pense que pas grand monde connais le Arduino, c’est un contrôleur autonome qui à la particularités d’être super simple d’utilisation. On branche le cable USB, on code un genre de programme en C dans son l’IDE et on pousse. A partir de là, le bitonio est autonome. Il peut alors commander 14 Entrées/Sorties et 5 Entrées analogique, bref le pied pour tout petit montage électronique funky qui détecte et réagit. Et le fer à souder n’est même pas sollicité.

Bon, ok… mais comment on reverse le code. C’est un processeur ATmel qui est le coeur du bitonio, pour le Arduino modèle Uno c’est même précisément un Atmega 328,  rien à voir avec un Mips ni un X86, c’est encore autre chose. Pour ceux que ca intéresse voir Ici : http://www.atmel.com/Images/doc0856.pdf

On peut donc le désassembler avec un IDA évidemment mais aussi avec du libre comme vavrdisasm.

Mais avant de désassembler, faut le dumper ce programme de la chip vers un fichier. Pour cela on peut utiliser avrdude qui est fournis par l’ide de m. Arduino. Petit example sur mon MachinTosh.

$ /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin/avrdude \
-C /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/etc/avrdude.conf \
-v -patmega328p -carduino -P/dev/tty.usbmodem1421 -b115200 -D -Uflash:r:/tmp/mydump.hex:i

avrdude: Version 5.11, compiled on Sep  2 2011 at 18:52:52
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2009 Joerg Wunsch

         System wide configuration file is "/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/etc/avrdude.conf"
         User configuration file is "/Users/Thanat0s/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : /dev/tty.usbmodem1421
         Using Programmer              : arduino
         Overriding Baud Rate          : 115200
         AVR Part                      : ATMEGA328P
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    20     4    0 no       1024    4      0  3600  3600 0xff 0xff
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
           lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : Arduino
         Description     : Arduino
         Hardware Version: 3
         Firmware Version: 4.4
         Vtarget         : 0.3 V
         Varef           : 0.3 V
         Oscillator      : 28.800 kHz
         SCK period      : 3.3 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f
avrdude: safemode: lfuse reads as 0
avrdude: safemode: hfuse reads as 0
avrdude: safemode: efuse reads as 0
avrdude: reading flash memory:

Reading | ################################################## | 100% 4.21s

avrdude: writing output file "/tmp/mydump.hex"

avrdude: safemode: lfuse reads as 0
avrdude: safemode: hfuse reads as 0
avrdude: safemode: efuse reads as 0
avrdude: safemode: Fuses OK

avrdude done.  Thank you.

Et hop, on se retrouve avec un fichier au format i-hex. Mais voila c’est le format ascii de M. Intel utilisé généralement pour flasher toutes puces de tous poils, IDA l’aime pas !

$ head /tmp/mydump.hex 
:200000000C9461000C947E000C947E000C947E000C947E000C947E000C947E000C947E000D
:200020000C947E000C947E000C947E000C947E000C947E000C947E000C947E000C947E00D0
:200040000C94E6000C947E000C947E000C947E000C947E000C947E000C947E000C947E0048
:200060000C947E000C947E0000000000240027002A0000000000250028002B000000000057
:20008000230026002900040404040404040402020202020203030303030301020408102071
:2000A0004080010204081020010204081020000000070002010000030406000000000000EB
:2000C000000011241FBECFEFD8E0DEBFCDBF11E0A0E0B1E0E2E7F5E002C005900D92A63003
:2000E000B107D9F711E0A6E0B1E001C01D92A531B107E1F70E94A8020C94B7020C94000055
:20010000CF93DF93809102010E945502EC0190930B0180930A018130910581F480910001F6
:2001200061E00E9401028091060190910701892BC1F4D0930701C093060113C08091000185

Pour ceux que ca intéresse, ce format est fortement documenté sur wikipedia. Nous, pour le passer à la moulinette on veut une image de la puce bit à bit. Pour convertir celui ci, on va utiliser avr-objcopy qu’on trouve dans tout bonne distrib généralement comme compagnon de avr-libc.

$ avr-objcopy -I ihex /tmp/mydump.hex -O binary /tmp/mydump.bin
$ ls -lh /tmp/mydump.bin 
-rw-r--r-- 1 thanat0s thanat0s 32K Jan 22 11:42 /tmp/mydump.bin
$ hexdump -C /tmp/mydump.bin | head
00000000  0c 94 61 00 0c 94 7e 00  0c 94 7e 00 0c 94 7e 00  |..a...~...~...~.|
00000010  0c 94 7e 00 0c 94 7e 00  0c 94 7e 00 0c 94 7e 00  |..~...~...~...~.|
*
00000040  0c 94 e6 00 0c 94 7e 00  0c 94 7e 00 0c 94 7e 00  |......~...~...~.|
00000050  0c 94 7e 00 0c 94 7e 00  0c 94 7e 00 0c 94 7e 00  |..~...~...~...~.|
00000060  0c 94 7e 00 0c 94 7e 00  00 00 00 00 24 00 27 00  |..~...~.....$.'.|
00000070  2a 00 00 00 00 00 25 00  28 00 2b 00 00 00 00 00  |*.....%.(.+.....|
00000080  23 00 26 00 29 00 04 04  04 04 04 04 04 04 02 02  |#.&.)...........|
00000090  02 02 02 02 03 03 03 03  03 03 01 02 04 08 10 20  |............... |
000000a0  40 80 01 02 04 08 10 20  01 02 04 08 10 20 00 00  |@...... ..... ..|

Et voila, tout est prêt désormais pour passer à la phase torture du cerveau sur un désassembleur.

 

This entry was posted in Hacking, Reverse and tagged , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

AlphaOmega Captcha Classica  –  Enter Security Code