r2m2 est un plugin radare2 qui vise à faciliter l'inversion des nouvelles architectures en tirant parti des fonctionnalités radare2 et miasm2. Son objectif est d’être aussi indépendant que possible de l’architecture.
Il fait le pont entre les communautés radare2 et miasm2 : radare2 étant l'interface graphique de miasm2, et miasm2 simplifiant la mise en œuvre de nouvelles architectures.
Actuellement, r2m2 est capable d'assembler, de désassembler, de diviser des blocs à l'aide de miasm2 et de convertir les expressions internes de miasm2 en radare2 ESIL.
Intéressé? Regardez la vidéo ou consultez les diapositives de présentation et de conception.
r2m2 fournit un seul plugin radare2, qui peut être activé à l'aide de l'option -a
, utilisée dans la plupart des commandes radare2. La variable d'environnement R2M2_ARCH
permet de sélectionner l'architecture qui sera utilisée.
r2m2$ export R2M2_ARCH=mips32l; rasm2 -a r2m2 'addiu a0, a1, 2' |rasm2 -a r2m2 -d -
ADDIU A0, A1, 0x2
r2m2$ R2M2_ARCH=msp430 r2 -a r2m2 -qc 'woR; pd 5' -
0x00000000 07fa and.w R10, R7
0x00000002 47ad dadd.b R13, R7
0x00000004 f05e0778 add.b @R14+, 0x7807(PC)
0x00000008 f46d81ed addc.b @R13+, 0xED81(R4)
0x0000000c 3fdc bis.w @R12+, R15
r2m2$ R2M2_ARCH=mips32b rasm2 -a r2m2 'j 0x4; nop' -B > j_nop.bin
r2m2$ R2M2_ARCH=mips32b r2 -a r2m2 -qc 'pd 2' j_nop.bin
,=< 0x00000000 0c000001 JAL 0x4
`-> 0x00000004 00000000 NOP
Docker est la solution recommandée pour utiliser r2m2. Chaque pull request est testée avec Travis. En cas de succès, une image Docker est créée sur Docker Hub et peut facilement être extraite comme suit :
r2m2$ docker pull guedou/r2m2
r2m2$ docker run --rm -it -e 'R2M2_ARCH=mips32l' guedou/r2m2 rasm2 -a r2m2 "addiu a0, a1, 2"
0200a424
Le Dockerfile
s'occupe de tout et construit r2m2. Les lignes de commande suivantes montrent comment créer l'image Docker, exécuter un conteneur temporaire et tester r2m2 :
r2m2$ docker build -t guedou/r2m2 .
r2m2$ docker run --rm -it -e 'R2M2_ARCH=mips32l' guedou/r2m2 bash
root@11da1889a490:/home/r2m2# rasm2 -L |grep r2m2
adAe 32 r2m2 LGPL3 miasm2 backend
root@11da1889a490:/home/r2m2# rasm2 -a r2m2 "addiu a0, a1, 2"
0200a424
r2m2$ docker run --rm -it -e 'R2M2_ARCH=x86_64' guedou/r2m2
-- One does not simply write documentation.
[0x00000000]> o /bin/ls
4
[0x0000487f]> e anal.arch=r2m2
[0x0000487f]> e asm.emu=true
[0x0000487f]> pd 10
;-- entry0:
0x0000487f 31ed xor ebp, ebp ; zf=0x1 ; nf=0x0
0x00004881 4989d1 mov r9, rdx ; r9=0x0
0x00004884 5e pop rsi ; rsp=0x8 ; rsi=0x0
0x00004885 4889e2 mov rdx, rsp ; rdx=0x8
0x00004888 4883e4f0 and rsp, 0xfffffffffffffff0 ; zf=0x1 ; nf=0x0
0x0000488c 50 push rax ; rsp=0x10
0x0000488d 54 push rsp ; rsp=0x18
0x0000488e 49c7c0301d41. mov r8, 0x411d30 ; r8=0x411d30 -> 0xffffff00
0x00004895 48c7c1c01c41. mov rcx, 0x411cc0 ; rcx=0x411cc0 -> 0xffffff00
0x0000489c 48c7c7c02840. mov rdi, 0x4028c0 ; rdi=0x4028c0 -> 0xffffff00
Remarque : les builds automatiques sont effectuées sur Ubuntu, Arch Linux et Mac OS X. D'autres distributions peuvent ne pas fonctionner en raison d'incompatibilités de bibliothèques.
Les logiciels suivants doivent être installés :
radare2 (>= 2.9.0)
miasme2
Module Python CFFI (>= 1.6)
Module Python jinja2 (>= 1.6)
r2m2 peut être construit comme suit :
r2m2$ make all install
[..]
mkdir -p [..]
Vous pouvez taper la commande suivante pour vérifier que tout s'est bien passé :
r2m2$ rasm2 -L |grep r2m2
adAe 32 r2m2 LGPL3 miasm2 backend
Si vous obtenez l'erreur suivante, la version du module CFFI Python n'est pas >= 1.6. Vous devez le mettre à niveau, par exemple en utilisant PIP dans un virtualenv.
AttributeError: 'FFI' object has no attribute 'set_source'