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.