rizin/test/db/analysis/mips

1866 lines
55 KiB
Text

NAME=mips ensure correct cpu is selected
FILE=bins/elf/analysis/mips-hello
CMDS=<<EOF
iI~cpu
iI~pie
iI~features
aaa
pdf @ entry0
pdf @ main
ao~0x @ 0x000804fc
EOF
EXPECT=<<EOF
cpu mips32
pie true
features noreorder pic cpic o32 n32
;-- section..text:
;-- _ftext:
;-- .text:
;-- __start:
;-- _start:
;-- pc:
/ entry0();
| ; var int32_t var_4h @ stack - 0x4
| 0x000804d0 bal 0x804d8 ; [06] -r-x section size 304 named .text ; entry0(void)
| 0x000804d4 nop
| ; CALL XREF from entry0 @ 0x804d0
| 0x000804d8 lui gp, 2
| 0x000804dc addiu gp, gp, -0x74d8
| 0x000804e0 addu gp, gp, ra
| 0x000804e4 move a0, sp
| 0x000804e8 addiu sp, sp, -0x20
| 0x000804ec sw zero, (var_4h)
| 0x000804f0 lw t9, -sym.do_mips_start(gp) ; [data.00091018:4]=0x8051c sym.do_mips_start
| 0x000804f4 jalr t9
| 0x000804f8 nop
| @-> 0x000804fc b 0x804fc
\ 0x00080500 nop
; DATA XREF from sym.do_mips_start @ 0x80544
/ int main(int argc, char **argv, char **envp);
| ; var int32_t var_10h @ stack - 0x10
| ; var int32_t var_8h @ stack - 0x8
| ; var int32_t var_4h @ stack - 0x4
| ; arg int32_t arg_10h @ stack + 0x10
| 0x000805a0 lui gp, 2
| 0x000805a4 addiu gp, gp, -0x75a0
| 0x000805a8 addu gp, gp, t9
| 0x000805ac addiu sp, sp, -0x20
| 0x000805b0 sw ra, (var_4h)
| 0x000805b4 sw fp, (var_8h)
| 0x000805b8 move fp, sp
| 0x000805bc sw gp, (var_10h)
| 0x000805c0 lw v0, -segment.LOAD0(gp) ; [data.0009103c:4]=0x80000 segment.ehdr
| 0x000805c4 addiu a0, v0, 0x640 ; 0x80640 ; "Hello World" ; str.Hello_World
| 0x000805c8 lw v0, -sym._MIPS_STUBS(gp) ; [data.00091048:4]=0x80600 sym.imp.puts
| 0x000805cc move t9, v0
| 0x000805d0 jalr t9
| 0x000805d4 nop
| 0x000805d8 lw gp, (arg_10h)
| 0x000805dc move sp, fp
| 0x000805e0 lw ra, (var_4h)
| 0x000805e4 lw fp, (var_8h)
| 0x000805e8 addiu sp, sp, 0x20
| 0x000805ec jr ra
\ 0x000805f0 nop
address: 0x804fc
opcode: b 0x804fc
disasm: b 0x804fc
pseudo: goto 0x804fc
rzil: (jmp (bv 32 0x804fc))
jump: 0x000804fc
EOF
RUN
NAME=micromips ensure correct cpu is selected
FILE=bins/elf/micromips.elf
CMDS=<<EOF
iI~cpu
iI~features
af
pdf
EOF
EXPECT=<<EOF
cpu micro32r3
features noreorder cpic o32 n32
;-- entry0:
;-- section..text:
;-- .text:
;-- _ftext:
/ int main(int argc, char **argv);
| ; arg int32_t arg_10h @ stack + 0x10
| ; arg int32_t arg_24h @ stack + 0x24
| 0x004000d0 lui gp, 2 ; [02] -r-x section size 512 named .text
| 0x004000d4 addiu gp, gp, -0x7de1
| 0x004000d8 addu gp, gp, t9
| 0x004000dc addiusp -0x28
| 0x004000de lw t9, -0x7fe4(gp) ; [0x41030c:4]=0x400221
| 0x004000e2 sw gp, (arg_10h)
| 0x004000e6 sw ra, (arg_24h)
| 0x004000e8 addiur1sp a1, 0x18
| 0x004000ea jalr t9
| 0x004000ec addiu a0, zero, 5
| 0x004000f0 lw ra, (arg_24h)
| 0x004000f2 jraddiusp 0x28
| ;-- deregister_tm_clones:
| 0x004000f4 lui a0, 0x41
| 0x004000f8 lui v0, 0x41
| 0x004000fc addiu a0, a0, 0x300
| 0x00400100 addiu v0, v0, 0x303
| 0x00400104 subu16 v0, v0, a0
| 0x00400106 sltiu v0, v0, 7
| ,=< 0x0040010a bnez16 v0, 0x400118
| | 0x0040010c lui t9, 0
| | 0x00400110 addiu t9, t9, 0
| ,==< 0x00400114 beqzc t9, loc..L6
| |`-> 0x00400118 jrc t9
| | ;-- .L6:
| `--> 0x0040011a jrc ra
EOF
RUN
NAME=nanomips ensure correct cpu is selected
FILE=bins/elf/emulateme.nanomips_i7200
CMDS=<<EOF
iI~cpu
iI~features
aaa
pdf @ entry0
pdf @ main
EOF
EXPECT=<<EOF
cpu i7200
features o32 n32
;-- section..text:
;-- __start:
;-- _start:
;-- pc:
/ entry0(int32_t arg4);
| ; arg int32_t arg4 @ a3
\ 0x004003d4 move fp, zero ; [08] -r-x section size 474 named .text
| 0x004003d6 lapc.h t0, sym._start_c
| 0x004003da lapc.h a1, obj._DYNAMIC
| 0x004003de lapc.h gp, loc._gp
| 0x004003e2 move a0, sp
| 0x004003e4 li at, -0x10
| 0x004003e8 and sp, sp, at
| 0x004003ec jalrc ra, t0
/ int main(int argc, char **argv, char **envp);
| ::: ; arg int32_t arg_8h @ stack + 0x8
| ::: ; arg int32_t arg_ch @ stack + 0xc
| ::: ; arg int32_t arg_1ch @ stack + 0x1c
| ::: 0x00400536 save 0x30, fp, ra, gp
| ::: 0x0040053a addiu fp, sp, -0xfd0
| ::: 0x0040053e lapc.h gp, loc._gp
| ::: 0x00400542 sw a0, (arg_ch)
| ::: 0x00400544 sw a1, (arg_8h)
| ::: 0x00400546 lw a3, (arg_ch)
| ::`=< 0x00400548 beqic a3, loc.__reloc_align___1, loc..L9
| :: 0x0040054c lw a3, (arg_8h)
| :: 0x0040054e lw a3, 0(a3)
| :: 0x00400550 move a1, a3
| :: 0x00400552 lapc.h a0, loc..LC0
| :: 0x00400556 lw a3, 0x28(gp) ; reloc.printf
| :: ; [0x420044:4]=0x4003ba
| :: 0x0040055a jalrc ra, a3
| :: 0x0040055c li a3, 1
| ::,=< 0x0040055e bc loc..L10
| ::| ;-- .L9:
| ::| 0x00400560 lw a3, (arg_8h)
| ::| 0x00400562 lw a3, 4(a3)
| ::| 0x00400564 sw a3, (arg_1ch)
| ::| 0x00400566 lw a0, (arg_1ch)
| ::| 0x00400568 lw a3, 0x24(gp) ; reloc.strlen
| ::| ; [0x420040:4]=0x4003b4 section..nanoMIPS.stubs
| ::| 0x0040056c jalrc ra, a3
| ::| 0x0040056e move a3, a0
| :`==< 0x00400570 beqic a3, 0x10, 0x400582
| : | 0x00400574 lapc.h a0, loc..LC1
| : | 0x00400578 lw a3, 0x2c(gp) ; reloc.puts
| : | ; [0x420048:4]=0x4003c0
| : | 0x0040057c jalrc ra, a3
| : | 0x0040057e li a3, 1
| :,==< 0x00400580 bc loc..L10
| :|| ;-- .L11:
| :|| 0x00400582 lw a0, (arg_1ch)
| `===< 0x00400584 balc[16] sym.decrypt
| || 0x00400586 move a3, a0
| ,===< 0x00400588 bnezc a3, loc..L12
| ||| 0x0040058a lapc.h a0, loc..LC2
| ||| 0x0040058e lw a3, 0x2c(gp) ; reloc.puts
| ||| ; [0x420048:4]=0x4003c0
| ||| 0x00400592 jalrc ra, a3
| ||| 0x00400594 li a3, 1
| ,====< 0x00400596 bc loc..L10
| |||| ;-- .L12:
| |`---> 0x00400598 lapc.h a1, obj.seckrit
| | || 0x0040059c lapc.h a0, loc..LC3
| | || 0x004005a0 lw a3, 0x28(gp) ; reloc.printf
| | || ; [0x420044:4]=0x4003ba
| | || 0x004005a4 jalrc ra, a3
| | || 0x004005a6 move a3, zero
| | || ;-- .L10:
| `-``-> 0x004005a8 move a0, a3
| 0x004005aa restore.jrc 0x30, fp, ra, gp
| ;-- (0x004005b0) section..fini:
| ;-- (0x004005b0) _fini:
\ 0x004005ae ~ sigrie 0x83e2
EOF
RUN
NAME=mips hello reference analysis
FILE=bins/elf/analysis/mips-hello
CMDS=<<EOF
s sym.main
aac
afl~?
EOF
EXPECT=<<EOF
1
EOF
RUN
NAME=mozi aae functions
FILE=bins/elf/mips-mozi
CMDS=<<EOF
aae
aflc
EOF
EXPECT=<<EOF
433
EOF
RUN
NAME=mips hello ref anal
FILE=bins/elf/analysis/mips.elf
ARGS=-e bin.strings=false -e analysis.strings=true
CMDS=<<EOF
e asm.bytes=true
s entry0
aae
s 0x0041ed50
pd 5~IGNORE
EOF
EXPECT=<<EOF
0x0041ed58 24a54268 addiu a1, a1, 0x4268 ; 0x474268 ; "IGNORE" ; str.IGNORE
EOF
RUN
NAME=mips hello ref analysis subtract
FILE=bins/elf/analysis/busybox-mips
ARGS=-e bin.strings=false -e analysis.strings=true
CMDS=<<EOF
e analysis.resolve.pointers=false
e asm.bytes=true
aae @ entry0
pd 1 @ 0x00406228
fs strings
axt @ str.busybox
EOF
EXPECT=<<EOF
0x00406228 fcc38424 addiu a0, a0, -0x3c04 ; 0x44c3fc ; "busybox" ; str.busybox
(nofunc); str.busybox 0x405fec [DATA] addiu a1, a1, -str.busybox
(nofunc); str.busybox 0x406228 [DATA] addiu a0, a0, -str.busybox
EOF
RUN
NAME=Calculate GP
FILE=bins/elf/analysis/mips64r2-ld-2.28.so
CMDS=<<EOF
s 0x000023f0
e asm.bytes=true
ar a0=0
pd 1
s 0x00002494
pd 1
EOF
EXPECT=<<EOF
0x000023f0 208084df ld a0, -0x7fe0(gp) ; [0x37020:8]=0x10a0 segment.DYNAMIC
0x00002494 488099df ld t9, -0x7fb8(gp) ; [0x37048:8]=0x134f0
EOF
RUN
NAME=mips ld(load doubleword) instruction
FILE=bins/elf/analysis/mips64r2-busybox-loongson
CMDS=<<EOF
s 0x120004460
e asm.bytes=true
f-*
fs-*
pd 1
EOF
EXPECT=<<EOF
0x120004460 208084df ld a0, -0x7fe0(gp) ; [0x1200ee290:8]=0x120005074
EOF
RUN
NAME=gp-based ref
FILE=bins/elf/analysis/mips-hello
CMDS=<<EOF
aae @ entry0
axt @ str.Hello_World
EOF
EXPECT=<<EOF
(nofunc); str.Hello_World 0x805c4 [DATA] addiu a0, v0, str.Hello_World
EOF
RUN
NAME=assembler
FILE==
CMDS=<<EOF
e asm.arch=mips
e asm.bits=32
e cfg.bigendian=false
pa lui t9, 0x41
e cfg.bigendian=true
pa lui t9, 0x41
e cfg.bigendian=false
pad 4100193c
e cfg.bigendian=true
pad 3c190041
EOF
EXPECT=<<EOF
4100193c
3c190041
lui t9, 0x41
lui t9, 0x41
EOF
RUN
NAME=with-spaces
FILE==
CMDS=<<EOF
e asm.arch=mips
e asm.bits=32
e cfg.bigendian=0
pa addiu v0, v1, 33
pa addiu v0 v1 33
e cfg.bigendian=1
pa addiu v0, v1, 33
pa addiu v0 v1 33
EOF
EXPECT=<<EOF
21006224
21006224
24620021
24620021
EOF
RUN
NAME=mips hello pseudo move instruction
FILE=bins/elf/analysis/mips-hello
ARGS=-e bin.strings=false -e analysis.strings=false
CMDS=<<EOF
e asm.bytes=true
pd 1 @ main+0x18
e asm.pseudo=true
pd 1 @ main+0x18
EOF
EXPECT=<<EOF
0x000805b8 21f0a003 move fp, sp
0x000805b8 21f0a003 fp = sp
EOF
RUN
NAME=mips pseudo sw + 0
FILE=malloc://32
ARGS=-a mips -m 0x80100000
CMDS=<<EOF
e cfg.bigendian=false
e io.va=true
e asm.bytes=true
wx 0000beaf
pd 1
e asm.pseudo=true
pd 1
EOF
EXPECT=<<EOF
0x80100000 0000beaf sw fp, 0(sp)
0x80100000 0000beaf word [sp] = fp
EOF
RUN
NAME=mips LE analisys
FILE=malloc://32
CMDS=<<EOF
wx 01001104
e asm.arch=mips
e asm.bits=32
e asm.cpu=mips3
e cfg.bigendian=false
e asm.nbytes=4
ao
EOF
EXPECT=<<EOF
address: 0x0
opcode: bal 8
disasm: bal 8
pseudo: call 8
mnemonic: bal
description: branch and link
mask: ff000000
prefix: 0
id: 225
bytes: 01001104
refptr: 0
size: 4
sign: false
type: call
cycles: 0
esil: 0,1,8,<<<,1,&,==,$z,?{,pc,4,+,ra,=,,pc,=,}
rzil: (seq (set ra (bv 64 0x8)) (jmp (bv 64 0x8)))
opex:
operands:
- type: "imm"
value: 8
jump: 0x00000008
direction: exec
delay: 1
family: cpu
EOF
RUN
NAME=mips LE back reference
FILE=malloc://32
ARGS=-m 0x80100000
CMDS=<<EOF
e io.va=true
wx 0000000000000000010000100000000000000000
e asm.arch=mips
e asm.bits=32
e asm.nbytes=4
e cfg.bigendian=false
af+ fcn.test @ 0x80100000
afb+ 0x80100000 0x80100000 20
pif
EOF
EXPECT=<<EOF
nop
nop
b 0x80100010
nop
nop
EOF
RUN
NAME=mips LE correct relative jump reference if not mapped from command line.
FILE=malloc://40
CMDS=<<EOF
e asm.calls=false
e asm.bytes=true
e asm.arch=mips
e asm.bits=32
e cfg.bigendian=false
e analysis.nopskip=false
e asm.cmtcol=0
e asm.comments=false
e asm.lines.bb=0
e asm.lines.fcn=0
e asm.nbytes=4
wx 0800040c000000000000000000000000000000000000000040040408000000000800e00300000000
aa
pdf
EOF
EXPECT=<<EOF
fcn.00000000();
0x00000000 0800040c jal 0x100020
0x00000004 00000000 nop
0x00000008 00000000 nop
0x0000000c 00000000 nop
0x00000010 00000000 nop
0x00000014 00000000 nop
0x00000018 40040408 j 0x101100
0x0000001c 00000000 nop
EOF
RUN
NAME=mips LE correct relative jump reference if mapped from command line.
FILE=malloc://40
ARGS=-m 0x80100000
CMDS=<<EOF
e io.va=true
e asm.calls=false
e asm.bytes=true
e asm.arch=mips
e asm.bits=32
e cfg.bigendian=false
e asm.lines.bb=0
e asm.lines.fcn=false
e asm.nbytes=4
wx 0800040c000000000000000000000000000000000000000040040408000000000800e00300000000
af
pd 10
afl
EOF
EXPECT=<<EOF
fcn.80100000();
0x80100000 0800040c jal fcn.80100020
0x80100004 00000000 nop
0x80100008 00000000 nop
0x8010000c 00000000 nop
0x80100010 00000000 nop
0x80100014 00000000 nop
0x80100018 40040408 j 0x80101100
0x8010001c 00000000 nop
; CALL XREF from fcn.80100000 @ 0x80100000
fcn.80100020();
0x80100020 0800e003 jr ra
0x80100024 00000000 nop
0x80100000 1 32 fcn.80100000
0x80100020 1 8 fcn.80100020
EOF
RUN
NAME=mips branch delay function sizing.
FILE=malloc://20
ARGS=-m 0x80100000
CMDS=<<EOF
e io.va=true
e asm.calls=false
e asm.bytes=true
e asm.arch=mips
e asm.bits=32
e asm.cpu=mips4
e cfg.bigendian=false
e asm.nbytes=4
e asm.lines.bb=false
e asm.lines.fcn=false
s 0x80100000
wx 0800e0030a1844000000000000000000000000
af
pdf
EOF
EXPECT=<<EOF
fcn.80100000();
0x80100000 0800e003 jr ra
0x80100004 0a184400 movz v1, v0, a0
EOF
RUN
NAME=mips branch delay function sizing.
FILE=malloc://20
CMDS=<<EOF
e asm.calls=false
e asm.bytes=true
e asm.arch=mips
e asm.bits=32
e asm.cpu=mips4
e cfg.bigendian=false
e asm.nbytes=4
e asm.lines.fcn=false
wx 0800e0030a1844000000000000000000000000
af
pdf
EOF
EXPECT=<<EOF
fcn.00000000();
0x00000000 0800e003 jr ra
0x00000004 0a184400 movz v1, v0, a0
EOF
RUN
NAME=mips branch delay function sizing with conditional jump loop.
FILE=malloc://40
ARGS=-m 0x80100000
CMDS=<<EOF
e io.va=true
e asm.calls=false
e asm.bytes=true
e asm.arch=mips
e asm.bits=32
e asm.cpu=mips4
e asm.comments=false
e cfg.bigendian=false
e asm.nbytes=4
e asm.lines.bb=false
e asm.lines.fcn=false
s 0x80100000
wx e0ffbd27000000000100001000000000fdff09150a1844000800e0032000bd270000000000000000000000
af
pdf
EOF
EXPECT=<<EOF
fcn.80100000();
0x80100000 e0ffbd27 addiu sp, sp, -0x20
0x80100004 00000000 nop
0x80100008 01000010 b 0x80100010
0x8010000c 00000000 nop
0x80100010 fdff0915 bne t0, t1, 0x80100008
0x80100014 0a184400 movz v1, v0, a0
0x80100018 0800e003 jr ra
0x8010001c 2000bd27 addiu sp, sp, 0x20
EOF
RUN
NAME=mips branch delay function sizing with conditional jump forward.
FILE=malloc://40
ARGS=-m 0x80100000
CMDS=<<EOF
e io.va=true
e asm.calls=false
e asm.bytes=true
e asm.arch=mips
e asm.bits=32
e asm.cpu=mips4
e cfg.bigendian=false
e asm.comments=false
e analysis.nopskip=false
e asm.nbytes=4
e asm.lines.bb=false
e asm.lines.fcn=false
s 0x80100000
wx e0ffbd27000000000100001000000000000000000a1844000800e003 2000bd270000000000000000000000
af
pdf
EOF
EXPECT=<<EOF
fcn.80100000();
0x80100000 e0ffbd27 addiu sp, sp, -0x20
0x80100004 00000000 nop
0x80100008 01000010 b 0x80100010
0x8010000c 00000000 nop
0x80100010 00000000 nop
0x80100014 0a184400 movz v1, v0, a0
0x80100018 0800e003 jr ra
0x8010001c 2000bd27 addiu sp, sp, 0x20
EOF
RUN
NAME=mips branch delay function sizing with conditional jump back.
FILE=malloc://40
ARGS=-m 0x80100000
CMDS=<<EOF
e io.va=true
e asm.calls=false
e asm.arch=mips
e asm.bits=32
e asm.cpu=mips4
e cfg.bigendian=false
e asm.comments=false
e asm.bytes=true
e analysis.nopskip=false
e asm.nbytes=4
e asm.lines.bb=false
e asm.lines.fcn=false
wx e0ffbd27000000000000000000000000fdff09150a1844000800e0032000bd270000000000000000000000
af
pdf
EOF
EXPECT=<<EOF
fcn.80100000();
0x80100000 e0ffbd27 addiu sp, sp, -0x20
0x80100004 00000000 nop
0x80100008 00000000 nop
0x8010000c 00000000 nop
0x80100010 fdff0915 bne t0, t1, 0x80100008
0x80100014 0a184400 movz v1, v0, a0
0x80100018 0800e003 jr ra
0x8010001c 2000bd27 addiu sp, sp, 0x20
EOF
RUN
NAME=mips branch delay function sizing with conditional jump back then forward.
FILE=malloc://56
ARGS=-m 0x80100000
CMDS=<<EOF
e io.va=true
e asm.bytes=true
e asm.calls=false
e asm.arch=mips
e asm.bits=32
e asm.cpu=mips4
e cfg.bigendian=false
e asm.comments=false
e analysis.nopskip=false
e asm.nbytes=4
e asm.lines.bb=false
e asm.lines.fcn=false
wx e0ffbd27000000000000000000000000fdff09150000000001000010000000000a1844000800e0032000bd270000000000000000000000
af
pdf
EOF
EXPECT=<<EOF
fcn.80100000();
0x80100000 e0ffbd27 addiu sp, sp, -0x20
0x80100004 00000000 nop
0x80100008 00000000 nop
0x8010000c 00000000 nop
0x80100010 fdff0915 bne t0, t1, 0x80100008
0x80100014 00000000 nop
0x80100018 01000010 b 0x80100020
0x8010001c 00000000 nop
0x80100020 0a184400 movz v1, v0, a0
0x80100024 0800e003 jr ra
0x80100028 2000bd27 addiu sp, sp, 0x20
EOF
RUN
NAME=mips branch delay function detection #1.
FILE=malloc://160
ARGS=-m 0x8060b4f8
CMDS=<<EOF
e io.va=true
e asm.calls=false
e asm.bytes=true
e asm.arch=mips
e asm.bits=32
e cfg.bigendian=false
e asm.comments=0
e analysis.hasnext=1
e analysis.nopskip=1
e asm.nbytes=4
e asm.lines.bb=false
e asm.lines.fcn=false
s 0x8060b4f8
wx 0000000000000000002e0500032e05000f00801021100000492d1808000082900800e003211080000000829007004010000000000016020003160200f8ff451000000000482d180801008424211000000800e003000000000000a290050040100100a524000082a00000a290552d1808010084240800e003000080a000000000e0ffbd27542d180c000000000800e0032000bd270000000000000000
aa
pd 38
EOF
EXPECT=<<EOF
0x8060b4f8 00000000 nop
0x8060b4fc 00000000 nop
fcn.8060b500(int32_t arg1, int32_t arg2);
; arg int32_t arg1 @ a0
; arg int32_t arg2 @ a1
0x8060b500 002e0500 sll a1, a1, 0x18
0x8060b504 032e0500 sra a1, a1, 0x18
0x8060b508 0f008010 beqz a0, 0x8060b548
0x8060b50c 21100000 move v0, zero
0x8060b510 492d1808 j 0x8060b524
0x8060b514 00008290 lbu v0, (arg1)
0x8060b518 0800e003 jr ra
0x8060b51c 21108000 move v0, a0
0x8060b520 00008290 lbu v0, (arg1)
0x8060b524 07004010 beqz v0, 0x8060b544
0x8060b528 00000000 nop
0x8060b52c 00160200 sll v0, v0, 0x18
0x8060b530 03160200 sra v0, v0, 0x18
0x8060b534 f8ff4510 beq v0, a1, 0x8060b518
0x8060b538 00000000 nop
0x8060b53c 482d1808 j 0x8060b520
0x8060b540 01008424 addiu a0, a0, 1
0x8060b544 21100000 move v0, zero
0x8060b548 0800e003 jr ra
0x8060b54c 00000000 nop
fcn.8060b550(int32_t arg1, int32_t arg2);
; arg int32_t arg1 @ a0
; arg int32_t arg2 @ a1
0x8060b550 0000a290 lbu v0, (arg2)
0x8060b554 05004010 beqz v0, 0x8060b56c
0x8060b558 0100a524 addiu a1, a1, 1
0x8060b55c 000082a0 sb v0, (arg1)
0x8060b560 0000a290 lbu v0, (arg2)
0x8060b564 552d1808 j 0x8060b554
0x8060b568 01008424 addiu a0, a0, 1
0x8060b56c 0800e003 jr ra
0x8060b570 000080a0 sb zero, (arg1)
0x8060b574 00000000 nop
fcn.8060b578();
0x8060b578 e0ffbd27 addiu sp, sp, -0x20
0x8060b57c 542d180c jal fcn.8060b550
0x8060b580 00000000 nop
0x8060b584 0800e003 jr ra
0x8060b588 2000bd27 addiu sp, sp, 0x20
0x8060b58c 00000000 nop
EOF
RUN
NAME=capstone: mips branch delay function detection #2.
FILE=malloc://160
ARGS=-m 0x8060b4f8
CMDS=<<EOF
e io.va=true
e asm.calls=false
e asm.bytes=true
e asm.arch=mips
e asm.bits=32
e cfg.bigendian=false
e analysis.noncode=1
e asm.comments=0
e analysis.hasnext=1
e analysis.nopskip=1
e asm.nbytes=4
e asm.lines.bb=false
e asm.lines.fcn=true
s 0x8060b4f8
wx 0000000000000000002e0500032e05000f00801021100000492d1808000082900800e003211080000000829007004010000000000016020003160200f8ff451000000000482d180801008424211000000800e003000000000000a290050040100100a524000082a00000a290552d1808010084240800e003000080a000000000e0ffbd27542d180c000000000800e0032000bd270000000000000000
aa
pd 38
EOF
EXPECT=<<EOF
0x8060b4f8 00000000 nop
0x8060b4fc 00000000 nop
/ fcn.8060b500(int32_t arg1, int32_t arg2);
| ; arg int32_t arg1 @ a0
| ; arg int32_t arg2 @ a1
| 0x8060b500 002e0500 sll a1, a1, 0x18
| 0x8060b504 032e0500 sra a1, a1, 0x18
| 0x8060b508 0f008010 beqz a0, 0x8060b548
| 0x8060b50c 21100000 move v0, zero
| 0x8060b510 492d1808 j 0x8060b524
| 0x8060b514 00008290 lbu v0, (arg1)
| 0x8060b518 0800e003 jr ra
| 0x8060b51c 21108000 move v0, a0
| 0x8060b520 00008290 lbu v0, (arg1)
| 0x8060b524 07004010 beqz v0, 0x8060b544
| 0x8060b528 00000000 nop
| 0x8060b52c 00160200 sll v0, v0, 0x18
| 0x8060b530 03160200 sra v0, v0, 0x18
| 0x8060b534 f8ff4510 beq v0, a1, 0x8060b518
| 0x8060b538 00000000 nop
| 0x8060b53c 482d1808 j 0x8060b520
| 0x8060b540 01008424 addiu a0, a0, 1
| 0x8060b544 21100000 move v0, zero
| 0x8060b548 0800e003 jr ra
\ 0x8060b54c 00000000 nop
/ fcn.8060b550(int32_t arg1, int32_t arg2);
| ; arg int32_t arg1 @ a0
| ; arg int32_t arg2 @ a1
| 0x8060b550 0000a290 lbu v0, (arg2)
| 0x8060b554 05004010 beqz v0, 0x8060b56c
| 0x8060b558 0100a524 addiu a1, a1, 1
| 0x8060b55c 000082a0 sb v0, (arg1)
| 0x8060b560 0000a290 lbu v0, (arg2)
| 0x8060b564 552d1808 j 0x8060b554
| 0x8060b568 01008424 addiu a0, a0, 1
| 0x8060b56c 0800e003 jr ra
\ 0x8060b570 000080a0 sb zero, (arg1)
0x8060b574 00000000 nop
/ fcn.8060b578();
| 0x8060b578 e0ffbd27 addiu sp, sp, -0x20
| 0x8060b57c 542d180c jal fcn.8060b550
| 0x8060b580 00000000 nop
| 0x8060b584 0800e003 jr ra
\ 0x8060b588 2000bd27 addiu sp, sp, 0x20
0x8060b58c 00000000 nop
EOF
RUN
NAME=mips big endian strings, calls, etc. analysis
FILE=bins/elf/analysis/mipsbe-ip
CMDS=<<EOF
s 0x00402088
e asm.bytes=true
pd 10
EOF
EXPECT=<<EOF
0x00402088 8f84814c lw a0, -main(gp) ; [0x43522c:4]=0x402558 sym.main
0x0040208c 8fa50000 lw a1, 0(sp)
0x00402090 27a60004 addiu a2, sp, 4
0x00402094 2401fff8 addiu at, zero, -8
0x00402098 03a1e824 and sp, sp, at
0x0040209c 27bdffe0 addiu sp, sp, -0x20
0x004020a0 8f878230 lw a3, -sym._init(gp) ; [0x435310:4]=0x401ff4 sym._init
0x004020a4 8f888114 lw t0, -sym._fini(gp) ; [0x4351f4:4]=0x41eca0 sym._fini
0x004020a8 afa80010 sw t0, 0x10(sp)
0x004020ac afa20014 sw v0, 0x14(sp)
EOF
RUN
NAME=mips sp/bp tracking
FILE=bins/elf/vars-mips-bp
ARGS=-e bin.dbginfo=0
CMDS=<<EOF
s sym.varfunc
af
e asm.sub.var=0
e asm.comments=0
e asm.stackptr=0
pdf
afvx
EOF
EXPECT=<<EOF
/ sym.varfunc(int32_t arg_10h, int32_t arg_18h, int32_t arg_1ch, int32_t arg_20h, int32_t arg_24h);
| ; var int32_t var_20h @ stack - 0x20
| ; var int32_t var_8h @ stack - 0x8
| ; var int32_t var_4h @ stack - 0x4
| ; arg int32_t arg_10h @ stack + 0x10
| ; arg int32_t arg_18h @ stack + 0x18
| ; arg int32_t arg_1ch @ stack + 0x1c
| ; arg int32_t arg_20h @ stack + 0x20
| ; arg int32_t arg_24h @ stack + 0x24
| 0x00000794 lui gp, 2
| 0x00000798 addiu gp, gp, -0x7db4
| 0x0000079c addu gp, gp, t9
| 0x000007a0 addiu sp, sp, -0x30
| 0x000007a4 sw ra, 0x2c(sp)
| 0x000007a8 sw fp, 0x28(sp)
| 0x000007ac move fp, sp
| 0x000007b0 sw gp, 0x10(sp)
| 0x000007b4 addiu v0, zero, 1
| 0x000007b8 sw v0, 0x18(fp)
| 0x000007bc addiu v0, zero, 2
| 0x000007c0 sw v0, 0x1c(fp)
| 0x000007c4 addiu v0, zero, 3
| 0x000007c8 sw v0, 0x20(fp)
| 0x000007cc addiu v0, zero, 4
| 0x000007d0 sw v0, 0x24(fp)
| 0x000007d4 lw v0, -sym.leaffunc(gp)
| 0x000007d8 move t9, v0
| 0x000007dc bal sym.leaffunc
| 0x000007e0 nop
| 0x000007e4 lw gp, 0x10(fp)
| 0x000007e8 lw v0, 0x24(fp)
| 0x000007ec sw v0, 0x1c(fp)
| 0x000007f0 lw v0, 0x18(fp)
| 0x000007f4 move sp, fp
| 0x000007f8 lw ra, 0x2c(sp)
| 0x000007fc lw fp, 0x28(sp)
| 0x00000800 addiu sp, sp, 0x30
| 0x00000804 jr ra
\ 0x00000808 nop
afvR
arg_18h 0x7f0
arg_1ch
arg_20h
arg_24h 0x7e8
arg_10h 0x7e4
var_8h 0x7fc
var_4h 0x7f8
var_20h
afvW
arg_18h 0x7b8
arg_1ch 0x7c0,0x7ec
arg_20h 0x7c8
arg_24h 0x7d0
arg_10h
var_8h 0x7a8
var_4h 0x7a4
var_20h 0x7b0
EOF
RUN
NAME=pdf main mips be
FILE=bins/elf/analysis/mipsbe-ip
CMDS=<<EOF
aa
pdf @ main
EOF
EXPECT=<<EOF
/ int main(int argc, char **argv, char **envp);
| ; arg int argc @ a0
| ; arg char **argv @ a1
| ; arg char **envp @ a2
| ; var int32_t var_40h @ stack - 0x40
| ; var int32_t var_38h @ stack - 0x38
| ; var int32_t var_30h @ stack - 0x30
| ; var int32_t var_2ch @ stack - 0x2c
| ; var int32_t var_28h @ stack - 0x28
| ; var int32_t var_24h @ stack - 0x24
| ; var int32_t var_20h @ stack - 0x20
| ; var int32_t var_1ch @ stack - 0x1c
| ; var int32_t var_18h @ stack - 0x18
| ; var int32_t var_14h @ stack - 0x14
| ; var int32_t var_10h @ stack - 0x10
| ; var int32_t var_ch @ stack - 0xc
| ; var int32_t var_8h @ stack - 0x8
| ; var int32_t var_4h @ stack - 0x4
| 0x00402558 addiu sp, sp, -0x50
| 0x0040255c sw ra, (var_4h)
| 0x00402560 sw fp, (var_8h)
| 0x00402564 sw s7, (var_ch)
| 0x00402568 sw s6, (var_10h)
| 0x0040256c sw s5, (var_14h)
| 0x00402570 sw s4, (var_18h)
| 0x00402574 sw s3, (var_1ch)
| 0x00402578 sw s2, (var_20h)
| 0x0040257c sw s1, (var_24h)
| 0x00402580 sw s0, (var_28h)
| 0x00402584 lui gp, 0x44
| 0x00402588 addiu gp, gp, -0x2f20
| 0x0040258c sw gp, (var_40h)
| 0x00402590 move s0, a1 ; argv
| 0x00402594 lw t9, -sym.imp.strrchr(gp) ; [0x4352f8:4]=0x41e910 sym.imp.strrchr
| 0x00402598 addiu a1, zero, 0x2f
| 0x0040259c lw s6, 0(s0)
| 0x004025a0 move s1, a0 ; argc
| 0x004025a4 jalr t9
| 0x004025a8 move a0, s6
| 0x004025ac slti v1, s1, 2
| 0x004025b0 addiu a0, v0, 1
| 0x004025b4 lw gp, (var_40h)
| ,=< 0x004025b8 bnez v1, 0x402708
..
| .--> 0x004025ec sw s0, (var_30h)
| :| 0x004025f0 addiu s0, s0, 4
| :| 0x004025f4 lw v1, 0(s0)
| :| 0x004025f8 addiu a1, s2, -0x10c0
| :| 0x004025fc lw t9, -sym.imp.strcmp(gp) ; [0x435200:4]=0x41eb40 sym.imp.strcmp
| :| 0x00402600 move a0, v1
| :| 0x00402604 jalr t9
| :| 0x00402608 sw v1, (var_2ch)
| :| 0x0040260c lw gp, (var_40h)
| :| 0x00402610 lw v1, (var_2ch)
| ,===< 0x00402614 beqz v0, 0x402944
| |:| 0x00402618 addiu v0, zero, 0x2d
| |:| 0x0040261c lb a0, 0(v1)
| ,====< 0x00402620 bne a0, v0, 0x40295c
| ||:| 0x00402624 addiu a2, v1, 1
| ||:| 0x00402628 lb v0, 1(v1)
| ||:| 0x0040262c move a1, s3
| ||:| 0x00402630 lw t9, -sym.matches(gp) ; [0x4351ac:4]=0x41b2b4 sym.matches
| ||:| 0x00402634 xori v0, v0, 0x2d
..
| |||||:| ; XREFS: CODE 0x00402a64 CODE 0x00402a9c CODE 0x00402ae0
| |||||:| ; XREFS: CODE 0x00402b40 CODE 0x00402ba8 CODE 0x00402c0c
| --------> 0x004026f8 addiu s1, s1, -1
| |||||:| 0x004026fc slti v0, s1, 2
| |||||`==< 0x00402700 beqz v0, 0x4025ec
| ||||| | 0x00402704 nop
| ||||| `-> 0x00402708 lui v0, 0x43
| ||||| 0x0040270c lw v0, 0x5470(v0)
| ||||| ,=< 0x00402710 bnez v0, 0x402850
| ||||| | 0x00402714 lui v0, 0x43
| ||||| | ; CODE XREF from main @ 0x402954
| |||||.--> 0x00402718 lui v1, 0x42
| |||||:| ; CODE XREF from main @ 0x402970
| --------> 0x0040271c lw a0, 0x547c(v0)
| |||||:| 0x00402720 addiu v1, v1, 0x3ac
| |||||:| 0x00402724 lui v0, 0x43
| ========< 0x00402728 beqz a0, 0x402868
| |||||:| 0x0040272c sw v1, 0x5478(v0)
| --------> 0x00402730 jal fcn.00402338
| |||||:| 0x00402734 nop
| |||||:| ; CODE XREF from main @ 0x4029c0
| --------> 0x00402738 lw ra, (var_4h)
| |||||:| 0x0040273c lw fp, (var_8h)
| |||||:| 0x00402740 lw s7, (var_ch)
| |||||:| 0x00402744 lw s6, (var_10h)
| |||||:| 0x00402748 lw s5, (var_14h)
| |||||:| 0x0040274c lw s4, (var_18h)
| |||||:| 0x00402750 lw s3, (var_1ch)
| |||||:| 0x00402754 lw s2, (var_20h)
| |||||:| 0x00402758 lw s1, (var_24h)
| |||||:| 0x0040275c lw s0, (var_28h)
| |||||:| 0x00402760 jr ra
| |||||:| 0x00402764 addiu sp, sp, 0x50
..
| .-------> 0x0040284c lui v0, 0x43
| :||||:`-> 0x00402850 lui v1, 0x42
| :||||: 0x00402854 lw a0, 0x547c(v0)
| :||||: 0x00402858 addiu v1, v1, -0xf90
| :||||: 0x0040285c lui v0, 0x43
| ========< 0x00402860 bnez a0, 0x402730
| :||||: 0x00402864 sw v1, 0x5478(v0)
| --------> 0x00402868 lw t9, -sym.rtnl_open(gp) ; [0x435300:4]=0x41a99c sym.rtnl_open
| :||||: 0x0040286c lui s2, 0x43
| :||||: 0x00402870 addiu a0, s2, 0x3c60
| :||||: 0x00402874 jalr t9
| :||||: 0x00402878 move a1, zero
| :||||: 0x0040287c lw gp, (var_40h)
| :||||:,=< 0x00402880 bltz v0, 0x402aa4
| :||||:| 0x00402884 nop
| :||||:| 0x00402888 lw t9, -sym.imp.strlen(gp) ; [0x435174:4]=0x41ec10 sym.imp.strlen
| :||||:| 0x0040288c jalr t9
| :||||:| 0x00402890 move a0, s6
| :||||:| 0x00402894 sltiu v0, v0, 3
| :||||:| 0x00402898 lw gp, (var_40h)
| ========< 0x0040289c beqz v0, 0x4029b4
| :||||:| 0x004028a0 addiu a0, s6, 2
| :||||:| 0x004028a4 slti v0, s1, 2
| ========< 0x004028a8 bnez v0, 0x402a20
| :||||:| 0x004028ac nop
| :||||:| 0x004028b0 lw a0, 4(s0)
| :||||:| 0x004028b4 addiu a1, s1, -1
| :||||:| 0x004028b8 jal fcn.00402210
| :||||:| 0x004028bc addiu a2, s0, 4
| :||||:| 0x004028c0 lw ra, (var_4h)
| :||||:| 0x004028c4 lw fp, (var_8h)
| :||||:| 0x004028c8 lw s7, (var_ch)
| :||||:| 0x004028cc lw s6, (var_10h)
| :||||:| 0x004028d0 lw s5, (var_14h)
| :||||:| 0x004028d4 lw s4, (var_18h)
| :||||:| 0x004028d8 lw s3, (var_1ch)
| :||||:| 0x004028dc lw s2, (var_20h)
| :||||:| 0x004028e0 lw s1, (var_24h)
| :||||:| 0x004028e4 lw s0, (var_28h)
| :||||:| 0x004028e8 jr ra
| :||||:| 0x004028ec addiu sp, sp, 0x50
..
| :|||`---> 0x00402944 lui v0, 0x43
| :||| :| 0x00402948 lw v0, 0x5470(v0)
| ========< 0x0040294c bnez v0, 0x40284c
| :||| :| 0x00402950 addiu s1, s1, -1
| :||| `==< 0x00402954 b 0x402718
| :||| | 0x00402958 lui v0, 0x43
| :||`----> 0x0040295c lui v0, 0x43
| :|| | 0x00402960 lw v0, 0x5470(v0)
| :|| | 0x00402964 lw s0, (var_30h)
| `=======< 0x00402968 bnez v0, 0x40284c
| || | 0x0040296c lui v0, 0x43
| ========< 0x00402970 b 0x40271c
| || | 0x00402974 lui v1, 0x42
..
| --------> 0x004029b4 move a1, s1
| | :|| 0x004029b8 jal fcn.00402210
| | :|| 0x004029bc move a2, s0
| ========< 0x004029c0 b 0x402738
| | :|| 0x004029c4 nop
..
| --------> 0x00402a20 lw t9, -sym.rtnl_close(gp) ; [0x4352c8:4]=0x41a9b8 sym.rtnl_close
| | || 0x00402a24 jalr t9
| | || 0x00402a28 addiu a0, s2, 0x3c60
| -`...---> 0x00402a2c jal fcn.004022e4
| :::|| 0x00402a30 nop
| :::`--> 0x00402a34 lw t9, -sym.matches(gp) ; [0x4351ac:4]=0x41b2b4 sym.matches
| ::: | 0x00402a38 lui a1, 0x42
| ::: | 0x00402a3c move a0, a2
| ::: | 0x00402a40 sw a2, (var_2ch)
| ::: | 0x00402a44 jalr t9
| ::: | 0x00402a48 addiu a1, a1, -0x1044
| ::: | 0x00402a4c lw gp, (var_40h)
| ::: | 0x00402a50 lw a2, (var_2ch)
| :::,==< 0x00402a54 bnez v0, 0x402a6c
| :::|| 0x00402a58 lui v0, 0x43
| :::|| 0x00402a5c lw v1, 0x546c(v0)
| :::|| 0x00402a60 addiu v1, v1, 1
| ========< 0x00402a64 b 0x4026f8
| :::|| 0x00402a68 sw v1, 0x546c(v0)
| :::`--> 0x00402a6c lw t9, -sym.matches(gp) ; [0x4351ac:4]=0x41b2b4 sym.matches
| ::: | 0x00402a70 lui a1, 0x42
| ::: | 0x00402a74 move a0, a2
| ::: | 0x00402a78 sw a2, (var_2ch)
| ::: | 0x00402a7c jalr t9
| ::: | 0x00402a80 addiu a1, a1, -0x1038
| ::: | 0x00402a84 lw gp, (var_40h)
| ::: | 0x00402a88 lw a2, (var_2ch)
| :::,==< 0x00402a8c bnez v0, 0x402ab0
| :::|| 0x00402a90 lui v0, 0x43
| :::|| 0x00402a94 lw v1, 0x5470(v0)
| :::|| 0x00402a98 addiu v1, v1, 1
| ========< 0x00402a9c b 0x4026f8
| :::|| 0x00402aa0 sw v1, 0x5470(v0)
| :::|`-> 0x00402aa4 lw t9, -sym.imp.exit(gp) ; [0x4351a4:4]=0x41ebb0 sym.imp.exit
| :::| 0x00402aa8 jalr t9
| :::| 0x00402aac addiu a0, zero, 1
| :::`--> 0x00402ab0 lw t9, -sym.matches(gp) ; [0x4351ac:4]=0x41b2b4 sym.matches
| ::: 0x00402ab4 lui a1, 0x42
| ::: 0x00402ab8 move a0, a2 ; envp
| ::: 0x00402abc sw a2, (var_2ch)
| ::: 0x00402ac0 jalr t9
| ::: 0x00402ac4 addiu a1, a1, -0x102c
| ::: 0x00402ac8 lw gp, (var_40h)
| ::: 0x00402acc lw a2, (var_2ch)
| ::: ,=< 0x00402ad0 bnez v0, 0x402ae8
| ::: | 0x00402ad4 lui v0, 0x43
| ::: | 0x00402ad8 lw v1, 0x5474(v0)
| ::: | 0x00402adc addiu v1, v1, 1
| ========< 0x00402ae0 b 0x4026f8
| ::: | 0x00402ae4 sw v1, 0x5474(v0)
| ::: `-> 0x00402ae8 lw t9, -sym.matches(gp) ; [0x4351ac:4]=0x41b2b4 sym.matches
| ::: 0x00402aec lui a1, 0x42
| ::: 0x00402af0 move a0, a2 ; envp
| ::: 0x00402af4 sw a2, (var_2ch)
| ::: 0x00402af8 jalr t9
| ::: 0x00402afc addiu a1, a1, -0x1020
| ::: 0x00402b00 lw gp, (var_40h)
| ::: 0x00402b04 lw a2, (var_2ch)
| ::: ,=< 0x00402b08 beqz v0, 0x402b48
| ::: | 0x00402b0c lui a0, 0x42
| ::: | 0x00402b10 lw t9, -sym.matches(gp) ; [0x4351ac:4]=0x41b2b4 sym.matches
| ::: | 0x00402b14 lui a1, 0x42
| ::: | 0x00402b18 move a0, a2 ; envp
| ::: | 0x00402b1c sw a2, (var_2ch)
| ::: | 0x00402b20 jalr t9
| ::: | 0x00402b24 addiu a1, a1, -0xff8
| ::: | 0x00402b28 lw gp, (var_40h)
| ::: | 0x00402b2c lw a2, (var_2ch)
| :::,==< 0x00402b30 bnez v0, 0x402b6c
| :::|| 0x00402b34 lui v0, 0x43
| :::|| 0x00402b38 lw v1, 0x5480(v0)
| :::|| 0x00402b3c addiu v1, v1, 1
| ========< 0x00402b40 b 0x4026f8
| :::|| 0x00402b44 sw v1, 0x5480(v0)
| :::|`-> 0x00402b48 lw t9, -sym.imp.printf(gp) ; [0x4353ec:4]=0x41e7b0 sym.imp.printf
| :::| 0x00402b4c lui a1, 0x42
| :::| 0x00402b50 addiu a0, a0, -0x1014
| :::| 0x00402b54 jalr t9
| :::| 0x00402b58 addiu a1, a1, -0xf20
| :::| 0x00402b5c lw gp, (var_40h)
| :::| 0x00402b60 lw t9, -sym.imp.exit(gp) ; [0x4351a4:4]=0x41ebb0 sym.imp.exit
| :::| 0x00402b64 jalr t9
| :::| 0x00402b68 move a0, zero
| :::`--> 0x00402b6c lw t9, -sym.matches(gp) ; [0x4351ac:4]=0x41b2b4 sym.matches
| ::: 0x00402b70 lui a1, 0x42
| ::: 0x00402b74 move a0, a2 ; envp
| ::: 0x00402b78 sw a2, (var_2ch)
| ::: 0x00402b7c jalr t9
| ::: 0x00402b80 addiu a1, a1, -0xff0
| ::: 0x00402b84 lw gp, (var_40h)
| ::: 0x00402b88 lw a2, (var_2ch)
| ::: ,=< 0x00402b8c bnez v0, 0x402bb0
| ::: | 0x00402b90 addiu v0, zero, 1
| ::: | 0x00402b94 addiu s1, s1, -1
| `=====< 0x00402b98 beq s1, v0, 0x402a2c
| :: | 0x00402b9c addiu s0, s0, 4
| :: | 0x00402ba0 lui v0, 0x43
| :: | 0x00402ba4 lw v1, 0(s0)
| ========< 0x00402ba8 b 0x4026f8
..
| :: `-> 0x00402bb0 lw t9, -sym.matches(gp) ; [0x4351ac:4]=0x41b2b4 sym.matches
| :: 0x00402bb4 lui a1, 0x42
| :: 0x00402bb8 move a0, a2 ; envp
| :: 0x00402bbc sw a2, (var_2ch)
| :: 0x00402bc0 jalr t9
| :: 0x00402bc4 addiu a1, a1, -0xfe8
| :: 0x00402bc8 lw gp, (var_40h)
| :: 0x00402bcc lw a2, (var_2ch)
| :: ,=< 0x00402bd0 bnez v0, 0x402c14
| :: | 0x00402bd4 addiu s1, s1, -1
| :: | 0x00402bd8 addiu v0, zero, 1
| `====< 0x00402bdc beq s1, v0, 0x402a2c
| : | 0x00402be0 addiu s0, s0, 4
| : | 0x00402be4 addiu a0, sp, 0x18
| : | 0x00402be8 lw t9, -sym.get_unsigned(gp) ; [0x435178:4]=0x41bec4 sym.get_unsigned
| : | 0x00402bec lw a1, 0(s0)
| : | 0x00402bf0 jalr t9
| : | 0x00402bf4 move a2, zero
| : | 0x00402bf8 lw gp, (var_40h)
| :,==< 0x00402bfc bnez v0, 0x402c68
| :|| 0x00402c00 nop
| :|| 0x00402c04 lw v1, (var_38h)
| :|| 0x00402c08 lw v0, -obj.rcvbuf(gp) ; [0x4351fc:4]=0x433ca0 obj.rcvbuf
| ========< 0x00402c0c b 0x4026f8
| :|| 0x00402c10 sw v1, 0(v0)
| :|`-> 0x00402c14 lw t9, -sym.matches(gp) ; [0x4351ac:4]=0x41b2b4 sym.matches
| :| 0x00402c18 lui a1, 0x42
| :| 0x00402c1c move a0, a2 ; envp
| :| 0x00402c20 sw a2, (var_2ch)
| :| 0x00402c24 jalr t9
| :| 0x00402c28 addiu a1, a1, -0xfc4
| :| 0x00402c2c lw gp, (var_40h)
| :| 0x00402c30 lw a2, (var_2ch)
| `===< 0x00402c34 beqz v0, 0x402a2c
| | 0x00402c38 nop
| | 0x00402c3c lw v0, -0x7efc(gp) ; [0x4351e4:4]=0
| | 0x00402c40 lui a1, 0x42
| | 0x00402c44 lw t9, -sym.imp.fprintf(gp) ; [0x4352dc:4]=0x41e940 sym.imp.fprintf
| | 0x00402c48 addiu a1, a1, -0xfbc
| | 0x00402c4c lw a0, 0(v0)
| | ; CODE XREF from main @ 0x402c7c
| |.-> 0x00402c50 jalr t9
| |: 0x00402c54 nop
| |: 0x00402c58 lw gp, (var_40h)
| |: 0x00402c5c lw t9, -sym.imp.exit(gp) ; [0x4351a4:4]=0x41ebb0 sym.imp.exit
| |: 0x00402c60 jalr t9
| |: 0x00402c64 addiu a0, zero, -1
| `--> 0x00402c68 lw v0, -0x7efc(gp) ; [0x4351e4:4]=0
| : 0x00402c6c lui a1, 0x42
| : 0x00402c70 lw a2, 0(s0)
| : 0x00402c74 lw a0, 0(v0)
| : 0x00402c78 lw t9, -sym.imp.fprintf(gp) ; [0x4352dc:4]=0x41e940 sym.imp.fprintf
\ `=< 0x00402c7c b 0x402c50
EOF
RUN
NAME=mips ensure family is set
FILE==
CMDS=<<EOF
e asm.arch=mips
e asm.cpu=mips32r2
e cfg.bigendian=false
wx 20204401
ao
echo '==============='
wx b01e727e
ao
echo '==============='
wx 8e422046
ao
echo '==============='
wx 9a92c746
ao
echo '==============='
wx b019477e
ao
echo '==============='
wx b018477e
ao
echo '==============='
wx 12510778
ao
echo '==============='
e asm.cpu=mips32r6
wx 0a000042
ao
echo '==============='
wx ac02447d
ao
echo '==============='
wx 0920407d
ao
echo '==============='
wx 0f00447d
ao
EOF
EXPECT=<<EOF
address: 0x0
opcode: add a0, t2, a0
disasm: add a0, t2, a0
pseudo: a0 = t2 + a0
mnemonic: add
description: adds two registers, trap on overflow
mask: ffffffff
prefix: 0
id: 98
bytes: 20204401
refptr: 0
size: 4
sign: true
type: add
cycles: 0
esil: 30,0x80000000,t2,a0,^,&,>>,31,0x80000000,t2,a0,+,&,>>,|,1,==,$z,?{,$$,1,TRAP,}{,t2,a0,+,a0,=,}
rzil: (set a0 (cast 32 (msb (+ (var t2) (var a0))) (+ (var t2) (var a0))))
opex:
operands:
- type: "reg"
value: "a0"
- type: "reg"
value: "t2"
- type: "reg"
value: "a0"
family: cpu
===============
address: 0x0
opcode: dpaqx_sa.w.ph ac3, s3, s2
disasm: dpaqx_sa.w.ph ac3, s3, s2
pseudo: asm("dpaqx_sa.w.ph ac3, s3, s2")
mnemonic: dpaqx_sa.w.ph
mask: ffffffff
prefix: 0
id: 541
bytes: b01e727e
refptr: 0
size: 4
sign: false
type: null
cycles: 0
opex:
operands:
- type: "reg"
value: "ac3"
- type: "reg"
value: "s3"
- type: "reg"
value: "s2"
family: mmx
===============
address: 0x0
opcode: ceil.w.d f10, f8
disasm: ceil.w.d f10, f8
pseudo: asm("ceil.w.d f10, f8")
mnemonic: ceil.w.d
mask: ffffffff
prefix: 0
id: 323
bytes: 8e422046
refptr: 0
size: 4
sign: false
type: null
cycles: 0
opex:
operands:
- type: "reg"
value: "f10"
- type: "reg"
value: "f8"
family: fpu
===============
address: 0x0
opcode: mulr.ps f10, f18, f7
disasm: mulr.ps f10, f18, f7
pseudo: asm("mulr.ps f10, f18, f7")
mnemonic: mulr.ps
mask: ffffffff
prefix: 0
id: 1003
bytes: 9a92c746
refptr: 0
size: 4
sign: false
type: null
cycles: 0
opex:
operands:
- type: "reg"
value: "f10"
- type: "reg"
value: "f18"
- type: "reg"
value: "f7"
family: fpu
===============
address: 0x0
opcode: mulsaq_s.w.ph ac3, s2, a3
disasm: mulsaq_s.w.ph ac3, s2, a3
pseudo: asm("mulsaq_s.w.ph ac3, s2, a3")
mnemonic: mulsaq_s.w.ph
mask: ffffffff
prefix: 0
id: 1006
bytes: b019477e
refptr: 0
size: 4
sign: false
type: mul
cycles: 0
opex:
operands:
- type: "reg"
value: "ac3"
- type: "reg"
value: "s2"
- type: "reg"
value: "a3"
family: mmx
===============
address: 0x0
opcode: mulsa.w.ph ac3, s2, a3
disasm: mulsa.w.ph ac3, s2, a3
pseudo: asm("mulsa.w.ph ac3, s2, a3")
mnemonic: mulsa.w.ph
mask: ffffffff
prefix: 0
id: 1007
bytes: b018477e
refptr: 0
size: 4
sign: false
type: mul
cycles: 0
opex:
operands:
- type: "reg"
value: "ac3"
- type: "reg"
value: "s2"
- type: "reg"
value: "a3"
family: mmx
===============
address: 0x0
opcode: mulv.b w4, w10, w7
disasm: mulv.b w4, w10, w7
pseudo: asm("mulv.b w4, w10, w7")
mnemonic: mulv.b
mask: ffffffff
prefix: 0
id: 1011
bytes: 12510778
refptr: 0
size: 4
sign: false
type: mul
cycles: 0
opex:
operands:
- type: "reg"
value: "w4"
- type: "reg"
value: "w10"
- type: "reg"
value: "w7"
family: mmx
===============
address: 0x0
opcode: tlbgwi
disasm: tlbgwi
pseudo: asm("tlbgwi")
mnemonic: tlbgwi
mask: ffffffff
prefix: 0
id: 1321
bytes: 0a000042
refptr: 0
size: 4
sign: false
type: null
cycles: 0
opex:
operands: []
family: virt
===============
address: 0x0
opcode: lbe a0, 5(t2)
disasm: lbe a0, 5(t2)
pseudo: asm("lbe a0, 5(t2)")
mnemonic: lbe
mask: ffffffff
prefix: 0
id: 797
bytes: ac02447d
refptr: 0
size: 4
sign: false
type: null
cycles: 0
rzil: (set a0 (cast 32 (msb (loadw 0 8 (+ (var t2) (bv 32 0x5)))) (loadw 0 8 (+ (var t2) (bv 32 0x5)))))
opex:
operands:
- type: "reg"
value: "a0"
- type: "mem"
base: "t2"
disp: 5
family: virt
===============
address: 0x0
opcode: yield a0, t2
disasm: yield a0, t2
pseudo: asm("yield a0, t2")
mnemonic: yield
mask: ffffffff
prefix: 0
id: 1359
bytes: 0920407d
refptr: 0
size: 4
sign: false
type: null
cycles: 0
opex:
operands:
- type: "reg"
value: "a0"
- type: "reg"
value: "t2"
family: thread
===============
address: 0x0
opcode: crc32b a0, t2, a0
disasm: crc32b a0, t2, a0
pseudo: asm("crc32b a0, t2, a0")
mnemonic: crc32b
mask: ffffffff
prefix: 0
id: 425
bytes: 0f00447d
refptr: 0
size: 4
sign: false
type: null
cycles: 0
opex:
operands:
- type: "reg"
value: "a0"
- type: "reg"
value: "t2"
- type: "reg"
value: "a0"
family: crpt
EOF
RUN
NAME=pdf main mips be
FILE=bins/elf/analysis/crackmips
CMDS=<<EOF
aaa
agf @ 0x00400820
EOF
EXPECT=<<EOF
.-----------------------------------------.
| 0x400820 |
| ; [13] -r-x section size 272 named .plt |
| ; XREFS(26) |
| ;-- section..plt: |
| ;-- .plt: |
| sym._PROCEDURE_LINKAGE_TABLE(); |
| ; 'A' |
| lui gp, 0x41 |
| ; [0x422884:4]=-1 |
| lw t9, 0x5424(gp) |
| ;-- waitpid: |
| addiu gp, gp, 0x5424 |
| subu t8, t8, gp |
| move t7, ra |
| srl t8, t8, 2 |
| ;-- SHA256_Update: |
| jalr t9 |
| addiu t8, t8, -2 |
`-----------------------------------------'
EOF
RUN
NAME=mips and nanomips tests for capstone6+
FILE==
ARGS=-a mips
CMDS=<<EOF
e cfg.bigendian=true
echo ---
e asm.cpu=mips32
wx 03e00008 # jr ra
pi 1
ao~type
echo ---
e asm.cpu=mips64
wx 03e00008 # jr ra
pi 1
ao~type
echo ---
e asm.cpu=mips32
wx 27bdff80 # addiu sp, sp, -0x80
pi 1
ao~type
ao~stackop
ao~stackptr
echo ---
e asm.cpu=mips64
wx 27bdff80 # addiu sp, sp, -0x80
pi 1
ao~type
ao~stackop
ao~stackptr
echo ---
e asm.cpu=mips32
wx 8f848000 # lw a0, -0x8000(gp)
pi 1
ao~type
ao~ptr
echo ---
e asm.cpu=mips64
wx df848000 # ld a0, -0x8000(gp)
pi 1
ao~type
ao~ptr
echo ---
e asm.cpu=nanomips
e cfg.bigendian=false
wx e0db # jrc ra
pi 1
ao~type
echo ---
wx 40413200 # lw a6, 0x30(gp)
pi 1
ao~esil
echo ---
wx 3d2050ea # and sp, sp, at
pi 1
ao~type
ao~esil
EOF
EXPECT=<<EOF
---
jr ra
type: ret
- type: "reg"
---
jr ra
type: ret
- type: "reg"
---
addiu sp, sp, -0x80
type: add
- type: "reg"
- type: "reg"
- type: "imm"
stackop: inc
stackptr: 128
---
addiu sp, sp, -0x80
type: add
- type: "reg"
- type: "reg"
- type: "imm"
stackop: inc
stackptr: 128
---
lw a0, -0x8000(gp)
type: load
- type: "reg"
- type: "mem"
ptr: 0xffffffffffff8000
refptr: 4
---
ld a0, -0x8000(gp)
type: load
- type: "reg"
- type: "mem"
ptr: 0xffffffffffff8000
refptr: 8
---
jrc ra
type: ret
- type: "reg"
---
lw a6, 0x30(gp)
esil: 0x30,gp,+,[4],a6,=
---
and sp, sp, at
type: and
- type: "reg"
- type: "reg"
- type: "reg"
esil: at,sp,&=
EOF
RUN
NAME=data xrefs outside functions marked as data
FILE=bins/elf/analysis/mipsbe-ip
CMDS=<<EOF
aaa
s 0x4350f8 # this address is found in `pdf @ sym.rtnl_rttable_n2a`
pd 1
EOF
EXPECT=<<EOF
; XREFS(69)
;-- data.004350f8:
0x004350f8 hex length=256 delta=40
0x004350f8 0043 0000 0043 5420 0043 396c 0042 0000 .C...CT .C9l.B..
0x00435108 0040 0000 0000 0000 0000 0000 0000 0000 .@..............
0x00435118 0000 0000 0041 ec80 0041 ec70 0041 1608 .....A...A.p.A..
0x00435128 0040 da54 0041 88d4 0041 ec60 0043 5430 .@.T.A...A.`.CT0
0x00435138 0041 c174 0041 d118 0041 ec50 0000 0000 .A.t.A...A.P....
0x00435148 0000 0000 0000 0000 0041 ec40 0041 9908 .........A.@.A..
0x00435158 0041 ec30 0041 b97c 0041 12c4 0041 b1e0 .A.0.A.|.A...A..
0x00435168 0040 d844 0041 ec20 0041 ab98 0041 ec10 .@.D.A. .A...A..
0x00435178 0041 bec4 0041 d4e4 0041 a588 0041 ec00 .A...A...A...A..
0x00435188 0041 9c50 0041 ebf0 0041 ab50 0041 ebe0 .A.P.A...A.P.A..
0x00435198 0041 ebd0 0043 5464 0041 ebc0 0041 ebb0 .A...CTd.A...A..
0x004351a8 0041 8830 0041 b2b4 0041 eba0 0041 a5a8 .A.0.A...A...A..
0x004351b8 0041 b054 0041 eb90 0041 b760 0041 dc20 .A.T.A...A.`.A.
0x004351c8 0041 eb80 0041 de40 .A...A.@
.dword 0x00430000
EOF
RUN
NAME=ELF: mips crash + args
FILE=bins/elf/ld-uClibc-0.9.33.2.so
CMDS=<<EOF
ii
iij
echo ---
# verify that the prelude is found when handling b 0x28dc
s sym._dl_malloc
af
pdf
echo ---
# the actual alloc implementation is at 0x000028dc
s 0x000028dc
pdf
EOF
EXPECT=<<EOF
nth vaddr bind type lib name
-----------------------------
[]
---
/ sym._dl_malloc(int32_t arg1);
| : ; arg int32_t arg1 @ a0
| : ; var int32_t var_4h @ stack - 0x4
| : 0x00002a1c lui gp, 2
| : 0x00002a20 addiu gp, gp, -sym._dl_parse_relocation_information
| : 0x00002a24 addu gp, gp, t9
| : 0x00002a28 lw v0, -obj._dl_malloc_function(gp) ; [0x17074:4]=0x17184 obj._dl_malloc_function
| : 0x00002a2c addiu sp, sp, -8
| : 0x00002a30 lw t9, 0(v0)
| : 0x00002a34 sw fp, (var_4h)
| ,==< 0x00002a38 beqz t9, 0x2a50
| |: 0x00002a3c move fp, sp
| |: 0x00002a40 move sp, fp
| |: 0x00002a44 lw fp, (var_4h)
| |: 0x00002a48 jr t9
..
| `--> 0x00002a50 move sp, fp
| : 0x00002a54 lw t9, -0x7fe4(gp) ; [0x1701c:4]=0
| : 0x00002a58 lw fp, (var_4h)
| : 0x00002a5c addiu t9, t9, fcn.000028dc
| `=< 0x00002a60 b fcn.000028dc
\ 0x00002a64 addiu sp, sp, 8
---
; CALL XREF from sym._dl_malloc @ 0x2a60
/ fcn.000028dc(int32_t arg_10h);
| ; var int32_t var_50h @ stack - 0x50
| ; var int32_t var_4ch @ stack - 0x4c
| ; var int32_t var_18h @ stack - 0x18
| ; var int32_t var_14h @ stack - 0x14
| ; var int32_t var_10h @ stack - 0x10
| ; var int32_t var_ch @ stack - 0xc
| ; var int32_t var_8h @ stack - 0x8
| ; var int32_t var_4h @ stack - 0x4
| ; arg int32_t arg_10h @ stack + 0x10
| 0x000028dc lui gp, 2
| 0x000028e0 addiu gp, gp, -0x38dc
| 0x000028e4 addu gp, gp, t9
| 0x000028e8 addiu sp, sp, -0x30
| 0x000028ec lw v0, -obj._dl_pagesize(gp) ; [0x1702c:4]=0x1718c obj._dl_pagesize
| 0x000028f0 sw s3, (var_ch)
| 0x000028f4 sw s2, (var_10h)
| 0x000028f8 lw s3, -0x7fd8(gp) ; [0x17028:4]=0x10000
| 0x000028fc lw s2, -0x7fd8(gp) ; [0x17028:4]=0x10000
| 0x00002900 sw s1, (var_14h)
| 0x00002904 lw v1, 0x71b8(s3)
| 0x00002908 move s1, a0 ; arg1
| 0x0000290c lw a0, 0x71b4(s2)
| 0x00002910 lw v0, 0(v0)
| 0x00002914 subu v1, a0, v1 ; arg1
| 0x00002918 addu v1, v1, s1
| 0x0000291c sw fp, (var_8h)
| 0x00002920 sltu v1, v0, v1
| 0x00002924 move fp, sp
| 0x00002928 sw ra, (var_4h)
| 0x0000292c sw s0, (var_18h)
| 0x00002930 sw gp, (var_4ch + 0x2c)
| ,=< 0x00002934 beqz v1, 0x29e0
| | 0x00002938 sltu v1, s1, v0
| ,==< 0x0000293c beqz v1, 0x2950
| || 0x00002940 move a1, s1
| || 0x00002944 addiu a1, v0, -1
| || 0x00002948 addu a1, a1, s1
| || 0x0000294c and a1, a1, v0
| `--> 0x00002950 lui a3, 0x400
| | 0x00002954 addiu sp, sp, -0x10
| | 0x00002958 move a0, zero
| | 0x0000295c addiu a2, zero, 3
| | 0x00002960 addiu a3, a3, 0x802
| | 0x00002964 move v0, zero
| | 0x00002968 addiu s0, zero, -1
| | 0x0000296c addiu sp, sp, -0x20
| | 0x00002970 sw s0, (var_50h)
| | 0x00002974 sw v0, (var_4ch)
| | 0x00002978 addiu v0, zero, 0xffa
| | 0x0000297c syscall
| | 0x00002980 addiu sp, sp, 0x20
| ,==< 0x00002984 beqz a3, 0x299c
| || 0x00002988 addiu v1, zero, -1
| || 0x0000298c lw v1, -obj._dl_errno(gp) ; [0x17024:4]=0x17190 obj._dl_errno
| || 0x00002990 sw v0, 0(v1)
| || 0x00002994 addiu v0, zero, -1
| || 0x00002998 addiu v1, zero, -1
| `--> 0x0000299c sw v0, 0x71b4(s2)
| ,==< 0x000029a0 bne v0, v1, 0x29e0
| || 0x000029a4 sw v0, 0x71b8(s3)
| || 0x000029a8 lw v0, -loc._fdata(gp) ; [0x17070:4]=0x17000 obj._dl_progname
| || 0x000029ac lw a1, -0x7fe4(gp) ; [0x1701c:4]=0
| || 0x000029b0 lw t9, -sym._dl_dprintf(gp) ; [0x1706c:4]=0x216c sym._dl_dprintf
| || 0x000029b4 lw a2, 0(v0)
| || 0x000029b8 addiu a0, zero, 2
| || 0x000029bc bal sym._dl_dprintf
| || 0x000029c0 addiu a1, a1, 0x692c
| || 0x000029c4 lw gp, (arg_10h)
| || 0x000029c8 addiu a0, zero, 0x14
| || 0x000029cc addiu v0, zero, 0xfa1
| || 0x000029d0 syscall
| ,===< 0x000029d4 beqz a3, 0x29e0
| ||| 0x000029d8 lw v1, -obj._dl_errno(gp) ; [0x17024:4]=0x17190 obj._dl_errno
| ||| 0x000029dc sw v0, 0(v1)
| ```-> 0x000029e0 lw v0, 0x71b4(s2)
| 0x000029e4 move sp, fp
| 0x000029e8 addu s1, v0, s1
| 0x000029ec addiu v1, zero, -4
| 0x000029f0 lw ra, (var_4h)
| 0x000029f4 addiu s1, s1, 3
| 0x000029f8 and s1, s1, v1
| 0x000029fc sw s1, 0x71b4(s2)
| 0x00002a00 lw fp, (var_8h)
| 0x00002a04 lw s3, (var_ch)
| 0x00002a08 lw s2, (var_10h)
| 0x00002a0c lw s1, (var_14h)
| 0x00002a10 lw s0, (var_18h)
| 0x00002a14 jr ra
\ 0x00002a18 addiu sp, sp, 0x30
EOF
RUN