描述
CTF做题时会遇见MIPS汇编的题目,而我们接触的是8086汇编,IDA是不能反汇编的需要自己了解一些MIPS方面的知识;
1. List 1
在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。
1. List 1.5
8086 CPU介绍
Intel 8086是一个由Intel于1978年所设计的16位微处理器芯片,是x86架构的鼻祖。
对于现今的机器来讲,8086CPU它已经属于古玩。但是,现在的任何一台PC机中的微处理器,只要是和 Intel兼容的系列,都可以8086的方式进行工作。可以将一个奔腾系列的微处理器当作一个快速的8086微处理器来用。整个奔腾PC的工作情况也是如此,可以当作一台高速的8086PC来用。
2. List 2
MIPS是(Microcomputer without interlocked pipeline stages)的缩写,含义是无互锁流水级微处理器。MIPS采用的是精简指令系统计算结构(RISC结构)(与之对应的:(复杂指令集)CISC结构)。RISC比CISC的设计更加简单,由于其授权费用低,被INTEL外的大多数厂商使用。同时在设计理念上MIPS强调软硬件协同提高计算机性能,并简化硬件设计。
MIPS 是最早的,最成功的RISC处理器之一,MIPS处理器广泛的应用于:数字电视、机顶盒、蓝光播放器、游戏机、网络设备。
3. List 3
MIPS寄存器
MIPS 包含32个通用寄存器 ($0-$31均为32 位), 硬件没有强制性的指定寄存器使用规则,但是在实际使用中,这些寄存器的用法都遵循一系列约定,寄存器约定用法引入了一系列的寄存器约定名。在使用寄存器的时候,要尽量用这些约定名或助记符,而不直接引用寄存器编号。
-
(1)两个特殊寄存器:
$0:不管你存放什么值,其返回值永远是零。 $ 31:永远存放着正常函数调用指令(jal)的返回地址。
(2)$at :
由编译器生成的复合指令使用
(3)$v0, $v1:
用来存放一个子程序 (函数) 的非浮点运算的结果或返回值。如果这两个寄存器不够存放需要返回的值,编译器将会通过内存来完成。
(4)$ a0-a3:
用来传递子函数调用时前4个非浮点参数。
(5)$ t0-t9:
依照约定,一个子函数可以不用保存并随便的使用这些寄存器。在作表达式计算时,这些寄存器是非常好的暂时变量。当调用一个子函数时,这些寄存器中的值有可能被子函数破坏掉。所以也是最不安全的。
(6)$ s0-s8:
依照约定,子函数必须保证当函数返回时这些寄存器的内容必须恢复到函数调用以前的值, 或者在子函数里不用这些寄存器或把它们保存 在堆栈上并在函数退出时恢复。 这种约定使得这些寄存器非常适合作为寄存器变量、
或存放一些在函数调用期间必须保存的原来的值。(类比:x86汇编中的函数序言和函数尾声)
(7)$ k0, k1:
被OS的异常或中断处理程序使用。被使用后将不会恢复原来的值。因此它们很少在别的地方被使用。
(8)$gp:
如果存在一个全局指针,它将指向运行时决定的静态数据(static data)区域的一个位置。这意味着,利用gp作基指针,在gp指针32K左右的数 据存取,系统只需要一条指令就可完成
(9)$ sp:
堆栈指针的上下需要显 式的通过指令来实现。因此 MIPS通常只在子函数进入和 退出的时刻才调整堆栈的指针。 这通过被调用的子函数来实现。SP通常被调整到这个被调用
的子函数需要的堆栈的最低的地方,从而编译器可以通过相对sp的偏移量来存取堆栈上的堆栈变量。
(10)$ fp(另外的约定名是s8):
fp作为框架指针可以被函数用来记录堆栈的情况,在一 个过程中变量相对于函数指针的偏移量是不变的。(相对地址)一些编程语言显示的支持这一点。汇编编程员经常会利用fp的这个用法。C语言的库函数
alloca()就是利用了fp来动态调整堆栈的。
(11)$ ra:
当调用任何一个子函数时,返回地址存放在ra寄存器中,因此通常 一个子程序的最后一个 指令是: jr ra.子函数如果还要调用其他的子函数,必须保存ra的值,通常通过堆栈。
(12)其他方面:
MIPS里没有状态码。CPU状态寄存器或内 部都不包含任何用户程序计算的结果状态信息。hi 和 lo 是与乘法运算器相关的两个寄存器,是用来存放结果的地方。 它们并不是通用寄存器,除了用在乘除法之 外,也不能有做其他用途。 MIPS里定义了一些指令可以往hi和lo里存入任何值。浮点运算协处理器 (浮点加速器,FPA),如果存在的话,有32个浮点寄存器。按汇编语言的简单约定讲, 是从$ f0到$f31
Began:
ADDIU(DADDIU) : 把一个寄存器的内容加上一个无符号的立即数(赋值) DADDIU R1,R2,#3
XORI 一个寄存器中的内容与一个立即数异或 (异或运算) XORI R1,R2,#3
CTF做了一到MIPS汇编的题目是这样的:看懂之后就可以编写python解题脚本了;
str1 = 'cbtcqLUBChERV[[Nh@_X^D]X_YPV[CJ'flag = ''for i in str1:flag += chr(ord(i)^0x37)print(flag)
除了以上两个指令这道题目中还出现了:
1. LW 从存储器中读取一个字的数据到寄存器中 LW R1, 0(R2)
2. LB 从存储器中读取一个字节的数据到寄存器中 LB R1, 0(R2)
3. DSLL 双字逻辑左移 DSLL R1,R2,#2
4. DSRA 双字算术右移 DSRA R1,R2,#2
5. BEQ 条件转移指令,当两个寄存器内容相等时转移发生 BEQ R1,R2