原文地址: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. 1. Spark Word Count

    1. request: 2. scala: sc.textFile("input").flatMap(_.split(" ")).map((_,1)).redu ...

  2. 解决 ‘Could not fetch URL https://pypi.python.org’的问题

    [前提]: win10下python3和python2共存环境,但是环境变量只配置了python3 [问题]: 用pip安装一个包执行pip2 install xxx的时候报错Fatal error ...

  3. 力扣 - 445. 两数相加 II

    目录 题目 思路 代码实现 题目 给你两个 非空 链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储一位数字.将这两数相加会返回一个新的链表. 你可以假设除了数字 0 之外,这两 ...

  4. [python学习手册-笔记]001.python前言

    001.python前言 ❝ 本系列文章是我个人学习<python学习手册(第五版)>的学习笔记,其中大部分内容为该书的总结和个人理解,小部分内容为相关知识点的扩展. 非商业用途转载请注明 ...

  5. VUE自定义(有限)库存日历插件

    开发过程中遇到一个令人发指的,一个element-ui无法满足的日历需求, 改造其日历插件的代价太大,于是索性自己手写一个,需求如下: 1. 根据开始.结束时间计算时间覆盖的月份,渲染有限的可选择日期 ...

  6. 在pgsql库用触发器自动触发PostgreSQL的存储过程,实现插入。

    需求:在对表A 执行 insert操作时,筛选符合条件的数据 insert到表B中,编写为存储过程(postgreSQL数据库) [筛选条件]:1. dd !="A" 或是 dd为 ...

  7. C++ 基础 6:模板

    1 函数模板 泛型(Generic Programming),即是指具有在多种数据类型上皆可操作的含意. 泛型编程 的代表作品 STL 是一种高效.泛型.可交互操作的软件组件. 泛型编程最初诞生于 C ...

  8. python_选课系统

    import sys import pickle import os USERINFO = r'C:\Users\12078\PycharmProjects\OldBoy\选课系统\userinfo' ...

  9. JS中的Array之方法(1)

    a=[2,4,5,6,7,90]; [1]. a.toString();  // 返回字符串表示的数组,逗号分隔 "2,4,5,6,7,90" [2]. a.join('||'); ...

  10. 使用 ffmpeg 命令直播推流

    CMD使用到的命令 D: -> 表示进入D盘cd /live -> 表示进入某个路径 执行条件 1.ffmpeg.exe 与视频放在同一目录下,纯英文目录2.执行以上命令进入到ffmpeg ...