首页 > 其他分享 >syscall

syscall

时间:2024-11-13 15:30:32浏览次数:1  
标签:intptr gpr1 syscall a1 a0 asm define

syscall

分析_syscall_的相关参数:

intptr_t _syscall_(intptr_t type, intptr_t a0, intptr_t a1, intptr_t a2) {
  register intptr_t _gpr1 asm (GPR1) = type;
  register intptr_t _gpr2 asm (GPR2) = a0;
  register intptr_t _gpr3 asm (GPR3) = a1;
  register intptr_t _gpr4 asm (GPR4) = a2;
  register intptr_t ret asm (GPRx);
  asm volatile (SYSCALL : "=r" (ret) : "r"(_gpr1), "r"(_gpr2), "r"(_gpr3), "r"(_gpr4));
  return ret;
}

其相关的宏定义为

// helper macros
#define _concat(x, y) x ## y
#define concat(x, y) _concat(x, y)
#define _args(n, list) concat(_arg, n) list
#define _arg0(a0, ...) a0
#define _arg1(a0, a1, ...) a1
#define _arg2(a0, a1, a2, ...) a2
#define _arg3(a0, a1, a2, a3, ...) a3
#define _arg4(a0, a1, a2, a3, a4, ...) a4
#define _arg5(a0, a1, a2, a3, a4, a5, ...) a5

// extract an argument from the macro array
#define SYSCALL  _args(0, ARGS_ARRAY)
#define GPR1 _args(1, ARGS_ARRAY)
#define GPR2 _args(2, ARGS_ARRAY)
#define GPR3 _args(3, ARGS_ARRAY)
#define GPR4 _args(4, ARGS_ARRAY)
#define GPRx _args(5, ARGS_ARRAY)
# define ARGS_ARRAY ("ecall", "a7", "a0", "a1", "a2", "a0")

首先从GPR1开始拆解宏定义。

GPR1 -> _args(1, ARGS_ARRAY)
_args(1, ARGS_ARRAY)  -> _arg1 ARGS_ARRAY
_arg1(ARGS_ARRAY) -> a7

其他拆解同理,拆解完毕后分析内联汇编语法。

intptr_t _syscall_(intptr_t type, intptr_t a0, intptr_t a1, intptr_t a2) {
  register intptr_t _gpr1 asm ("a7") = type;
  register intptr_t _gpr2 asm ("a0") = a0;
  register intptr_t _gpr3 asm ("a1") = a1;
  register intptr_t _gpr4 asm ("a2") = a2;
  register intptr_t ret asm ("a0");
  asm volatile ("ecall" : "=r" (ret) : "r"(_gpr1), "r"(_gpr2), "r"(_gpr3), "r"(_gpr4));
  return ret;
}

例如

register intptr_t _gpr1 asm ("a7") = type;
  1. register:C 语言的一个关键字,表示该变量建议存储在 CPU 寄存器中,而不是内存中。
  2. _gpr1:这是声明的变量名
  3. asm (GPR1):将 C 变量_gpr1与汇编寄存器 a7 绑定起来。这样编译器会将该_gpr1的值加载到a7寄存器中.
  4. = type;:这部分是变量 _gpr1 的初始化,_gpr1 被初始化为 type 的值。

这行代码包含的关键意思就是将变量_gpr1与寄存器a7连接起来。

最后

asm volatile ("ecall" : "=r" (ret) : "r"(_gpr1), "r"(_gpr2), "r"(_gpr3), "r"(_gpr4));
  1. 输出操作数(: "=r" (ret)
    • =r 是一个输出操作数约束符,告诉编译器,输出操作数 ret(存储返回值的变量)需要被存储在一个通用寄存器中。
    • ret 是一个变量,它将存储 ecall 执行后的返回值(即通过 a0 寄存器返回的值)。在执行 ecall 后,a0 寄存器中存放的值将被复制到 ret
  2. 输入操作数(: "r"(_gpr1), "r"(_gpr2), "r"(_gpr3), "r"(_gpr4)
    • "r" 表示 a7a0a1a2(也就是 RISC-V 的通用寄存器)
    • _gpr1, _gpr2, _gpr3, _gpr4 是用来传递给 ecall 的四个输入参数,分别放在寄存器a7a0a1a2

具体来说,_gpr1 会被存储到 a7 寄存器,_gpr2 会被存储到 a0 寄存器,_gpr3 会被存储到 a1 寄存器,_gpr4 会被存储到 a2 寄存器。

此时ecall执行后,ret变量将包含a0寄存器的值。

标签:intptr,gpr1,syscall,a1,a0,asm,define
From: https://www.cnblogs.com/shangshankandashu/p/18544070

相关文章

  • [asm]: linux syscall number(32bits_64bits)
    [asm]:linuxsyscallnumber(32bits_64bits)    一、32bit_syscall_number(451个系统调用)1[root@rocky:tmp]#catlinux_syscall_no_32.txt2//date:2024-10-263//usingFor:4//--AssemblyLanguage(nasm,gas)5//--syscall......
  • 栈溢出入门03 ret2syscall ROP NX绕过
    本例题会使用ROP技术来绕过堆栈不可执行保护(NX保护),随着NX保护的开启,以往直接向栈或者堆上直接注入代码的方式难以继续发挥效果。攻击者们也提出来相应的方法来绕过保护,目前主要的是ROP(ReturnOrientedProgramming),其主要思想是在栈缓冲区溢出的基础上,利用程序中已有的小片段......
  • gdb catchsyscall的内核支持
    intro通常使用gdb调试器,希望知道某个系统调用的发生时机,直接在该系统调用打断点即可。这里有一个假设就是这里使用的glibc库的实现,但是go生成的可执行文件就是一个单独的、静态链接文件,在go生成文件中,gdb的时候并没有可以打断点监测系统调用的方法。我想在go中大概率有对特定系......
  • 栈溢出漏洞利用二,ret2syscall,构造rop链条实现攻击(pwn入门)
    原理原理就直接参考别的大佬写的文章讲下了 参考文章:https://blog.csdn.net/qq_33948522/article/details/93880812ret2syscall,即控制程序执行系统调用,获取shellret2syscall通常采用execve(重点函数,32位调用号为0x0b,64位调用号为0x3b)ROPReturnOrientedProgramming,其......
  • 中断卡在configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );
    今天在调试以太网驱动的时候遇到一个问题,当程序执行到这个/*addthenetworkinterface(IPv4/IPv6)withRTOS*/netif_add(&gnetif,&ipaddr,&netmask,&gw,NULL,&ethernetif_init,&tcpip_input);函数里面的netif_invoke_ext_callback(netif,LWIP_NSC_NETIF_ADDED,N......
  • ret2syscall
    ret2syscallROP原理:在栈缓冲区溢出的基础上,利用程序中已有的小片段(gadgets:以ret为结尾的指令序列)来改变某些寄存器或者变量的值,从而控制程序的执行流程核心:利用了指令集中的ret指令,改变了指令流的执行顺序核心指令:ROPgadget--binary文件名--only'pop|ret'(三个空格!!!)若......
  • MIT6.S081 Lab syscall
    这一个实验的主要内容就是给xv6添加两个系统调用:trace和sysinfo。Usinggdb(easy)这个部分我就不做了……M1的MacbookAir上的gdb太难安装了,所以暂时用不了gdb调试……Systemcalltracing(moderate)Inthisassignmentyouwilladdasystemcalltracingfe......
  • 免杀-syscall
    3x3syscall我们windowsapi的调用,通过层层调用最终还是会进入ntdll的底层函数的调用,再通过syscall快速调用进入0环实现的代码,下面我将记录一些syscall的底层基础知识,最后的代码实现是通过现成项目直接快速调用敏感api,这种现成syscall的项目很多,但是感觉都比较久了免杀效果不太好......
  • Syscall笔记
    本文首发:https://xz.aliyun.com/t/13687基础知识我们知道,系统核心态指的是R0,用户态指的是R3,系统代码在核心态下运行,用户代码在用户态下运行。系统中一共有四个权限级别,R1和R2运行设备驱动,R0到R3权限依次降低,R0和R3的权限分别为最高和最低。而我们的**syscall**是一个计算机......
  • npm ERR! code ENOENT npm ERR! syscall open npm ERR! path C:\Users\shuzi\Des
    打开一个新的项目,因为当前项目文件夹下没有npm,"dev":"npmrunstart:dev",所以所以没有展示对应的运行图,如下图: 打开一个新的前端项目,执行npminstall,报错如图:WindowsPowerShell版权所有(C)MicrosoftCorporation。保留所有权利。安装最新的PowerShell,了解新功能和改进......