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

Linux内核分析》之计算机是如何工作的 实验总结

马马虎虎学完了Python课程,一直想学下linux,看到里面有个linux的就选上了。...假设一开始为空栈,初始位置为0,ebp=esp,如图: ? 将当前ebp压栈同时esp的值被修改,即esp指向位置(1) ? ebp指向esp的位置,即ebp指向位置(1) ?...将ebp的地址(位置1)存入位置(4),esp指向位置(4),此时代码进入f函数(模块)并执行其第一语句 使ebp指向与esp相同的地址,即位置4 esp指向位置(5) 将ebp+8变址寻址,即向上2个标号的位置...(6) esp指向位置(5),同时eip重新指向行号15 esp指向ebp的地址(位置4),即esp指向位置(4) ebp指向位置(1),esp指向位置(3) eip重新指向行号23 eax的值加上1,...《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

99710

Linux内核分析》之操作系统是如何工作的 实验总结

2、将task[pid].thread.sp(即栈顶)压栈,由于当前栈为空栈,故当前ebp压栈同时esp的值被修改,为以后的%ebp的复位使用。...赋给eip 7、此时新进程开始运行 8、恢复ebp (注意这里已经切换了进程) 小结: 1.保存prev进程的ebpesp和eip 2.恢复next进程的espebp和eip 下一个进程未执行过时...2、将当前进程的esp赋到当前进程的sp,即保存当前的esp 3、将新进程的sp放到esp中 4、将新进程的sp放到ebp中 5、保存eip,即将eip保存到当前的ip 6、将当前进程的ip压栈(即将当前程序的入口保存...) 7、ret 出栈,将prev进程的ip赋给eip 小结: 1.保存prev进程的ebpesp和eip 2.设置新进程的eip、ebpesp。...因为是新进程,所以ebpesp相同,都是从存储的sp那里取值。 两种进程切换的不同之处 当切换到一个新进程时,新进程的ebp不再是从栈顶恢复,而是设置一个新的值。

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

程序执行的本质

CPU中有三个寄存器,分别是eip、ebpesp,情景如图所示。 ?...ebpesp用来管控栈空间,ebp指向栈底,esp指向栈顶,在代码区中,函数调用、返回和执行伴随着不断压栈和清栈,栈中数据存储和释放的原则是后进先出。...初始情景: eip指向main函数的第一条指令,此时程序还没有运行,栈空间里还没有数据,ebpesp指向的位置是程序加载时内核设置的(详情请看《Linux内核设计的艺术》一书)。...什么是EIP、ESPEBP 堆栈是一种简单的数据结构,是一种只允许在其一端进行插入或删除的线性表。 允许插入或删除操作的一端称为栈顶,另一端称为栈底,对堆栈的插入和删除操作被称入栈和出栈。...第一条指令的执行,致使ebp的地址值被保存在栈中,保存的目的是本程序执行完毕后,ebp还能返回现在的位置,复原现在的栈。随着ebp地址值的压栈,esp自动向栈顶方向移动,它将永远指向栈顶。

81310

5.5 汇编语言:函数调用约定

一般情况下在Win32环境默认遵循的就是STDCALL,而在Win64环境下使用的则是FastCALL,在Linux系统上则遵循SystemV的约定,这里我整理了他们之间的异同点.CDECL:C/C++...前两个参数放入(ECX, EDX),剩下的参数压栈保存.FASTCALL64:被调方平栈,不定参数的函数无法使用,前四个参数放入(RCX, RDX, R8, R9),剩下的参数压栈保存.System V:类Linux...在程序编译时编译器会自动为我们计算ESP基地址与传入变量的参数偏移,使用esp寻址后,不必每次进入函数后都调整栈底ebp,从而减少了ebp的使用,因此可以有效提升程序执行效率。...mov esp,ebp pop ebp ret function ENDP main PROC push ebp mov ebp,esp sub esp,0dch...mov esp,ebp pop ebp ret function ENDP main PROC push ebp mov ebp,esp sub esp,0d8h

22020

从汇编角度来理解linux下多层函数调用堆栈运行状态

This GDB was configured as "i686-linux-gnu"....在每个函数的栈帧中,ebp指向栈底,而esp指向栈顶,在函数执行过程中esp随着压栈和出栈操作随时变化,而ebp是不动的,函数的参数和局部变量都是通过ebp的值加上一个偏移量来访问,例如foo函数的参数...然后执行leave指令,这个指令是函数开头的push %ebp和mov %esp,%ebp的逆操作: 1. 把ebp的值赋给esp,现在esp的值是0xbffff688。 2....现在esp所指向的栈顶保存着foo函数栈帧的ebp,把这个值恢复给ebp,同时esp增加4,esp的值变成0xbffff68c。 最后是ret指令,它是call指令的逆操作: 1....参考: 《linux c 编程一站式学习》 《网络渗透技术》

1.4K00

PWN从入门到放弃(12)——栈溢出之栈迁移

leave_ret这个gadget将esp劫持到fake_ebp的地址上。...,ebp pop ebp ret 当我们挨个去执行的时候会出现这样的情况 首先是 mov esp,ebp 执行完以后变成了这个样子: 然后 pop ebp 执行完后就是 别忘了,pop 指令是把栈顶的值弹到...了 我们来分析一下这个payload 首先这个函数vuln结束时本来就要leave_ret 这时esp指向fake ebp的地址,pop ebp时将fake_ebp的值取出,所以ebp此时指向fake_ebp...即s_addr 然后再leave_ret,此时esp指向ebp即s的地址,ebp的地址已经无所谓了,所以s的前4个字节无所谓,可以随便填,此时esp指向system,ebp管他呢 然后执行ret 即pop...tmux","splitw","-h"] elf = ELF(pro) r = process(pro) #r = remote('node3.buuoj.cn',27480) context.os = 'linux

15010

GCC生成的汇编代码

movl %esp, %ebp  subl $4, %esp                  # 为局部变量t在栈帧上分配空间  movl 12(%ebp), %eax    # %eax...%eax <- t  leave                                 # 平衡堆栈: %esp <- %ebp , popl %ebp  ret                                      ...                       # 保存原%ebp    movl %esp, %ebp         movl 12(%ebp), %eax     # %eax <- y  movl...三、反汇编目标文件 在Linux系统中,带 "-d" 命令行选项调用OBJDUMP可以完成这个任务: #objdump -d code.o ?...  401051: 89 e5                        mov    %esp,%ebp   401053: 8b 45 0c                   mov

1.9K10

GDB调试汇编分析

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

3.2K21
领券