栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么x86-64 Linux系统调用会修改RCX,值是什么意思?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么x86-64 Linux系统调用会修改RCX,值是什么意思?

系统调用返回值

rax
始终位于中。请参阅i386和x86-64上的UNIX&Linux系统调用的调用约定是什么]。

注意,

sys_brk
其接口与
brk
/
sbrk
POSIX函数略有不同;请参见Linux
brk(2)
手册页的C库/内核差异部分。具体来说, Linux
sys_brk
设置
程序中断
;arg和返回值都是指针。请参阅Assemblyx86brk()调用use。该答案需要投票,因为这是该问题上唯一的好答案。


您问题的另一个有趣的部分是:

在这种情况下,我不太了解rcx寄存器中的值

您正在了解

syscall
/
sysret
指令的设计原理,以允许内核恢复用户空间执行,但仍然很快。

syscall
不进行任何加载或存储,仅修改寄存器。与其使用特殊的寄存器来保存返回地址,不如使用常规的整数寄存器。

这不是一个巧合,

RCX=RIP
R11=RFLAGS
内核返回到用户空间的代码之后
。唯一的解决办法是,如果系统调用在内核内部修改了该进程的保存或值,则该调用
不起作用
。(是gdb使用的系统调用)。在那种情况下,Linux将使用而不是返回用户空间,因为较慢的一般情况可以做到这一点。(请参阅如果以64位代码使用32位int0x80LinuxABI会发生什么情况?了解Linux系统调用入口点的一些演练。大多数入口点来自32位进程,而不是来自64位进程。一点点的过程。)
ptrace``rcx``r11``ptrace``iret``sysret``iret
)
syscall


与其将返回地址压入内核堆栈(就像这样

int 0x80
做),
syscall
不如:

  • 设置RCX = RIP,R11 = RFLAGS(因此内核在执行之前甚至无法看到这些reg的原始值
    syscall
    )。
  • 掩模
    RFLAGS
    从一个配置寄存器中(预先配置的掩模
    IA32_FMASK
    MSR)。这使内核可以禁用中断(IF),直到完成
    swapgs
    并设置
    rsp
    为指向内核堆栈为止。即使
    cli
    作为入口点的第一条指令,也存在一个漏洞窗口。即使
    cld
    掩盖了
    DF
    so
    rep movs
    / up,您也可以免费获得,
    stos
    即使使用了user space
    std

有趣的事实:AMD的第一个提议

syscall
/
swapgs
设计并未掩盖RFLAGS,但在内核开发人员在amd64邮件列表上](大约在2000年,比第一个芯片问世几年之前)反馈后,他们对其进行了更改。

  • 跳转到配置的

    syscall
    入口点(设置CS:RIP =
    IA32_LSTAR
    )。
    CS
    我认为,旧值并没有保存在任何地方。

  • 它没有做任何其他事情,内核必须使用它

    swapgs
    来访问保存了内核堆栈指针的信息块,因为它
    rsp
    仍然具有来自用户空间的值。

因此,的设计

syscall
需要系统调用ABI来注册,这就是为什么值就是它们的原因。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/399030.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号