在一个简单的pwn题目中探究执行系统调用前堆栈的对齐问题
题目介绍:在输入AAAAAAAAAAAAAAAAAAAAAAAAA后,程序会打开一个shell,这是为什么?字符串中的A能否更换为@?
1.程序接收输入AAAAAAAAAAAAAAAAAAAAAAAAA 获得shell的原理:
.text:0000000140001584 public vuln
.text:0000000140001584 vuln proc near ; CODE XREF: main+D↑p
.text:0000000140001584 ; DATA XREF: .pdata:000000014000F078↓o ...
.text:0000000140001584
.text:0000000140001584 DstBuf = byte ptr -10h
.text:0000000140001584
.text:0000000140001584 push rbp
.text:0000000140001585 mov rbp, rsp
.text:0000000140001588 sub rsp, 30h
.text:000000014000158C lea rax, [rbp+DstBuf]
.text:0000000140001590 mov r8d, 19h ; MaxCharCount
.text:0000000140001596 mov rdx, rax ; DstBuf
.text:0000000140001599 mov ecx, 0 ; FileHandle
.text:000000014000159E call read
.text:00000001400015A3 nop
.text:00000001400015A4 add rsp, 30h
.text:00000001400015A8 pop rbp
.text:00000001400015A9 retn
.text:00000001400015A9 vuln endp
可以看到写入的目标地址为rbp-10h处,read读入的字节数为19h,可以猜到read的输入覆盖了目标地址的16字节后,又覆盖了rbp的8字节,最后覆盖了地址的最低地址字节,由于此处地址是小端序,覆盖了地址的最低位,不难猜到,返回地址被修改到了原返回地址的附近的代码中,且根据输入AAAAAAAAAAAAAAAAAAAAAAAAA 和调用此函数的main函数代码对应的地址,可以推出地址被修改为0x0000000140001541附近的代码。
.text:0000000140001540 public backd00r
.text:0000000140001540 backd00r proc near ; DATA XREF: .pdata:000000014000F06C↓o
.text:0000000140001540 push rbp
.text:0000000140001541 mov rbp, rsp
.text:0000000140001544 sub rsp, 20h
.text:0000000140001548 lea rcx, Buffer ; "getshell"
.text:000000014000154F call puts
.text:0000000140001554 lea rcx, Command ; "C:\\Windows\\system32\\cmd.exe"
.text:000000014000155B call system
.text:0000000140001560 nop
.text:0000000140001561 add rsp, 20h
.text:0000000140001565 pop rbp
.text:0000000140001566 retn
.text:0000000140001566 backd00r endp
可以看到,该地址确实在一个名为backd00r的函数中,该函数执行系统调用获取了shell。
2.程序接收的输入中A能否更换为@
A对应ascii码为41,而@对应ascii码为40,更换后,ret指令将跳到0x0000000140001540处,多压栈了一次rbp,感觉上是可行的,因为即使堆栈不平衡应该也不会影响当前函数的调用,事实上前面的puts函数也确实能正常执行输出getshell字符串。但system却不能正常执行,使用xdbg动态调试,可以看到是在地址为0x7FFA3A437F64的语句:movaps xmmword ptr ss:[rsp+40],xmm6 处报访存异常。但不从push rbp开始时却没有这个问题。从这条语句开始分析,这条语句的意思是将xmm6浮点数寄存器保存的16字节内容存入栈中的地址,这时就不难想到是否是因为没有对齐的原因,查看此时栈中的地址,最低的16进制数不为0,确实没有对齐。

为了验证猜想,使用IDA将back00r函数修改如下,连续压入两个rbp,此时应该能对齐,此时用@代替A,确实能执行成功。
.text:0000000140001540
.text:0000000140001540 public backd00r
.text:0000000140001540 backd00r: ; DATA XREF: .pdata:000000014000F06C↓o
.text:0000000140001540 push rbp
.text:0000000140001541 push rbp
.text:0000000140001542 nop
.text:0000000140001543 nop
.text:0000000140001544 sub rsp, 20h
.text:0000000140001548 lea rcx, Buffer ; "getshell"
.text:000000014000154F call puts
.text:0000000140001554 lea rcx, Command ; "C:\\Windows\\system32\\cmd.exe"
.text:000000014000155B call system
.text:0000000140001560 nop
.text:0000000140001561 add rsp, 20h
.text:0000000140001565 pop rsi
.text:0000000140001566 retn
因此,使用@在此处不能代替A,虽然在执行系统调用时不会因为堆栈未平衡报错,但会在内核中一个mov语句拷贝16字节数据时因为地址未对齐而产生访存异常。
在一个简单的pwn题目中探究执行系统调用前堆栈的对齐问题的更多相关文章
- vue.js+webpack在一个简单实例中的使用过程demo
这里主要记录vue.js+webpack在一个简单实例中的使用过程 说明:本次搭建基于Win 7平台 Node.js 安装官网提供了支持多种平台的的LTS版本下载,我们根据需要来进行下载安装.对于Wi ...
- ASP.NET Core中的缓存[1]:如何在一个ASP.NET Core应用中使用缓存
.NET Core针对缓存提供了很好的支持 ,我们不仅可以选择将数据缓存在应用进程自身的内存中,还可以采用分布式的形式将缓存数据存储在一个“中心数据库”中.对于分布式缓存,.NET Core提供了针对 ...
- SCTF 2014 pwn题目分析
因为最近要去做ctf比赛的这一块所以就针对性的分析一下近些年的各大比赛的PWN题目.主防项目目前先搁置起来了,等比赛打完再去搞吧. 这次分析的是去年的SCTF的赛题,是我的学长们出的题,个人感觉还是很 ...
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...
- 谈一谈SQL Server中的执行计划缓存(下)
简介 在上篇文章中我们谈到了查询优化器和执行计划缓存的关系,以及其二者之间的冲突.本篇文章中,我们会主要阐述执行计划缓存常见的问题以及一些解决办法. 将执行缓存考虑在内时的流程 上篇文章中提到了查询优 ...
- 谈一谈SQL Server中的执行计划缓存(上)
简介 我们平时所写的SQL语句本质只是获取数据的逻辑,而不是获取数据的物理路径.当我们写的SQL语句传到SQL Server的时候,查询分析器会将语句依次进行解析(Parse).绑定(Bind).查询 ...
- OJ提交题目中的语言选项里G++与C++的区别(转)
G++? 首先更正一个概念,C++是一门计算机编程语言,G++不是语言,是一款编译器中编译C++程序的命令而已. 那么他们之间的区别是什么? 在提交题目中的语言选项里,G++和C++都代表编译的方式. ...
- [转]js中confirm实现执行操作前弹出确认框的方法
原文地址:http://www.jb51.net/article/56986.htm 本文实例讲述了js中confirm实现执行操作前弹出确认框的方法.分享给大家供大家参考.具体实现方法如下: 现在在 ...
- 进阶学习js中的执行上下文
在js中的执行上下文,菜鸟入门基础 这篇文章中我们简单的讲解了js中的上下文,今天我们就更进一步的讲解js中的执行上下文. 1.当遇到变量名和函数名相同的问题. var a = 10; functio ...
- SQL*PLUS中批量执行SQL语句
SQL*PLUS中批量执行SQL语句 今天由于工作的需要,要在CMD中批量执行大量的SQL语句,对于Oracle学习还处在入门阶段的我,只能硬着头皮到处去寻找资料(主要是网络资料,也包括自己的电子书) ...
随机推荐
- Java 、C# Excel模板,数据一对多,主从表关系,导入到数据库
思路 单表导入的比较容易,但是有的时候,可能会出现,一对多数据导入的,这个情况怎么办呢?先理解上面的图,后台获取数据的时候,除了"风险防控措施"外,其他字段先分组,"黄色 ...
- 新版SpringBoot-Spring-Mybatis 数据库相关配置
application.properties server.port=8081 # ========================数据库相关配置===================== sprin ...
- SafeLine Web 安全网关保护你的网站不受黑客攻击
SafeLine 简介 今天,推荐给大家的是一款在社区广受好评的网站防护工具 -- SafeLine Web 安全网关. 简单来说这是一个自带安全 buf 的 Nginx,它基于业界领先的语义分析检测 ...
- [oeasy]python0132_[专业选修]utf-8_unicode_transformation_format_8_编码方式
utf-8 回忆上次内容 上次再次输出了大红心<span style="color:red"></span> 找到了红心对应的编码 黑红梅方都对应有编码 ...
- 吐血整理如何在Google Earth Engine上写循环 五个代码实例详细拆解
在这里同步一篇本人的原创文章.原文发布于2023年发布在知乎专栏,转移过来时略有修改.全文共计3万余字,希望帮助到GEE小白快速进阶. 引言 这篇文章主要解答GEE中.map()和.iterate() ...
- Vue 新增不参与打包的接口地址配置文件
Vue 新增不参与打包的接口地址配置文件 by:授客 QQ:1033553122 开发环境 Win 10 Vue 2.5.2 问题描述 vue工程项目,npm run build we ...
- Mysql函数1-IFNULL
IFNULL函数用于判断参数值是null时则返回指定内容. 原本 select goods_base_name,goods_id from goods where goods_id in (6,7,8 ...
- 测试环境配置https+端口访问留存
步骤1:阿里云DNS配置本地公网IP解析 步骤2:本地局域网192.168.1.10服务器配置nginx server { listen 8090 ssl; server_name localhost ...
- 什么是web3 为什么web3很重要
中心化网络已经帮助数十亿人融入了互联网,并在其上创建了稳定.可靠的基础设施. 与此同时,少数中心化巨头几乎垄断了互联网,甚至可以为所欲为. Web3 是摆脱这一困境的方案. 不同于科技巨头垄断的传统互 ...
- 2、Git之Windows版本的安装
2.1.下载Git 官网下载地址:https://git-scm.com/download/ 最初,Git 是用于管理 Linux 社区的代码,所以在很长的一段时间内,Git 只能安装在 Linux ...