linux修改栈指针x86,为什么x86-64 Linux系统调用会修改RCX,这个值意味着什么?

我正在尝试使用sys_brk syscall在linux中分配一些内存.这是我尝试过的:

BYTES_TO_ALLOCATE equ 0x08

section .text

global _start

_start:

mov rax, 12

mov rdi, BYTES_TO_ALLOCATE

syscall

mov rax, 60

syscall

根据linux调用约定,我希望返回值在rax寄存器中(指向已分配内存的指针).我在gdb中运行它,在进行sys_brk系统调用之后,我注意到以下寄存器内容

在系统调用之前

rax 0xc 12

rbx 0x0 0

rcx 0x0 0

rdx 0x0 0

rsi 0x0 0

rdi 0x8 8

在系统调用之后

rax 0x401000 4198400

rbx 0x0 0

rcx 0x40008c 4194444 ;

rdx 0x0 0

rsi 0x0 0

rdi 0x8 8

在这种情况下,我不太了解rcx寄存器中的值.哪一个用作指向我用sys_brk分配的8个字节的开头的指针?

解决方法:

请注意,sys_brk的界面与brk / sbrk POSIX函数略有不同;请参阅C library/kernel differences section of the Linux brk(2) man page.具体来说,Linux sys_brk设置程序中断; arg和返回值都是指针.见Assembly x86 brk() call use.这个答案需要upvotes,因为它是该问题上唯一的好处.

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

I do not quite understand the value in the rcx register in this case

您正在看到syscall/sysret指令如何设计为允许内核恢复用户空间执行但仍然很快的机制.

系统调用不执行任何加载或存储,它只修改寄存器.它不使用特殊寄存器来保存返回地址,而只使用常规整数寄存器.

在内核返回到用户空间代码之后,RCX = RIP和R11 = RFLAGS并不是巧合.这种情况的唯一方法是,如果ptrace系统调用在内核中修改了进程保存的rcx或r11值. (ptrace是gdb使用的系统调用).在这种情况下,Linux将使用iret而不是sysret返回用户空间,因为较慢的通用情况iret可以做到这一点. (有关Linux系统调用入口点的一些演练,请参阅What happens if you use the 32-bit int 0x80 Linux ABI in 64-bit code?.但是,大多数情况下,32位进程的入口点,而不是64位进程中的系统调用.)

而不是将返回地址推送到内核堆栈(如int 0x80),系统调用:

>设置RCX = RIP,R11 = RFLAGS(因此在执行系统调用之前,内核甚至无法查看这些寄存器的原始值).

>使用配置寄存器(IA32_FMASK MSR)中的预配置掩码屏蔽RFLAGS.这让内核禁用中断(IF),直到它完成swapgs并将rsp设置为指向内核堆栈.即使将cli作为入口点的第一条指令,也会有一个漏洞的窗口.你也可以通过屏蔽DF来免费获得cld,所以即使用户空间使用了std,rep movs / stos也会向上移动.

有趣的事实:AMD首次提出的系统调用/交换设计并未掩盖RFLAGS,而是掩盖了they changed it after feedback from kernel developers on the amd64 mailing list(在〜2000年,比第一个芯片早几年).

>跳转到配置的系统调用入口点(设置CS:RIP = IA32_LSTAR).我想,旧的CS值不会保存在任何地方.

>它没有做任何其他事情,内核必须使用swapgs来访问保存内核堆栈指针的信息块,因为rsp仍然有来自用户空间的值.

因此,系统调用的设计需要一个系统调用ABI,其中注册符号,这就是为什么这些值是它们的原因.

标签:linux,assembly,x86-64,system-calls

来源: https://codeday.me/bug/20190828/1749140.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wordpress phpmyadmin_西部数码使用指南:虚拟主机WordPress部署SSL注意事项

版权归西部数码所有,原文链接:https://www.west.cn/faq/list.asp?unid2068注意事项:1.如果您的主题/插件使用绝对地址调用了http请求可能会导致网站打开会乱码,或不能有绿锁标识,需要联系程序提供商将所有http请求修改…

android html转pdf工具,android – 使用iText库将html转换为pdf时未应用hr的内联CSS

我是.NET开发人员,因此代码在C#中.但是你应该能够轻松翻译以下内容.iText是一个PDF优先的库,[X] HTML解析非常复杂,因此在这方面并不完整.每当解析[X] HTML并且事情不按预期的方式进行特定标记时,您应遵循的基本步骤是:>验证XML Worker支持标记:Tags …

python 小说爬虫_从零开始写Python爬虫 --- 1.7 爬虫实践: 排行榜小说批量下载

从零开始写Python爬虫 --- 1.7 爬虫实践: 排行榜小说批量下载Ehco 5 个月前 本来只是准备做一个爬起点小说名字的爬虫,后来想了一下,为啥不顺便把小说的内容也爬下来呢?于是我就写了这个爬虫,他爬下了各类小说排行榜上…

java 某个字符在字符串中出现的所有位置_Java面试常考核心概念

这篇文章专注于Java基础知识,不涉及List、Map、多线程、锁相关的内容,需要的可以查看我的其他博客hofes blog​hhf443.github.ioJDK&JRE&JVMJDK(Java Development Kit)是针对 Java 开发员的产品,是整个 Java 的…

lan交换和无线教师手册_简单几步,无线路由器变交换机

当原来的路由器lan口不够用,可以加一个交换机扩展lan口数量,如果需要增加的lan口数量不超过3个可以考虑找台不用的无线路由器当交换机用。另外,随着交换机更新家中都有旧无线路由器闲置,完全可以再次利用。下面看一下,…

Linux fast open,Linux内核3.7 TCP Fast Open验证实例

Linux内核在3.6和3.7合入了TCP Fast Open特性,在3.7.3版本上验证了一下,I did it!以下是C语言实例():server端代码:#include /* See NOTES */#include#include#includeint main(){int portno 5060;socklen_t clilen;char buffer[…

vue 怎么全局到入常量_Vue 中如何定义全局的变量和常量(转)

17.6k 次阅读 读完需要 10 分钟7Vue 中如何定义全局的变量和常量我想要定义一个变量, 在项目的任何地方都可以访问到, 不需要每一次使用的时候, 都引入.尝试1:创建 global.js 并且在其中定义let a 10;在入口文件中引入 global.jsimport ./global.js在项目中使用:a// 报错发…

revit找不到附加模块程序集_TensorFlow基础知识——常用模块(一)

1本节简述对于开展深度学习开发的目标而言,我们需要掌握的除了必要的深度学习理论基础、必要的开发依赖库基础知识、基本的开发套路之外,我们还需要掌握它常见的外围小帮手都有哪些。这些小帮手就是深度学习依赖库中的其他并不是核心的模块,但…

android搭建opencv开发环境,Android Studio搭建opencv开发环境

文章不配图片,阅读需要有Android开发基础并熟悉Android Studio。一、搭建基于Java开发环境以下内容介绍如何搭建基于Java jni的opencv开发环境。1、准备工作从opencv官网下载Android平台开发sdk并解压,假设解压后文件夹名为opencv-4.3.0-android-sdk。(此…

99 网络编程_网络工程师技能图谱,看看你会多少技能

技术推动了时代变革,互联网则加速了这场变革。在蓬勃发展的互联网浪潮下,网络作为基础设施的关键纽带保障着网路流量的顺利流通,维持着赛博世界的繁荣。而在这繁荣之下,生存着这样一个群体——网络工程狮,为网络纽带保…

python 3.8.0安卓_Python for Mac v3.8.0 官方最新版

Python for Mac是一款全新推出的编程工具,所有 python.org macOS 安装程序都附带了 OpenSSL 的内置副本。此外,还有一个针对 macOS 10.9 的新增安装程序变体,其中包含 Tcl / Tk 8.6的内置版本,有需要的朋友快来下载试试吧!Python …

线程join_Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)

点击上方“Coder编程”,选择“置顶公众号”技术文章第一时间送达!并发编程.png每天进步一点,不做curd工程师与Api调用工程师 欢迎访问个人博客网站:https://www.coder-programming.cn/ 作者:liuxiaopeng | http://www…

4位先行进位电路 logisim_你真的了解74系列集成电路吗?让我帮你总结一下

74系列集成电路大致可分为6大类:74(标准型)74LS(低功耗肖特基)74S(肖特基)74ALS(先进低功耗肖特基)74AS(先进肖特基)74F(高速)HC为COMS工作电平;HCT为TTL工作电平,可与74LS系列互换使用HCU适用于无缓冲级的CMOS电路。这9种74系列产品&#xf…

android ios av tv,iOS使用AVPlayer制作战旗TvDEMO OC版

在视频教学中看到一个别人写的战旗TvDEMO写得很好,于是自己动手试着制作一个。效果如下图所示主界面竖屏播放横屏播放点击出现工具栏视频播放使用的是AVPlayer,具体的使用方式如下//---PlayView---_playView [[UIView alloc]init];_playView.frame CGRectMake(0, …

matlab 子图title的位置_matlab 画图基本介绍

1.在命令窗口输入命令时&#xff0c;可以不必每输入一条命令就按enter键执行&#xff0c;可以在输入几行后一同运行。方法是&#xff1a;换行时&#xff0c;只要在按住<shift>键的同时按<enter>键即可&#xff0c;否则matlab就会执行上面输入的所有语句。2.如何将数…

python程序打包成安卓app教程_Python打包方法基本应用方式介绍

Python编程语言是一款功能强大的免费开源的通用型计算机程序应用语言&#xff0c;对于经验丰富的开发人员来说&#xff0c;掌握这样一款语言在其程序开发中是一个比较重要的选择。我们今天就先来了解一下python打包方法的相关应用。 一、简介 py2exe是一个将Python脚本转换成wi…

android添加删除项目,编写android计算器添加删除按钮,出现很抱歉,XX项目已停止运行。...

这是删除按钮监听代码&#xff1a;//del 按钮的监听btnDel (Button) findViewById(R.id.delete);btnDel.setOnClickListener(new OnClickListener() {Overridepublic void onClick(View view) {btnDel.setOnClickListener(this);//短按//btnDel.setOnLongClickListener(this);…

二元一次方程有唯一解的条件_人教版初中数学七年级下册用适当方法解二元一次方程组公开课优质课课件教案视频...

解二元一次方程组---加减法一、教学目的&#xff1a;1&#xff0e;使学生掌握用加减法解二元一次方程组的步骤。2&#xff0e;熟练运用加减法解二元一次方程组。3&#xff0e;培养学生分析问题、解决问题的能力。二、教学重点、难点和关键&#xff08;一&#xff09;重点&#…

为什么从网页上打印怎们好像被缩放_全网最详细关于3D打印的zbrush技术

这个小教程旨在为刚开始对3D打印感兴趣的新人朋友提供一些快速上手小技巧&#xff0c;以便在zbrush中制作适合桌面FDM 3D打印的创作&#xff0c;本次小教程需要读者已经有一些zbrush基础知识。1设置系统单位导入1英尺的box&#xff0c;1英尺X1英尺X1英尺。一旦导入到场景中&…

android图片浏览远近,快图浏览编辑图片方法介绍_怎么编辑图片_3DM手游

既然是图片管理工具&#xff0c;那么快图浏览肯定也是少不了图片编辑功能的。如何使用快图浏览编辑图片呢&#xff1f;下面小编带来的详细的使用方法&#xff0c;有需要的小伙伴一起来看看吧&#xff01;编辑照片方法介绍&#xff1a;1.第一步&#xff0c;下载安装快图浏览&…