以nssctf里的where_is_my_shell为例

题目提供了一个system函数,和一个buf数组。数组的栈空间如图所示,这里不讨论怎么解题,只说明payload里的ret的作用。

假设没有ret,栈溢出到ret的时候内容如下:

第一个八字节:

(图示位置)存储 pop rdi;ret;的地址

它下面的八个字节存储要pop的参数。再下面八个字节存储system函数的地址。

这个时候我们可以知道一共存了三个八字节,第一个八字节的地址以8为起始,第二个以10为起始,第三个自然就是18为起始。问题就出在这里,

调用system函数的时候,它里面有一个函数要求system的rsp是16字节对齐的。即rsp指向system函数并执行时,system在栈中的地址必须是以0结尾的。

而此时是以8为结尾的。所以会产生错误。

此时在原本函数ret的位置再加一个ret就可以解决问题。原理如下:

根据汇编知识可知ret指令相当于把rsp所指向的栈中存储的地址赋给rip执行,然后使rsp+8(即使rsp指向栈中下一个位置).所以在所起作用的三个八字节前面加上一个ret(占八个字节)会使得这三个八字节的起始位置都往后顺延八个字节。所以此时system函数的起始地址就是以0结尾,满足16字节对齐要求。而由于ret的特殊性,在所执行操作前加上一个ret不会影响执行。

加一个ret后的操作如下:

原本函数的ret将我找到的ret地址赋给rip然后使rsp指向pop rdi;ret;的地址。然后rip执行ret指令,即把pop rdi;ret;的地址赋给rip然后执行后续操作。

所以加上ret后不会影响payload的执行,只会使payload里其它操作的地址往后顺延八个字节。

关于pwn题的栈平衡中ret的作用的更多相关文章

  1. 由一道CTF pwn题深入理解libc2.26中的tcache机制

    本文首发安全客:https://www.anquanke.com/post/id/104760 在刚结束的HITB-XCTF有一道pwn题gundam使用了2.26版本的libc.因为2.26版本中加 ...

  2. pwn 题GDB调试技巧和exp模板

    GDB分析ELF文件常用的调试技巧 gdb常用命令 首先是gbd+文件名 静态调试 ,gdb attach +文件名 动态调试 为了方便查看堆栈和寄存器 最好是安装peda插件 安装 可以通过pip直 ...

  3. 记两道最近做的pwn题(ciscn_2019)

    这两题为什么要记录呢,一个是我发现网上很多教程没写清楚(也可能是我太菜了),二是细节点很多,不同的大佬方式不太一样,有很多细节需要注意 ciscn_2019_es_2 这题是栈迁移的题,先上exp 1 ...

  4. pwn200,一道不完全考察ret2libc的小小pwn题

    pwn200 ---XDCTF-2015 每日一pwn,今天又做了一个pwn,那个pwn呢???攻防世界的进阶区里的一道小pwn题,虽然这个题考察的知识不多,rop链也比较好构建,但是还是让我又学到了 ...

  5. PWN题搭建

    0x00.准备题目 例如:level.c #include <stdio.h> #include <unistd.h> int main(){ char buffer[0x10 ...

  6. C 汇编代码 函数调用指令和栈平衡

    1. CALL指令: CALL指令可不是如唤指令,而是子程序调用指令.那么汇编语言中的子程序是什么呢?子程序能被其它程序调用,在实现某种功能后能自动返回到调用程序去的程序.其最后一条指令一定是返回指令 ...

  7. loj #6013. 「网络流 24 题」负载平衡

    #6013. 「网络流 24 题」负载平衡 题目描述 G 公司有 n nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n nn 个仓库的库存数量相同.搬运货物时 ...

  8. 【python】Leetcode每日一题-删除排序链表中的重复元素2

    [python]Leetcode每日一题-删除排序链表中的重复元素2 [题目描述] 存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表 ...

  9. 知道创宇爬虫题--代码持续更新中 - littlethunder的专栏 - 博客频道 - CSDN.NET

    知道创宇爬虫题--代码持续更新中 - littlethunder的专栏 - 博客频道 - CSDN.NET undefined 公司介绍 - 数人科技 undefined

  10. Libre 6013 「网络流 24 题」负载平衡 (网络流,最小费用最大流)

    Libre 6013 「网络流 24 题」负载平衡 (网络流,最小费用最大流) Description G 公司有n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使n ...

随机推荐

  1. 【小记事】如何设置vscode代码格式化时不要自动换行

    最近一格式化就给我分好多行,好气哦(`ヘ´)=3 在setting.json中添加如下代码: "vetur.format.defaultFormatter.html": " ...

  2. MySQL和Redis基本安装和配置

    MySQL 下载和安装 mysql官网下载:https://dev.mysql.com/downloads/mysql/ 下载后将目录下的bin路径加入到环境变量中 在安装目录下创建 my.ini 配 ...

  3. 【算法day1】复杂度和简单排序算法(1)

    复杂度和简单排序算法 时间复杂度 以一个排序(选择排序)操作举例 假设我有一个数组,我要找出其中的最小值放到0的位置上 那么 第一次我会遍历数组中N个数(在0位置处),找出最小的数交换到0位置[看了( ...

  4. 第137篇:重学ES6模块化

    好家伙,   我原本以为学完模块化之后,就能非常顺利的完成我的项目分包, 然而并没有,这是非常重要的知识,而我没有学好 所以我决定重学一遍   本篇为<阮一峰 ECMAScript 6 (ES6 ...

  5. C++ STL容器 set类型

    C++ STL容器 set类型 set是C++引入的二叉树数据结构 特点: 自动将元素排序 插入和删除查找logn 必须元素支持严格的弱顺序 不能改变元素的值 代码 using Group = std ...

  6. RocketMQ(9) 消息堆积与消费延迟

    消息堆积与消费延迟 1 概念 消息处理流程中,如果Consumer的消费速度跟不上Producer的发送速度,MQ中未处理的消息会越来越多(进的多出的少),这部分消息就被称为堆积消息.消息出现堆积进而 ...

  7. .NET Core 的 Docker 容器目录乱码问题

    现象 使用 docker exec -ti <容器名> bash 进入容器,使用 ls 命令列出的数据里面,中文没有正常显示. 原因 就是对应的 Shell 字符集不正确的问题,调整对应的 ...

  8. 时间同步 ntp服务器

    目录 一. 定义 二. 项目要求 三. 部署服务端 四. 部署客户端 一. 定义 #01 简介:ntp全名 network time protocol .NTP服务器可以为其他主机提供时间校对服务 # ...

  9. iview viewdesign 里面的Select 输入添加 query不能从新为空 @on-create 解决方案 v-if 从新刷一遍

    iview viewdesign 里面的Select 输入添加 query不能从新为空 @on-create 解决方案 v-if 从新刷一遍

  10. python的GUI工具dearpygui入门指南

    一 概念 1.dearpygui 它是一个易于使用的.动态的.GPU加速的.跨平台的.适用于Python的图形用户界面工具包(GUI). 2.特性 GPU 渲染 简单的内置异步功能支持 完整的主题和样 ...