关于系统调用如何传递参数问题,即系统调用约定(syscall,int 80h,svc)


1.syscall


syscall是x64的系统调用。其调用号通过rax进行传递。查看具体的调用号,linux环境下在unistd.h中定义。如果是64位,则可以查看/usr/include/asm/unistd_64.h,如果是32位,则查看/usr/include/unistd_32.h。

参数传递:处于用户态时,参数传递顺序为:rdi,rsi,rdx,rcx,r8,r9,处于内核态时,参数传递顺序:rdi,rsi,rdx,r10,r8,r9(补充:这是看别人文章是这么写的,但是我在实际操作中发现,我运行用户态汇编代码,通过rcx传递参数时函数返回错误,用ida查看,发现用户态的值传递其实是:rdi,rsi,rdx,r10,r8,r9(和前面提到的内核态的一致),内核的值传递我没有进行测试,欢迎各位大佬评论区补充)


2.int 80h


int 80h 是32位x86的系统调用方式。同样通过ax传递调用号,参数传递顺序是:ebx,ecx,edx,esi,edi

*** note ***
intel体系的系统调用限制最多六个参数,没有任何一个参数是通过栈传递的。系统调用的返回结果存放在ax寄存器中,且只有整型和内存型可以传递给内核


svc


***svc***是arm体系的系统调用方式,名字叫superxxxx call(不会拼了。。。)。arm64其调用号通过寄存器***x8***进行传递,返回值通过***x0***寄存器返回

调用时寄存器传参顺序:x0-x6

32位的arm通过r7传递系统调用号,寄存器调用顺序应该和arm64一致(这个我没有arm32的程序,暂时位验证)
svc 后面会跟一个 #number,这个#number无实际意义,仅在svc调用返回错误时可能用于排查错误地点原因。即,如果要编写shellcode这种,#可以接任意数字,但建议跟0x+一个四位不带0的数字,这样可以避免shellcode中出现0

更新or修改?
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
写shellcode或者汇编时,在函数中建议使用非易失性寄存器
在这里插入图片描述
关于linux系统调用相关的vdso有时间再写写

update data:2021/1/25

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值