在一个简单的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常见问题-多线程
现在有 T1.T2.T3 三个线程,你怎样保证 T2 在 T1 执行完后执行,T3 在 T2 执行完后执行? 这个多线程问题比较简单,可以用 join 方法实现. 在 Java 中 Lock 接口比 ...
- 如何去除字符串中的 "\n" ?80% 的同学错了!
大家好,我是鱼皮,今天分享一个小知识. 我最近负责的工作是设计一个 SQL 解析引擎.简单来说,就是将一个 SQL 表达式字符串,解析为一颗对象树,从而执行查询等一系列操作. 在最开始,我就遇到了一个 ...
- TIER 0: Redeemer
TIER 0: Redeemer Redis Remote Dictionary Server 是一个开源的内存数据存储系统 Redis 是完全基于 内存,"内存"数据库的数据检索 ...
- Python版WGCNA分析和蛋白质相互作用PPI分析教程
在前面的教程中,我们介绍了使用omicverse完成基本的RNA-seq的分析流程,在本节教程中,我们将介绍如何使用omicverse完成加权基因共表达网络分析WGCNA以及蛋白质相互作用PPI分析. ...
- 如何免费提取PDF里的图片-pdfimages使用教程
写在前面 本随笔是非常菜的菜鸡写的.如有问题请及时提出. 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 动机 ...
- 「模拟赛」暑期集训CSP提高模拟4(7.21)
很祭的一次比赛,啥也不会. 题目列表: A.White and Black B.White and White C.Black and Black D.Black and White A.White ...
- Jmeter函数助手11-BeanShell
BeanShell函数用于简单的计算或者运行编程脚本. 表达式求值:填入脚本代码或脚本文件${__BeanShell(source("test.bsh"))} 存储结果的变量名(可 ...
- Vue打包部署到CentOS 7
项目打包 在项目目录下执行打包目录进行打包 yarn build // 或者 npm run build 打包完成后会生成一个dist文件夹,这样就打包完成了(我这样做了SEO的,所有目录结构有点不一 ...
- 【Java】将枚举类转换为Redis字典缓存
字典翻译框架实现看这篇: https://www.cnblogs.com/mindzone/p/16890632.html 枚举的特性 首先是枚举的一些特性: 1.枚举实例直接在枚举类中声明 2.重载 ...
- 【Hessian】轻量级分布式通信组件
参考自简书 https://www.jianshu.com/p/9136aa36cffb 案例场景为单向通信 A 和 B两个应用服务, B需要调用A的接口完成业务需求 那么A服务角色就是服务端,提供给 ...