mirror of
https://github.com/rizinorg/rizin
synced 2026-08-22 20:26:16 -04:00
* Don't print meta items which are not at the current seek. The old code tried (unsuccessfully) to print _any_ meta item _covering_ the seek (ds->at). There seems to be several bugs getting triggered with that. One of them giving the behavior of https://github.com/rizinorg/rizin/issues/6556. If the current seek is in a _data_ region, the disassembler logic doesn't care. It just assumes that RzAsmOp.size is equivalent to the size of the objects there. Even though there are only Meta items. But since some meta items are like 4K bytes, RzAsmOp.size gets trimmed down. Anyways, that completely messes up the size calculation (as can be seen in the issue), and the navigation. I couldn't figure out where stuff broke. But the library closes and I have to leave, so I push that. That "fix" makes it at least behave somewhat consistently. * Fix leaks * Fix and add interactive test
1895 lines
58 KiB
Text
1895 lines
58 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 ; sym.do_mips_start
|
|
| ; 0x8051c
|
|
| 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 ; sym..rodata
|
|
| ; 0x80640 ; "Hello World" ; const char *s ; str.Hello_World
|
|
| 0x000805c8 lw v0, -sym._MIPS_STUBS(gp) ; [data.00091048:4]=0x80600 sym.imp.puts
|
|
| 0x000805cc move t9, v0
|
|
| 0x000805d0 jalr t9 ; sym.imp.puts
|
|
| ; 0x80600 ; int puts(const char *s)
|
|
| 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 ; 0x400221
|
|
| 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 ; sym.imp.strrchr
|
|
| ; 0x41e910 ; char *strrchr(const char *s, int c)
|
|
| 0x004025a8 move a0, s6
|
|
| 0x004025ac slti v1, s1, 2
|
|
| 0x004025b0 addiu a0, v0, 1 ; sym._DYNAMIC_LINKING
|
|
| 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 ; sym.imp.strcmp
|
|
| :| ; 0x41eb40 ; int strcmp(const char *s1, const char *s2)
|
|
| :| 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 ; sym.rtnl_open
|
|
| :||||: ; 0x41a99c ; "<\U0000001c"
|
|
| :||||: 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 ; sym.imp.strlen
|
|
| :||||:| ; 0x41ec10 ; size_t strlen(const char *s)
|
|
| :||||:| 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 ; sym.rtnl_close
|
|
| | || ; 0x41a9b8 ; "<\U0000001c"
|
|
| | || 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 ; sym.matches
|
|
| ::: | ; 0x41b2b4 ; "<\U0000001c"
|
|
| ::: | 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 ; sym.matches
|
|
| ::: | ; 0x41b2b4 ; "<\U0000001c"
|
|
| ::: | 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 ; sym.imp.exit
|
|
| :::| ; 0x41ebb0 ; void exit(int status)
|
|
..
|
|
| :::`--> 0x00402ab0 lw t9, -sym.matches(gp) ; [0x4351ac:4]=0x41b2b4 sym.matches
|
|
| ::: 0x00402ab4 lui a1, 0x42
|
|
| ::: 0x00402ab8 move a0, a2
|
|
| ::: 0x00402abc sw a2, (var_2ch)
|
|
| ::: 0x00402ac0 jalr t9 ; sym.matches
|
|
| ::: ; 0x41b2b4 ; "<\U0000001c"
|
|
| ::: 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
|
|
| ::: 0x00402af4 sw a2, (var_2ch)
|
|
| ::: 0x00402af8 jalr t9 ; sym.matches
|
|
| ::: ; 0x41b2b4 ; "<\U0000001c"
|
|
| ::: 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
|
|
| ::: | 0x00402b1c sw a2, (var_2ch)
|
|
| ::: | 0x00402b20 jalr t9 ; sym.matches
|
|
| ::: | ; 0x41b2b4 ; "<\U0000001c"
|
|
| ::: | 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 ; sym.imp.printf
|
|
| :::| ; 0x41e7b0 ; int printf(const char *format)
|
|
| :::| 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 ; sym.imp.exit
|
|
| :::| ; 0x41ebb0 ; void exit(int status)
|
|
| :::| 0x00402b68 move a0, zero
|
|
| :::`--> 0x00402b6c lw t9, -sym.matches(gp) ; [0x4351ac:4]=0x41b2b4 sym.matches
|
|
| ::: 0x00402b70 lui a1, 0x42
|
|
| ::: 0x00402b74 move a0, a2
|
|
| ::: 0x00402b78 sw a2, (var_2ch)
|
|
| ::: 0x00402b7c jalr t9 ; sym.matches
|
|
| ::: ; 0x41b2b4 ; "<\U0000001c"
|
|
| ::: 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
|
|
| :: 0x00402bbc sw a2, (var_2ch)
|
|
| :: 0x00402bc0 jalr t9 ; sym.matches
|
|
| :: ; 0x41b2b4 ; "<\U0000001c"
|
|
| :: 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 ; sym.get_unsigned
|
|
| : | ; 0x41bec4 ; "<\U0000001c"
|
|
| : | 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
|
|
| :| 0x00402c20 sw a2, (var_2ch)
|
|
| :| 0x00402c24 jalr t9 ; sym.matches
|
|
| :| ; 0x41b2b4 ; "<\U0000001c"
|
|
| :| 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 ; sym.imp.fprintf
|
|
| |: ; 0x41e940 ; int fprintf(FILE *stream, const char *format, void *va_args)
|
|
| |: 0x00402c54 nop
|
|
| |: 0x00402c58 lw gp, (var_40h)
|
|
| |: 0x00402c5c lw t9, -sym.imp.exit(gp) ; [0x4351a4:4]=0x41ebb0 sym.imp.exit
|
|
| |: 0x00402c60 jalr t9 ; sym.imp.exit
|
|
| |: ; 0x41ebb0 ; void exit(int status)
|
|
| |: 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 .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 ; "%s: mmap of a spare page failed!\n"
|
|
| || 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
|
|
|
|
NAME=mips PIC GOT page + offset string xref (#5203)
|
|
FILE=bins/elf/analysis/mips-hello
|
|
CMDS=<<EOF
|
|
af @ main
|
|
axt @ 0x80640
|
|
EOF
|
|
EXPECT=<<EOF
|
|
main 0x805c4 [DATA] addiu a0, v0, str.Hello_World
|
|
EOF
|
|
RUN
|
|
|
|
NAME=mips PIC GOT page + offset string xref BE (#5203)
|
|
FILE=bins/elf/analysis/mipsbe-ip
|
|
CMDS=<<EOF
|
|
af @ sym.ll_init_map
|
|
axt @ 0x41fc6c
|
|
EOF
|
|
EXPECT=<<EOF
|
|
sym.ll_init_map 0x418954 [DATA] addiu a0, a0, -str.Cannot_send_dump_request
|
|
EOF
|
|
RUN
|