首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux内核之旅张凯捷——系统调用分析(2)

将SYSENTER_ESP_MSR的值装载到esp寄存器。 将特权级切换到Ring0。 如果EFLAGS寄存器的VM标志被置位,则清除该标志。 开始执行指定的Ring0代码。...将寄存器edx的值装载到eip寄存器。 将SYSENTER_CS_MSR的值加24(Ring3的堆栈段描述符)装载到ss寄存器。 将寄存器ecx的值装载到esp寄存器。 将特权级切换到Ring3。...3.3.2 linux4.20内核sysenter系统调用 在linux4.20内核中,对IA32_SYSENTER_EIP寄存器中传入的是entry_SYSENTER_32函数。...sysexit ... entry_SYSENTER_32()函数主要工作: (1)之前说到sysenter指令会将SYSENTER_ESP_MSR的值装载到esp寄存器,但是里面保存的是sysenter_stack...的地址,所以通过movl TSS_entry2task_stack(%esp), %esp语句,修正esp寄存器保存进程的内核栈。

1.8K20
您找到你想要的搜索结果了吗?
是的
没有找到

Linux应用程序设计:用一种讨巧方式,来获取线程栈的使用信息

我找了一下相关的系统调用,Linux 似乎没有提供相关的函数。 怎么办?只能迂回操作。 ? 我们知道,在 Linux x86 平台上,寄存器 ESP 就是来存储栈指针的。...对于一个满递减类型的栈,这个寄存器里的值,就代表了当前栈中最后背使用的、那个栈空间的地址。 因此,只要我们能够获取到 ESP 寄存器里的值,就相当于知道了当前这个栈有多少空间被使用了。...那么怎样来获取 ESP 寄存器的值呢?既然是寄存器,那就肯定是使用汇编代码了。...我们来分析一下哈:当一个线程刚刚开始执行的时候,栈区里可以认为是空的,也就是说此时 ESP 寄存器里的值就可以认为是指向栈区的开始地址! 是不是有豁然开朗的感觉?! ?...是否可以继续利用刚才的技巧:通过定义一个局部变量的方式,来间接地获取 ESP 寄存器的值? ?

91010

Linux内核13-进程切换

本文就研究Linux内核的进程切换。我们首先理解几个概念。 1.1 硬件上下文 我们知道每个进程都有自己的地址空间,但是所有的进程却共享CPU寄存器。...在进行进程切换之前,用户态进程使用的所有寄存器内容都已经包含在内核态的栈中了。这其中就包含指定用户态进程栈指针地址的ss和esp这对寄存器内容。...1.2 任务状态段-TSS x86架构包含一个特殊的段寄存器,称为任务状态段(TSS),用来保存硬件上下文内容。尽管Linux不使用硬件上下文切换,但还是给每个不同CPU建立一个TSS。...在Linux的设计中,每个CPU就只有一个TSS,所以,Busy位总是设为1。换句话说,Linux中Type域一般为11。...保存旧进程栈指针esp到prev->thread.esp中 操作数484(%eax)表明目的地址是寄存器eax中的地址加上484。 将新进程的栈指针加载到esp寄存器中。

1.8K20

基于int的Linux的经典系统调用实现

1,  Linux系统调用:2.6.19版内核提供了319个系统调用。...(2)       在Linux中,用户态和内核态使用的是不同的栈,两者各自负责各自的函数调用。...此外,寄存器SS的值还要指向当前栈所在的页 (5)  用户栈 -> 内核栈的实际行为就是:         保存当前的ESP,SS的值   ->   将ESP SS的值设置为内核栈的相应值 内核栈 -...(7)       中断发生时,CPU切入内核态,还会接着做下面几件事         找到当前进程的内核栈(每个进程都有独立的内核栈) ->   在内核栈中一次压入用户态的寄存器SS、ESP、EFLAGS...(8)       系统从系统调用中返回时,需要用iret指令回到用户态,iret会从内核态中弹出寄存器SS、ESP、EFLAGS、CS、EIP的值,使得栈恢复到用户态的状态 6,中断处理程序:切换栈了以后

1.2K90

程序员的自我修养 - 系统调用及原理

Linux系统调用 在x86下,Linux的系统调用由0x80完成,各个通用寄存器用于传递参数,EAX寄存器用于表示系统调用的接口号,比如EAX=2表示创建进程(fork),每个系统调用都对应于内核源码中的一个函数...所谓的当前栈,指的是ESP的值所在的栈空间,如果ESP的值位于用户栈的范围内,那么当前程序的栈就是用户栈,反之亦然,此外,寄存器SS的值还应该指向当前栈所在的页。...所以,将当前栈由用户栈切换到内核栈的实际行为就是: 保存当前ESP,SS的值 将ESP,SS的值设置成内核栈的值 当0x80寄存器发生的时候,CPU除了进入内核态以外,还会自动完成以下几件事: 找到当前进程的内核栈...(每个进程都有自己的内核栈) 在内核栈中依次压入用户态的寄存器SS,ESP,EFLAGS,CS,EIP 返回时用这些地址和数据返回。...Linux新型系统调用机制 由于基于int指令的系统调用在奔腾4处理器上性能不佳,Linux2.5版本开始支持一种新的系统调用机制。

44220

Linux下开发stm32 ③ | 寄存器工程开发

先来回顾一下前两篇 Linux下开发stm32(一) | 使用gcc-arm-none-eabi工具链编译 Linux下开发stm32(二) | 使用openocd下载与调试 前两篇我们介绍了如何创建一个空的裸机工程...main文件),并编译工程生成elf文件,然后将其转为bin格式或hex格式,使用openocd下载,最后编写了一个makefile雏形,并成功点亮了一个LED~ 但是这个LED我们是通过指针直接操作寄存器地址来完成的...,接下来,我们在此基础上,引入stm32头文件,其中包含了寄存器的宏定义,也就是使用寄存器进行开发~ 1.创建寄存器工程 首先将上一节中创建的裸机工程00-template-reg复制一份出来,改名为01...0x40010c00+0x0c) &= ~(1<<0); GPIOB->ODR &= ~(1<<0); while(1); } void SystemInit(void) { } 至此,寄存器工程创建完毕...,接下来开始编译~ 2.编译&下载寄存器工程 编译寄存器工程的重点就在于C头文件和C源文件,启动文件的编译和链接都和之前一样。

1.2K30

程序执行的本质

CPU中有三个寄存器,分别是eip、ebp和esp,情景如图所示。 ?...ebp和esp用来管控栈空间,ebp指向栈底,esp指向栈顶,在代码区中,函数调用、返回和执行伴随着不断压栈和清栈,栈中数据存储和释放的原则是后进先出。...初始情景: eip指向main函数的第一条指令,此时程序还没有运行,栈空间里还没有数据,ebp和esp指向的位置是程序加载时内核设置的(详情请看《Linux内核设计的艺术》一书)。...ESP寄存器存放当前线程的栈顶指针; EBP寄存器中保存当前线程的栈底指针; call main下面的一条指令地址EIP(也称返回地址)寄存器; 程序开始执行main函数第一条指令,eip自动指向下一条指令...随着ebp地址值的压栈,esp自动向栈顶方向移动,它将永远指向栈顶。

81410

GDB调试汇编分析

使用display /i $pc(结合display命令和寄存器/pc内部变量)指令进行设置 ?...可见此时主函数的栈基址为0xffffd068,用x(examine)指令查看内存地址中的值,但目前%esp所指堆栈内容为0,%ebp所指内容也为0 用i r指令查看各寄存器的值 依次如下指令调试汇编代码...,并查看%esp、%ebp和堆栈内容: 1、使用si指令单步跟踪一条机器指令 2、使用i r指令查看各寄存器的值(在这里要看%eip、%eax、%esp和%ebp) 3、使用x/na %esp对应的值指令查看堆栈变化...push后寄存器中的值发生转变。 ? ? ? 函数f修改了%esp,用leave指令恢复。 ? ret结束main函数 ?...这次的实践让我对于堆栈变化了有了更加深刻的理解,在使用终端三件工具编程时,没有编程软件上自带写好我们拿来就用的断点设置按钮,之后若是遇到这样的问题我们只能自己动手去做,所以说这次的实践又是我们掌握的一件有力的linux

3.2K21

一文读懂 | Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

【扩展阅读】:ARM 寄存器简介 ARM 处理器拥有 37 个寄存器。这些寄存器按部分重叠组方式加以排列。每个处理器模式都有一个不同的寄存器组。...界定,EBP 指向当前栈帧底部(高地址),在当前栈帧内位置固定;ESP指向当前栈帧顶部(低地址),当程序执行时ESP会随着数据的入栈和出栈而移动。...介绍完栈的工作原理和用途作用后,我们回归到 Linux 内核上来。...二、线程栈 从 Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct 中。...,然后通过 esp 来获取 thread_info。

1.6K20

无名寄存器

在计算机里面也有寄存器,计算机中的寄存器是看得见,摸得着的实体,寄存器中存储需要经常访问的一些数据。...而vim中也有寄存器的概念,vim中的寄存器是一个虚拟的概念,更像是一块专门用来存储数据的内存缓冲区。在使用vim的过程中离不开寄存器,而且我们很早就用到了寄存器,只是没有发现罢了。...为了解决这个问题,一个思路就是使用有名寄存器。 vim中提供了由a到z的有名寄存器,可以在使用operator 的操作前面指定需要使用的寄存器,引用一个寄存器可以使用 " + 寄存器名的格式。...黑洞寄存器 前面说到 dd会将被删除内容放入到无名寄存器中,如果这段内容我确实不想要了,也不想它占用寄存器,有没有什么办法彻底删除呢,答案是使用黑洞寄存器,顾名思义,放入该寄存器中的内容都被吸走丢失了,...看不出什么区别,那么我们可以试试使用 :reg 命令来查看有名寄存器和黑洞寄存器的值,我们发现黑洞寄存器的值永远为空,而有名寄存器此时多了一条记录。

82710

缓冲区溢出实战-slmail

环境准备:SLMail 5.5.0 Mail Server,ImmunityDebugger,mona.py,windos和linux系统 下载地址: slmail http://slmail.software.informer.com...在Linux系统,我的是安装的kali,ping一下windows,看能不能ping通。 windows: ? ? ? 如果ping不通,请关闭防火墙: ? ?...EIP中的41是十六进制数,转换为字母就是A,也就是说此时EIP寄存器全部填满了A,ESP寄存器也被填满了A,每四个字节为一个存储单元进行存储, EIP就是当前邮件服务器SLmail下一个需要执行的指令的内存地址...【静态调试(汇编)、动态调试(正在运行的进程:attach)】 110端口【SLmail】:netstat -nao【查看系统进程的PID和端口等信息】 # 重点关注寄存器 # ESP:当ESP中输入数据过多...运行脚本之后,调试的进程显示如下,满足预先计算的结果,则可验证字符位置是正确的,可以看到,EIP寄存器的数据即是脚本中buffer中设置的4个B(ASCII的Hex值为42),而ESP寄存器存放的正是脚本中

1.9K20

谈谈协程

早期版本的Linux并不支持线程,这时就出现代替线程的轻量级线程--协程。比较有名的有: GNU Pth 和 Libtask(Go语言的作者之一Russ Cox的作品)。...我们知道CPU的使命就是执行程序中的指令,而且CPU内部有很多用于存放数据的寄存器,其中比较重要的一个寄存器叫EIP寄存器,它用于存储下一条要执行的指令。...除了EIP寄存器之外,还有一个比较重要的寄存器ESP寄存器,它用于保存程序的栈顶位置。除此之外,CPU还有很多其他用途的寄存器,如:通用寄存器EAX、EDX和段寄存器CS、DS等等。...而上下文就是CPU寄存器的值,所以要创建一个协程,首先要创建一个保存CPU寄存器值的对象。在Libtask中,使用mcontext结构体来保存寄存器的值。...需要说明的一点是,“movl 4(%esp), %eax”这行汇编代码的作用是把ctx参数放置到EAX寄存器中,后面的操作都是通过mcontext结构体的偏移量来赋值的。

58210

汇编角度看函数堆栈调用

= 0; ret = sum(a,b); printf("ret = %d\n",ret); return 0; } 实验环境:vc++ 6.0 和 Win10操作系统 注意:linux...[push 寄存器] 功能:将一个寄存器中的数据入栈。包含两个动作:将寄存器中的数据入栈,栈顶指针向上(低地址)偏移。 [pop 寄存器] 功能:出栈,以一个寄存器接受出栈的数据。...ecx寄存器中的值是重复的次数。 stos指令的作用是将eax寄存器中的值拷贝到[edi]指向的地址。 2.常用的寄存器。 eax:累加寄存器,它是许多加法乘法指令的缺省寄存器。...2.使得esp和ebp指向同一块内存区域,虽然esp和ebp是寄存器,但由于其内保存的是地址,所以在此我们也可以形象的将esp和ebp看做指针,便于理解。...esp,8 相当于esp = esp + 8,是主函数压实参的栈帧回退。

58120

Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

界定,EBP 指向当前栈帧底部(高地址),在当前栈帧内位置固定;ESP指向当前栈帧顶部(低地址),当程序执行时ESP会随着数据的入栈和出栈而移动。...介绍完栈的工作原理和用途作用后,我们回归到 Linux 内核上来。...栈起始地址 获取很简单,只需要嵌入汇编指令获取栈指针 esp 地址即可。栈结束地址 的获取有点麻烦,我们需要先利用递归函数把栈搞溢出了,然后再 GDB 中把栈溢出的时候把栈指针 esp 打印出来即可。...二、线程栈 从 Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct 中。...,然后通过 esp 来获取 thread_info。

3.3K20

【Android 逆向】Android 进程注入工具开发 ( EIP 寄存器指向 dlopen 函数 | ESP 寄存器指向栈内存 | 调试程序收回目标进程控制权 )

文章目录 一、EIP 寄存器指向 dlopen 函数 二、ESP 寄存器指向栈内存 三、调试程序收回目标进程控制权 一、EIP 寄存器指向 dlopen 函数 ---- 代码段中 , 一般都有 dlopen...并返回动态链接库的句柄 包含头文件 : #include 函数原型 : void * dlopen( const char * pathname, int mode); 将 EIP 寄存器指向...dlopen 函数 , 也就是将 dlopen 函数的地址设置到 EIP 寄存器中 ; 目标进程 恢复运行后 , 就会执行 dlopen 函数 ; 二、ESP 寄存器指向栈内存 ---- 除了函数外...架构中 , 函数参数是通过 栈 进行传递的 ; 使用 libc.so 中的 mmap 函数 在 堆 中申请一块内存 S , 在该内存中存储 dlopen 的参数 , 这个参数就是 动态库的 路径 ; ESP...寄存器指向的位置就是栈内存的地址 , 用于存放函数的参数 ; 将 S 内存作为 栈 : 将 S 内存的首地址赋值给 ESP 寄存器 ; 三、调试程序收回目标进程控制权 ---- 在 dlopen 函数执行完毕后

32310

Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

界定,EBP 指向当前栈帧底部(高地址),在当前栈帧内位置固定;ESP指向当前栈帧顶部(低地址),当程序执行时ESP会随着数据的入栈和出栈而移动。...介绍完栈的工作原理和用途作用后,我们回归到 Linux 内核上来。...栈起始地址 获取很简单,只需要嵌入汇编指令获取栈指针 esp 地址即可。栈结束地址 的获取有点麻烦,我们需要先利用递归函数把栈搞溢出了,然后再 GDB 中把栈溢出的时候把栈指针 esp 打印出来即可。...二、线程栈 从 Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct 中。...,然后通过 esp 来获取 thread_info。

2.8K50
领券