异架构
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。
-
纯
ROP
链,通过调用system
函数来getshell
。 -
通过构造
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:返回地址
汇编:
汇编指令
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
比较指令
逻辑运算指令
转移指令
b:无条件跳转