【PWN】学习笔记(二)【栈溢出基础】
课程教学
课程链接:https://www.bilibili.com/video/BV1854y1y7Ro/?vd_source=7b06bd7a9dd90c45c5c9c44d12e7b4e6
 课程附件: https://pan.baidu.com/s/1vRCd4bMkqnqqY1nT2uhSYw 提取码: 5rx6
C语言函数调用栈

 一个栈帧保存的是一个函数的状态信息,父函数每调用一个子函数就会在函数调用栈中新增一个栈帧;
 32 x86 esp
 64 x86 rsp
 
 ebp 栈底
 esp 栈顶
 stack frame pointer记录上一个父函数的栈顶指针的值,便于恢复父函数;
 发生栈溢出的地方在local variables【上图是32位情况】
 上图是32位情况,在32位传参时,子函数所用到的参数保存在父函数栈帧的末尾(并不是保存在自己的栈帧中),这里的arguments是子函数所用到的形参
 父函数最末尾的字长保存父函数自己栈顶的值,如上面红色的箭头指向previous stack frame pointer,同理父函数的父函数也是一样的
 
 
 
父函数(main)先把所要调用的子函数(sum)中的参数(1,2)逆序压栈(压入自己的栈帧),此后压入return address【即子函数下一条指令的地址(return 0 的地址)】,在子函数执行后回到下一条指令的地址(执行return 0);在子函数结束后要返回父函数的栈帧,这意味在调用子函数时不能把父函数的栈帧丢弃,由此需要加入父函数的栈底指针加入
 

 
 丢弃某块数据不用,并不需要把这块数据抹除,只需要标记成不是我所使用的范围即可;这也是磁盘数据恢复的原理,除非有新来的数据复写
 
 
 
 主调函数 caller
 被调函数 callee
 
 遵循C语言函数调用规范,一般在开头用push ebp以及mov ebp, esp,需要保存父函数栈底的状态;结束会执行leave(恢复父函数的栈底)以及 ret(返回到父函数的下一条指令)
首先,主调函数也是有自己的父函数,将它的父函数的ebp压入
 
 接着把esp抬高到和ebp相同的位置
 
 下一条指令为新的栈帧开辟局部变量的空间;这里是sub 0x10 , esp,即esp-16;为什么是减去?因为栈是反向增长(高到低)
 
 将被调函数所用到的参数(1,2,3)反向压入栈,即先压入3,再压入2,最后压入1;
 
 call 这条指令不等于jump,jump是一个跳转指令;call 不仅会将eip移动到目标代码的位置,还会在栈中自动保存下一条指令的地址【此时的return address就是23的位置】
 
 此时进入被调函数,同理首先是push ebp和mov sep , ebp;先把主调函数的栈帧保存;注意此时父函数的ebp重新增加到栈里了,将esp的值赋给ebp;让ebp抬高到新的栈帧的栈顶
 
 执行实际操作,最后的运算结果保存在eax的寄存器中【默认情况下保存函数的返回值】
 
 由于esp并没有开辟局部变量的空间;为什么不是leave?leave就是 mov ebp,esp再pop ebp,这里只有pop ebp是因为子函数没有任何局部变量,所以ebp在调用返回时已经在相应的位置了;pop这条指令总是把esp当前指向的位置,对应的一个字长的数据抬入到目标位置;所以pop ebp就会把esp向上抬一个字长,把esp本来指向父函数的值抬入ebp中;
 
 ret 相当于pop eip,eip回到父函数的位置

 主调函数情况其局部变量以及被调函数的相关参数
 
 使用add这条指令清空数据;最后保存结果到eax中
 
 值得注意的是,此时返回时esp和ebp并不在相同位置,所以需要leave,首先将esp的值变成ebp
 
 返回父函数的父函数
 
 以上过程需要非常熟练;栈还有很多其他工作的规则,以上是最基本的
ret2text

 关注eip寄存器,其中return address存在eip中;当eip中写入我们目标代码的地址,程序的控制流便被劫持了
 
 栈溢出是缓冲区溢出的一种
 
 
 向局部变量(str[8])中写入24字节数据,溢出到了关键结构
 
 
 
 当我们拿到一个CTF PWN的题先通过checksec 看这个程序有什么保护措施
 【x86架构小端序的可执行ELF】
 
 通过IDA看c语言代码
 
 显然漏洞明显,读入的数据长度不受限向上溢出
 值得注意的是,此时虽然开辟了8字节,但是与ebp的距离是16字节(10h)
 最好的方法还是动态调试,因为出题人可能以esp来寻址
 
 通过gdb动态调试,直接run是没什么意义的,先打断点,例如b main【b 表示 break】,再r【r 表示run】;此时我们可以看到具体的信息
 
 在程序执行到绿色箭头位置时,所有寄存器的值;
 eip此时main函数偏移26字节的指令,当前指针也是0x804856b
 esp和ebp此时对应的值是一个很大的值,这是栈的地址(用户空间的最高地址)
 
 这是反汇编窗口
 
 最上面的00:0000是栈顶(低地址),最下面的07:001c是栈底(高地址);gdb是反着显示的
 
 函数调用栈的关系
 
 按n一直步过到漏洞位置
 
 按s步进入这个函数
 
 按n开始输入,按照正常输入8个A看什么情况
 
 这里我们看栈里面的情况,输入stack 看多少项(24项栈值)
 esp和ebp之间就是当前执行的函数的栈帧,esp表示栈顶,ebp是栈底
 ebp是前一个函数被保存在栈里的ebp的值,ebp再往高一个字长就是返回地址,我们的目标就是攻击这个返回地址
 我们此时可控制的区域是esp和ebp之间的位置,即buffer这个变量
 
 这意味着只要我们一直写,覆盖返回地址即可达到攻击效果
 
 回到IDA我们可找到这个后门函数,执行系统命令,直接获得shell的控制权,相当于在shell中打开shell
 这意味着我们先写20个字节A(ebp还有4个字节),再写4个字节制定的地址就会把原本的地址覆盖掉
 
 我们要找到getshell的开始地址,通过双击IDA中getshell在汇编代码中找到起始地址8048522
 
 我们这里就可以写脚本来获得shell了,值得注意的是payload中不能直接加0x8048522【前面是字符串这里是整型】,所以需要p32来转换
 最终发送payload并且与之交互io.interactive(),即可获得shell
 打远程只要用remote即可
但是实际情况下不一定有后门函数
 
 一般系统调用这样的代码需要我们自己输入
 
 只要不是代码的地方都不可执行
 
 随机化栈中的地址
 
 所以放在Bss中居多,Bss用于存放全局变量的,如果这个全局变量是开辟缓存区可以输入系统调用即可
 
 比如上面这个情况
 
 利用工具直接生成shellcode的机械码,再io.send直接发送
PWN工具

 IDA pro
 f5 进入c程序
 esc 返回上一个程序
 
 白色的函数为已写死的函数
 粉色的函数要用的时候再去调
 
 在Options的General中可调整一些设置,例如加入机械码
 
 
 这样C语言代码被拷贝到汇编代码中
 
 shift+f12 或者 shift+fn+f12打开一个字符串界面【在不知道mian函数位置,可通过程序所表示的字符串找程序的主函数】
 
 
 \r把之前的文本在显示时清空,io.recv()把所有的数据完全还原【这里我用的时io.recvline()一行一行接收】
 这里的ZmxhZ3tuMHRfZjRzdGVyX3Q2YW5feTB1fQo=显然是Base64,我们需要解码

 将其解码
相关文章:
【PWN】学习笔记(二)【栈溢出基础】
课程教学 课程链接:https://www.bilibili.com/video/BV1854y1y7Ro/?vd_source7b06bd7a9dd90c45c5c9c44d12e7b4e6 课程附件: https://pan.baidu.com/s/1vRCd4bMkqnqqY1nT2uhSYw 提取码: 5rx6 C语言函数调用栈 一个栈帧保存的是一个函数的状态信息&…...
02-Nacos和Eureka的区别与联系
Nacos和Eureka的区别 联系 Nacos和Eureka整体结构类似: 都支持服务注册, 服务拉取, 采用心跳方式对服务提供者做健康监测的功能 区别 Nacos支持服务端主动检测服务提供者状态: 临时实例采用心跳模式,非临时实例采用主动检测模式但对服务器压力比较大(不推荐) 心跳模式: 服务…...
常见的Linux系统版本
在介绍常见的Linux系统版本之前,首先需要区分Linux系统内核与Linux发行套件系统的不同。Linux系统内核指的是一个由Linus Torvalds负责维护,提供硬件抽象层、硬盘及文件系统控制及多任务功能的系统核心程序。而Linux发行套件系统是我们常说的Linux操作系…...
基于JavaWeb+SSM+Vue微信小程序的科创微应用平台系统的设计和实现
基于JavaWebSSMVue微信小程序的科创微应用平台系统的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 Lun文目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相关技术…...
【Spring Boot 源码学习】ApplicationListener 详解
Spring Boot 源码学习系列 ApplicationListener 详解 引言往期内容主要内容1. 初识 ApplicationListener2. 加载 ApplicationListener3. 响应应用程序事件 总结 引言 书接前文《初识 SpringApplication》,我们从 Spring Boot 的启动类 SpringApplication 上入手&am…...
HCIP---RSTP/MSTP
文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 STP协议虽然能够解决环路问题,但是收敛速度慢,影响了用户通信质量。IEEE于2001年发布的802.1w标准定义了快速生成树协议RSTP(Rapid Spanning-Tree Proto…...
探索开源游戏的乐趣与无限可能 | 开源专题 No.47
CleverRaven/Cataclysm-DDA Stars: 9.0k License: NOASSERTION Cataclysm:Dark Days Ahead 是一个回合制的生存游戏,设定在一个后启示录世界中。尽管有些人将其描述为 “僵尸游戏”,但 Cataclysm 远不止于此。在这个残酷、持久、程序生成的世…...
springboot_3.2_freemark_基础环境配置
springboot_3.2_freemark_基础环境配置 一、前言二、环境三、相关资料四、目标五、默认配置项六、构建springboot 3.2项目6.1 pom.xml 内容:6.2 启动类6.3 添加ftlh模板6.4 controller内容6.5 bootstrap.yml配置 七、总结 一、前言 FreeMarker 是一款模板引擎&…...
【MySQL】MySQL 在 Centos 7环境安装教程
文章目录 1.卸载不要的环境2.检查系统安装包3.获取mysql官方yum源4.安装mysql yum 源,对比前后yum源5.安装mysql服务6.查看配置文件和数据存储位置7.启动服务和查看启动服务8.登录9.配置my.cnf 1.卸载不要的环境 先检查是否有mariadb存在 ps ajx |grep mariadb如果…...
有病但合理的 ChatGPT 提示语
ChatGPT 面世一年多了,如何让大模型输出高质量内容,让提示词工程成了一门重要的学科。以下是一些有病但合理的提示词技巧,大部分经过论文证明,有效提高 ChatGPT 输出质量: 1️⃣ Take a deep breath. 深呼吸 ✨ 作用…...
this.$emit(‘update:isVisible‘, false)作用
这个写是不是很新颖,传父组件传值!这是什么鬼。。。 假设你有以下逻辑业务。在A页面弹出一个组件B,A组件里面使用B组件,是否展示B组件你使用的是baselineShow变量控制! <BaselineData :isVisible.sync"basel…...
CnetSDK .NET OCR Library SDK Crack
CnetSDK .NET OCR Library SDK Crack CnetSDK .NET OCR Library SDK 是一款高精度 .NET OCR 扫描仪软件,用于从图像中识别字符,如文本、手写和符号。该.NET OCR库软件采用Tesseract OCR引擎技术,将字符识别准确率提高高达99%。通过将 .NET OC…...
基于Solr的全文检索系统的实现与应用
文章目录 一、概念1、什么是Solr2、与Lucene的比较区别1)Lucene2)Solr 二、Solr的安装与配置1、Solr的下载2、Solr的文件夹结构3、运行环境4、Solr整合tomcat1)Solr Home与SolrCore2)整合步骤 5、Solr管理后台1)Dashbo…...
【rabbitMQ】rabbitMQ控制台模拟收发消息
目录 1.新建队列 2.交换机绑定队列 3.查看消息是否到达队列 总结: 1.新建队列 2.交换机绑定队列 点击amq.fonout 3.查看消息是否到达队列 总结: 生产者(publisher)发送消息,先到达交换机,再到队列&…...
Java NIO, IO 整理
NIO: IO多路复用: 参考: Redis(六)单线程I/O多路复用模型浅析_单线程多路复用-CSDN博客 Java NIO 详解_java nio详解_开发菜鸡的博客-CSDN博客 Java Socket 之 NIO - 掘金 答应我,这次搞懂 I/O 多路复用!_小林coding的博客-CS…...
【数据结构】——排序篇(下)
前言:前面我们的排序已经详细的讲解了一系列的方法,那么我们现在久之后一个归并排序了,所以我们现在就来讲解一下归并排序。 归并排序: 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法…...
C++ 模拟实现vector
目录 一、定义 二、模拟实现 1、无参初始化 2、size&capacity 3、reserve 4、push_back 5、迭代器 6、empty 7、pop_back 8、operator[ ] 9、resize 10、insert 迭代器失效问题 11、erase 12、带参初始化 13、迭代器初始化 14、析构函数 完整版代码 一、…...
基于hadoop下的spark安装
目录 简介 安装准备 spark安装 配置文件配置 简介 Spark主要⽤于⼤数据的并⾏计算,⽽Hadoop在企业主要⽤于⼤数据的存储(⽐如HDFS、Hive和HBase 等),以及资源调度(Yarn)。但是也有很多公司也在使⽤MR2进…...
面试经典150题(10-13)
leetcode 150道题 计划花两个月时候刷完,今天(第四天)完成了4道(10-13)150: 10. (45. 跳跃游戏 II)题目描述: 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[…...
Sql server数据库数据查询
请查询学生信息表的所有记录。 答:查询所需的代码如下: USE 学生管理数据库 GO SELECT * FROM 学生信息表 执行结果如下: 查询学生的学号、姓名和性别。 答:查询所需的代码如下: USE 学生管理数据库 GO SELE…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
