首页 > 其他分享 >对于push,pop,call,leave,ret的理解

对于push,pop,call,leave,ret的理解

时间:2024-01-24 21:57:29浏览次数:35  
标签:指向 esp pop leave ebp ret push call

push指令

比如push ebp就是把ebp的值放在esp所指的地方,然后esp-4(32位,以下均为32位)。

pop指令

pop ebp就是把esp所指的地方的值给ebp,然后esp+4

call指令

call函数的时候,把eip的下一行存到esp所指的位置,然后esp-4

leave指令

leave指令可以等价于mov esp,ebp;pop ebp

ret指令

等价于pop eip

调试例子

下载:https://github.com/ctf-wiki/ctf-challenges/raw/master/pwn/stackoverflow/ret2text/bamboofox-ret2text/ret2text
该程序来自于ctfwiki中的基本ROP-ret2text
直接使用pwndbg启动起来,一直ni到我们需要的,比如call puts函数:
image.png
此时的esp为0xffffcf90,ebp为0xffffd018,我们si进去:
image.png
执行完call后,此时的esp为0xffffcf8c,esp指向的值为0x80486a7,ebp保持不变。
未执行call前,eip的下一行为0x80486a7,执行call时,将eip的下一行即0x80486a7给esp所指向的值,然后esp-4(0xffffcf90-4=0xffffcf8c)。
接下来ni到push 0x18
image.png
要执行push 0x18,push就是把要push的东西给esp所指向的值,然后esp-4,所以指向完push 0x1后,esp会变为0xffffcf88,而esp所指向的值会变为0x18
image.png
接下来再看push eax
image.png
eax的值为0x0,esp的值为0xffffcf84,push就是把要push的东西给esp所指向的值,然后esp-4,所以esp所指向的值会变为0x0,esp变为0xffffcf84-4=0xffffcf80image.png
再ni到pop edximage.png
pop某个东西就是把esp所指向的值给这个东西,esp再加4,此时为pop edx,就是把esp当前所指向的值0xf7e1f9c4给edx,esp-4=0xffffcf78+4=0xffffcf7c,如下图:image.png
此时的edx变为0xf7e1f9c4,esp变为0xffffcf7c。接着向下看:image.png
ret就是相当于pop eip,要执行ret 0xc的话,eip接下来会变为esp所指向的值0xf7c73200,esp会变为0xffffcf7c+0xc+4=0xffffcf8c(如果没有0xc的话,就不用加)如下图:
image.png
直接finish出来,去找最后的leave:
image.png
leave就是等价于mov esp,ebp;pop ebpa5d56f54874c9d4830b8339f382fc0f7.jpeg
先来看当前的:esp为0xffffcf90,ebp为0xffffd018,可以先用telescope 0xffffd018找一下ebp所指向的值:image.png
由于由于leave相当于一次执行两步,先来分析mov esp,ebp,执行完这个后,esp会变为0xffffd018,此时再pop ebp,就是把esp所指向的值(0x0)给ebp,然后esp+4变为0xffffd018+4=0xffffd01c
image.png
可以看到,ebp变为0,esp变为0xffffd01c。调试分析结束,由于我也刚学不久,如果有错误的地方,大佬勿喷。
image.png

标签:指向,esp,pop,leave,ebp,ret,push,call
From: https://www.cnblogs.com/wplsyx/p/17985926

相关文章

  • ERROR:Only one ConfirmCallback is supported by each RabbitTemplate] with root cau
     错误:OnlyoneConfirmCallbackissupportedbyeachRabbitTemplate]withrootcause 原因:因为Spring的Bean默认都是单例;而RabbitTemplate对象同样支持一个回调。 解决:使用@Scope("prototype")可通知Spring将被注解的Bean变为多例。代码: //改Ra......
  • HttpRetryException: cannot retry due to redirection, in streaming mode
     failcannotretryduetoredirection,instreamingmodeexecutingPOSThttps://vsp.allinpay.com/apiweb/gateway/payfeign.RetryableException:cannotretryduetoredirection,instreamingmodeexecutingPOSThttps://vsp.allinpay.com/apiweb/gateway/pay......
  • nvm 报错 Could not retrieve https://npm.taobao.org/mirrors/node/*************
    nvminstall(listavailable)报错Couldnotretrievehttps://npm.taobao.org/mirrors/node/*************出现这个错误的原因是淘宝不知道啥时候换镜像源地址了 打开nvm安装目录找到 settings.txt文件 地址更换为node_mirror:https://cdn.npmmirror.com/binari......
  • FutureTask源码阅读
    目录简介例子代码分析成员变量方法参考链接本人的源码阅读主要聚焦于类的使用场景,一般只在java层面进行分析,没有深入到一些native方法的实现。并且由于知识储备不完整,很可能出现疏漏甚至是谬误,欢迎指出共同学习本文基于corretto-17.0.9源码,参考本文时请打开相应的源码对照,否则......
  • [MIT 6.S081] Lab: system calls
    Lab:systemcalls前言这次实验是实现内核中的两个syscall:trace和sysinfo。回顾一下第三节课,用户态的进程想要执行某个系统调用,例如exex(init,argv),首先会将init和argv的地址分别存放在a0和a1寄存器中,然后a7存放所要调用的系统调用,最后执行ecall。之后要结......
  • Verdi信号平移+研发管理体系+malloc和calloc函数区别+使用__FILE__只打印文件名+使用i
    Verdi信号平移信号左移是将光标移动在双引号以内的信号名左边,然后先输入数字,可以带上单位,如[ns|n]、[ps|p],然后按<<-按键。https://blog.csdn.net/qq_40268672/article/details/132915499信号右移信号右移是数字在右边,信号在左边,用右移符号,其它不变。研发管理体系https://......
  • compareTo、Comparator、TreeSet排序那些事
    前言:对于后端开发而言,学会对数据的自定义排序还是十分有必要的。需要用到排序的场景也是很多的,什么排行版展示、利用时间+别的条件排序、还有预接单的数据就是要展示在已接单的数据前面这种需求、等等。总之很重要的!一:对集合排序对以下的数据做展示顺序排序:未接单>预接单>已接单。(......
  • 像 Google SRE 一样 OnCall
    在GoogleSRE的著作《Google运维解密》(原作名:SiteReliabilityEngineering:HowGoogleRunsProductionSystems)中,GoogleSRE的关键成员们几乎不惜用了三个章节的篇幅描述了在Google他们是如何OnCall的。GoogleSRE实践中,有一个广为人知的理念:减少琐事,用软件工程的方......
  • Hive报错:Call From hadoop01/172.23.238.2 to hadoop01:10020 failed on connection e
    问题描述在阿里云服务器上安装的Hadoop和Hive,刚开始关闭了防火墙。但是由于服务器被被黑客安装挖矿程序,所以开启了防火墙。但是即使开启了所有可能的端口,但是在向Hive中插入数据时,依然报错提示:CallFromhadoop01/172.23.238.2tohadoop01:10020failedonconnectionexception......
  • Js(Javascript)的apply call 和bind区别
    ​ apply、call和bind是用于调用函数的三种不同方式,它们的主要区别在于函数调用时的上下文(this关键字)以及参数传递的方式。call和apply是用于立即调用函数并设置this上下文的方法,它们的主要区别在于参数传递的方式。bind不会立即执行函数,而是创建一个新的函数,将this......