r2m2 é um plugin radare2 que visa facilitar a reversão de novas arquiteturas aproveitando os recursos radare2 e miasm2. Seu objetivo é ser o mais independente possível da arquitetura.
Ele une as comunidades radare2 e miasm2: radare2 sendo a interface gráfica do miasm2 e miasm2 simplificando a implementação de novas arquiteturas.
Atualmente, o r2m2 é capaz de montar, desmontar, dividir blocos, usando miasm2, e converter expressões internas do miasm2 para radare2 ESIL.
Interessado? Assista ao vídeo ou confira os slides de apresentação e design.
r2m2 fornece um único plugin radare2, que pode ser habilitado usando a opção -a
, usada na maioria dos comandos radare2. A variável de ambiente R2M2_ARCH
é utilizada para selecionar a arquitetura que será utilizada.
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 é a solução recomendada para usar r2m2. Cada solicitação pull é testada com Travis. Após o sucesso, uma imagem Docker é construída no Docker Hub e pode ser facilmente extraída da seguinte maneira:
r2m2$ docker pull guedou/r2m2
r2m2$ docker run --rm -it -e 'R2M2_ARCH=mips32l' guedou/r2m2 rasm2 -a r2m2 "addiu a0, a1, 2"
0200a424
O Dockerfile
cuida de tudo e constrói o r2m2. As linhas de comando a seguir mostram como construir a imagem do Docker, executar um contêiner temporário e testar o 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
Nota: compilações automáticas são realizadas no Ubuntu, Arch Linux e Mac OS X. Outras distribuições podem não funcionar devido a incompatibilidades de bibliotecas.
O seguinte software deve ser instalado:
radare2 (>= 2.9.0)
miasma2
Módulo CFFI Python (>= 1.6)
Módulo jinja2 Python (>= 1.6)
r2m2 pode ser construído da seguinte forma:
r2m2$ make all install
[..]
mkdir -p [..]
Você pode digitar o seguinte comando para verificar se tudo correu bem:
r2m2$ rasm2 -L |grep r2m2
adAe 32 r2m2 LGPL3 miasm2 backend
Se você receber o seguinte erro, a versão do módulo CFFI Python não é >= 1.6. Você precisa atualizá-lo, por exemplo, usando PIP em um virtualenv.
AttributeError: 'FFI' object has no attribute 'set_source'