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.