异架构

mips架构

java -jar Mars4_5.jar:打开mars

mips特点

流水线效应:MIPS采用了高度的流水线,其中最重要的就是分支延迟效应。在分支跳转语句后面那条语句叫分支延迟槽。实际上,在程序执行到分支语句时,当他刚把要跳转的地址填充好(填充到代码计数器里),还没有完成本条指令时,分支语句后面的那个指令就已经执行了,其原因就是流水线效应——几条指令同时执行,只是处于不同的阶段,mips不像其它架构那样存在流水线阻塞。所以分支跳转语句的下一条指令通常都是空指令nop或一些其他有用的语句。

缓存刷新机制:MIPS CPUs有两个独立的cache:指令cache和数据cache。 指令和数据分别在两个不同的缓存中。当缓存满了,会触发flush, 将数据写回到主内存。攻击者的攻击payload通常会被应用当做数据来处理,存储在数据缓存中。当payload触发漏洞, 劫持程序执行流程的时候,会去执行内存中的shellcode.如果数据缓存没有触发flush的话,shellcode依然存储在缓存中,而没有写入主内存。这会导致程序执行了本该存储shellcode的地址处随机的代码,导致不可预知的后果。(通常执行sleep(1)刷新)

mips架构的题目有一个特性,没有办法开始NX保护,那么我们除了常规构造ROP链子,还可以通过写shellcode。

  1. ROP链,通过调用system函数来getshell

  2. 通过构造ROP链,跳转至读入到栈/bss段等处的shellcode执行。

函数调用规则

前四个参数

  • 前四个参数通过寄存器 $a0$a1$a2$a3 传递。

  • 如果函数的参数少于四个,多余的寄存器不会被使用。

超过四个参数

  • 如果函数的参数超过四个,额外的参数会通过栈传递。

  • 调用者需要在栈上为这些额外的参数分配空间,并将参数值存储到栈上。

寄存器:

前4个参数:a0,a1,a2,a4

返回地址:$ra

rip:pc

$zero:总是0,方便进行各种运算

rax: v0 system的系统调用是0xfab

rsp:$sp

rbp: $fp

$at:用于标记当前的汇编指令。

v0−v1:用于存储函数的返回值。

a0−a3:用于函数调用时的参数。

t0−t9:通用寄存器。

s0−s7:用于保存局部变量的寄存器。

$t8:用于保存程序计数器(PC)

汇编指令集:

跳转类

jr +寄存器:跳转到寄存器(Jump Register)

jal displayMessage ;跳转指令调用并返回,1、跳转displayMessage地址,同时把下一条指令的地址写入到 $ra寄存器

jalr+寄存器:jalr $t9 # 等价于 jalr $ra, $t9,跳转到寄存器中存的地址,同时把当前 PC + 8(32位是4,即延迟槽后)保存到 $ra注意:MIPS有延迟槽,执行完 jalr 后,下一个指令(1条)仍会执行,然后才跳转。

li $t9, 0x00401234
jalr $t9
nop            # 延迟槽:这里的指令会在跳转前执行

执行完后:
跳转到 0x00401234
$ra = 当前地址 + 8

加载类

li:类lea但是是加载立即数的

la: 类似lea载入地址

sw: 将寄存器(s0)值放入$sp + 4 * 倍 数位置 sw $s0,0($sp)这里sp前的0表示0倍

lw:从栈上取回值到寄存器 lw $s0,0($sp),从离sp指针0偏移的地址值给s0

计算类

addi $s0,$zero,5:将加法结果加到第一个寄存器

add $a0,$zero,$s0:将加法结果赋值给第一个寄存器

addiu rd, rs, immediate: 将寄存器 rs 中的值与一个立即数(immediate)相加,并将结果存入目标寄存器 rd 中。

arm架构

ARM运行模式
运行模式 功能
用户模式(USR) ARM处理器正常程序执行状态
快速中断模式(FIQ) 高速数据传输或通道处理
外部中断模式(IRQ) 通用的中断处理
管理模式(SVC) 操作系统使用的保护模式
数据访问终止模式(ABT) 当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护
系统模式(SYS) 运行具有特权的操作系统任务
未定义指令终止模式(UND) 未定义的指令执行是进入该模式

寄存器:

在这里插入图片描述

前三个参数:R0,R1,R2

LR:返回地址

汇编:

image-20240521194411963

汇编指令

cmp=[]
with open(r“C:\Users\86198\Desktop\tt\attachment-7\BEIXUAN-19.exe","rb")as f:
tmp=f.read()
if tmp[0:3]==b'\x4d\x5a\x50':
start=0x0b3614+0xcc8
else:
start=0xcc8
cmp= [ tmp[start+i10] for i in range(24)]
inp1=cmp[:12]
v7=cmp[12:]
v4=[2,0,3,1,6,4,7,5,10,8,11,9]
inp2=[0]
12
for i in range(len(inp2)):
inp2[i]=v7[v4[i]]

key='ISCC'
for i in range(len(inp1)):
inp1[i]^=ord(key[i%len(key)])

for i in range(len(inp1)):
print(chr(inp1[i])+chr(inp2[i]),end='')Which_is_the_flag

数据处理指令
数据传送指令
mov
mvn
算术逻辑运算指令
add
anc
比较指令
cmp
tst
跳转指令
b
BL
程序状态寄存器(PSR)处理指令
msr
mrs
存储器访问指令
ldr
str
协处理器指令
cdp
LDC
异常产生指令
SWI
BKPT

数据处理指令

mov a b:把b给a

算数运算指令

add a ,b,c: a=b+c

比较指令

image-20240521201216887

逻辑运算指令

image-20240521201410840

image-20240521201515016

image-20240521201529793

转移指令

b:无条件跳转

image-20240521201725684

image-20240521201852288

image-20240521201906461

状态寄存器访问指令

image-20240521202317109

加载存储指令

image-20240521202504414

image-20240521202516579

image-20240521202542337

image-20240521202707608

image-20240521202720939

异常产生指令

image-20240521202949514

伪代码

image-20240521203008256

image-20240521203121055

image-20240521203201857

image-20240521203215715

image-20240521203239029

posted @ 2025-05-10 14:56  Ma&0xFly  阅读(27)  评论(0)    收藏  举报