原文地址:https://blog.csdn.net/lixiangminghate/article/details/53333710

正常情况下,函数栈分布图如下:

即,返回地址被改为一段缓存区的地址。当函数执行结束,从栈中取返回地址准备执行时,取到的是shellcode的地址,最终跳进shellcode执行。这段shellcode的地址一般被硬编码为某个地址,这个地址可以存在于程序空间的任何地方,只要有执行权限。
就像写代码时用绝对路径读取配置文件的内容,偶尔会出错一样,为了解决这种错误,可能会用相对程序运行时的路径去获取配置文件的内容。硬编码shellcode的地址也会出错,于是先人提出一种相对定位shellcode地址的方法,这就是jmp esp。

这用到了栈指针esp的一个特性:当函数执行ret指令后,Eip寄存器发生了跳转,但Esp还指向函数形参在栈中的地址。如示意图:

ret返回前 esp的位置:

相对于Eip的跳跃性----ret以后Eip指向天南地北了,Esp具有相对比较稳定的连续性----至少在刚才栈内存的附近。于是,当Eip在后续执行过程中,遇到了jmp esp指令,仍会回到上图中esp指向的函数形参位置执行,执行shellcode的剩余部分。
跳转后,执行的位置确定了,剩下的问题就是寻找用户可访问空间中,哪段内存地址包含了jmp esp这样的指令。于是OD可能提供了这样的插件,用于寻找这样的地址,比如找到0x00ABCDEF这个地址上包含了jmp esp指令。于是,栈溢出后,在返回地址处填入0x00ABCDEF。当被溢出的函数执行ret指令时,首先会跳转到0x00ABCDEF处取指执行。取到的结果是jmp esp,于是Eip被设置成Esp的值---即上图中本是存放函数形参,现在被shellcode覆盖的栈内存处继续执行

关于 [栈溢出后jmp esp执行shellcode] 原理分析的更多相关文章

  1. SpringMVC(关于HandlerMapping执行流程原理分析)

    请求过来先碰见中央调度器(前端调度器) //Determine handler for the current request; 对当前请求决定交给哪个handler, 当前请求地址过来 处理器执行链 ...

  2. koa执行过程原理分析

    本文原创,转载请注明出处https://i.cnblogs.com/EditPosts.aspx?postid=5710639 我们大家都知道,当koa接到请求经过中间件时,当执行到 yield ne ...

  3. 远程执行shellcode

    #include "Windows.h" #include <WinSock2.h> #include <stdio.h> #pragma comment( ...

  4. jvm 字节码执行 (二)动态类型支持与基于栈的字节码解释执行

    动态类型语言 动态类型语言的关键特征是它的类型检查的主体过程是在运行期而不是编译期. 举例子解释“类型检查”,例如代码: obj.println("hello world"); 假 ...

  5. Python 执行 shellcode

    import urllib2 import ctypes import base64 # 从我们的web服务器上下载shellcode url = "http://rinige.com/sh ...

  6. js基础梳理-究竟什么是执行上下文栈(执行栈),执行上下文(可执行代码)?

    日常在群里讨论一些概念性的问题,比如变量提升,作用域和闭包相关问题的时候,经常会听一些大佬们给别人解释的时候说执行上下文,调用上下文巴拉巴拉,总有点似懂非懂,不明觉厉的感觉.今天,就对这两个概念梳理一 ...

  7. 某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?

    转载注明:http://dwz.win/gHc 最近网上出现一个美团面试题:"一个线程OOM后,其他线程还能运行吗?".我看网上出现了很多不靠谱的答案.这道题其实很有难度,涉及的知 ...

  8. JVM 堆内存溢出后,其他线程是否可继续工作

    最近网上出现一个美团面试题:“一个线程OOM后,其他线程还能运行吗?”.我看网上出现了很多不靠谱的答案.这道题其实很有难度,涉及的知识点有jvm内存分配.作用域.gc等,不是简单的是与否的问题. 由于 ...

  9. 面试题:JVM 堆内存溢出后,其他线程是否可继续工作?

    来源:http://sina.lt/gqaM 最近网上出现一个美团面试题:“一个线程OOM后,其他线程还能运行吗?”.我看网上出现了很多不靠谱的答案.这道题其实很有难度,涉及的知识点有jvm内存分配. ...

随机推荐

  1. 云服务器部署scrapyd爬虫

    Scrapyd部署爬虫项目 GitHub:https://github.com/scrapy/scrapyd API 文档:http://scrapyd.readthedocs.io/en/stabl ...

  2. 836. Rectangle Overlap ——weekly contest 85

    Rectangle Overlap A rectangle is represented as a list [x1, y1, x2, y2], where (x1, y1) are the coor ...

  3. ELK搭建以及运行和ElasticStarch的详细使用(7.X版本之上)

      ELK初体验     1.官网   https://www.elastic.co/cn/downloads/elasticsearch   2.需要安装JDK   ElasticSearch 是一 ...

  4. 自定义MFC对话窗口的类名

    默认情况下,MFC对话框的窗口类名为"#32770",如果想自定义窗口类名呢,需要两步: 1.修改rc文件 这一步需要直接编辑rc文件,使用任意记事本工具即可,找到窗口的相关定义, ...

  5. 使用bootstrap fileinput多文件拖拽上传的记录

    今天琢磨文件上传,刚好看到bootstrap 我就搜了一下,刚刚能满足需求,使用上手也很快,使用完还是记录下来. 1.首先我们下载插件包,可以用nuget搜索bootstrap-fileinput 也 ...

  6. SSM工作流程与原理详解

    自学ssm->springboot->springcloud,所以很多东西会用但理解较浅,所以现在从最开始的ssm开始进行对原理以及运行过程的整理知识归纳,若有错误感谢指正. Spring ...

  7. RPC协议实践入门

    RPC 是什么 RPC(Remote Procedure Call) 是一个计算机通信协议.该协议允许运行与一台计算机的程序调用另一个地址空间的程序,是一个通过发送请求-接受回应进行信息交互的系统. ...

  8. Redis分布式锁的正确使用与实现原理

    模拟一个电商里面下单减库存的场景. 1.首先在redis里加入商品库存数量. 2.新建一个Spring Boot项目,在pom里面引入相关的依赖. <dependency> <gro ...

  9. SQL Server 数据库bak备份文件还原操作和mdf文件附加操作

    前言:现在任何软件都离不开数据的支持,数据的价值是无价的,因此数据目前显得尤为重要,日常软件生产库的数据定时或实时备份必不可少,备份出的文件也需要进行验证,下边我将介绍SQL Server数据的的备份 ...

  10. 整理了 15 道 Spring Boot 高频面试题,看完当面霸!

    转载:https://mp.weixin.qq.com/s/fj-DeDfGcIAs8jQbs6bbPA 什么是面霸?就是在面试中,神挡杀神佛挡杀佛,见招拆招,面到面试官自惭形秽自叹不如!松哥希望本文 ...