ret2text

上一篇博客是对栈溢出的基本学习,做了几个题练习了一下,师兄给的建议是多用gdb,更直观,动态也可以查看寄存器和栈的变化

一、如何使用gdb

1.peda插件的安装

为了方便查看堆栈和寄存器,最好是安装peda插件,命令如下

sudo apt install gdb    //安装gdb
git clone https://github.com/longld/peda.git ~/peda   //使用git命令从GitHub克隆peda插件到本地
echo "source ~/peda/peda.py" >> ~/.gdbinit   //加入配置文件中,每次启动GDB时都会自动加载peda
cat ~/.gdbinit    //查看是否添加成功

这里我是之前就以及安装好gdb了

克隆

配置

查看配置文件,里面确实存在peda插件

2.gdb简介

GDB(GUN Debugger)是一个用来调试C/C++程序的功能强大的调试器,是Linux系统开发C/C++最常用的调试器

GDB主要功能:

1>设置断点(断点可以是条件表达式)

2>使程序在指定的代码行上暂停执行,便于观察

3>单步执行程序,便于调试

4>查看程序中变量值的变化

5>动态改变程序的执行环境

6>分析崩溃程序产生的core文件

3.常用命令

(gdb)help(h)        # 查看命令帮助,具体命令查询在gdb中输入help + 命令 
(gdb)run(r)         # 重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件)
(gdb)start          # 单步执行,运行程序,停在第一行执行语句 
(gdb)list(l)        # 查看原代码(list-n,从第n行开始查看代码。list+ 函数名:查看具体函数)
(gdb)set            # 设置变量的值
(gdb)next(n)        # 单步调试(逐过程,函数直接执行)
(gdb)step(s)        # 单步调试(逐语句:跳入自定义函数内部执行)
(gdb)backtrace(bt)  # 查看函数的调用的栈帧和层级关系
(gdb)frame(f)       # 切换函数的栈帧
(gdb)info(i)        # 查看函数内部局部变量的数值
(gdb)finish         # 结束当前函数,返回到函数调用点
(gdb)continue(c)    # 继续运行
(gdb)print(p)       # 打印值及地址
(gdb)quit(q)        # 退出gdb
(gdb)break+num(b)                 # 在第num行设置断点
(gdb)info breakpoints             # 查看当前设置的所有断点
(gdb)delete breakpoints num(d)    # 删除第num个断点
(gdb)display                      # 追踪查看具体变量值
(gdb)undisplay                    # 取消追踪观察变量
(gdb)watch                        # 被设置观察点的变量发生修改时,打印显示
(gdb)i watch                      # 显示观察点
(gdb)enable breakpoints           # 启用断点
(gdb)disable breakpoints          # 禁用断点
(gdb)x                            # 查看内存x/20xw 显示20个单元,16进制,4字节每单元
(gdb)run argv[1] argv[2]          # 调试时命令行传参
(gdb)set follow-fork-mode child   # Makefile项目管理:选择跟踪父子进程(fork())

后面那些有括号的是命令的简化版

Linux·gdb用法详解-CSDN博客具体命令可以参考这篇文章,非常详细

4.调试

准备

gcc -g test.c -o test.out     //进行编译
gdb ./test.out     //进行调试

二、ret2text

1.简介

ret2text就是执行程序中已有的代码,例如程序中写有system等系统的调用函数,在这种攻击方法中,攻击者可以控制程序执行若干不相邻的代码段(即gadgets),这就是我们常说的ROP(Return-Oriented Programming)

补充:

ROP主要思想是在栈缓冲区溢出的基础上,利用程序中已有的小片段 (gadgets) 来改变某些寄存器或者变量的值,从而控制程序的执行流程

有以下一些概念:

1.rop:在栈缓冲区溢出的基础上,利用程序中已有的小片段 (gadgets) 来改变某些寄存器或者变量的值,从而控制程序的执行流程。

2.gadgets:在程序中的指令片段,有时我们为了达到我们执行命令的目的,需要多个gadget来完成我们的功能。gadget最后一般都有ret,因为我们需要将程序控制权(EIP)给下一个gadget。即让程序自动持续的选择堆栈中的指令依次执行。

3.ropgadgets:一个pwntools的一个命令行工具,用来具体寻找gadgets的。例如:我们从pop、ret序列当中寻找其中的eax
ROPgadget --binary ./7.exe --only "pop|ret" | grep "eax"

4、在linux系统中,函数的调用是有一个系统调用号的。例如execve("/bin/sh",null,null)函数其系统调用号是11,即十六进制0xb。

2.攻击原理

通过篡改栈帧上的返回地址为程序中已有的后门函数。攻击者需要知道对应返回代码的位置,并构造合适的payload来触发栈溢出,从而改变返回地址,执行后门函数‌。

3.主要过程

确定溢出点‌:首先要找到程序中的溢出点,通常是通过分析程序的反汇编代码来定位。常见的溢出点包括gets(buf)、strcpy(dest,sec)、scanf("%s",buf)、strcat(buf,buf2) 、read(0,buf,size)等函数调用‌。

‌构造ROP链‌:一旦找到溢出点,攻击者需要构造一个ROP链。ROP链是由一系列的“gadgets”组成,这些gadgets是程序中已有的、以ret指令结尾的指令序列。攻击者通过这些gadgets来控制程序的执行流程‌。

‌覆盖返回地址‌:在构造好ROP链后,攻击者会通过溢出覆盖函数的返回地址,使其指向ROP链的起始地址。这样,当函数执行完毕后,控制流会跳转到ROP链,执行攻击者控制的代码‌。

‌执行特定代码‌:ROP链的最终目的是执行特定的代码。在ret2text攻击中,攻击者通常会选择执行程序已有的代码段(.text段)中的函数或代码片段。例如,如果攻击者想要执行system("/bin/sh"),他们会在ROP链中插入相应的gadgets来调用system函数‌。

‌绕过安全机制‌:在某些情况下,程序可能启用了如PIE(位置无关执行)和Canary(栈保护)等安全机制。攻击者需要通过格式化字符串漏洞等技巧来泄露栈上的信息,从而绕过这些安全机制‌。

三、练习

云曦24秋季学期期末考-pwn-真正的签到题

先检查一下文件,发现没有缓冲区溢出

nc连接看看

发现不行

用ida打开附件,可以看到有个give_flag

在下面的start_shell中得知输入69470可执行give_flag

得到flag

NSSCTF-pwn-[SWPUCTF 2021 新生赛]gift_pwn

例行发现可能存在栈溢出

用ida打开,在gift函数中发现存在后门

查看main函数,这个是程序的入口,从这里可以看程序的执行流程,会发现执行了vlun函数

查看vuln,看图会发现read读取64个字节,超过了栈的大小

双击buf,查看一下栈内,0x10就是数组的大小,然后后面就是保存的rbp(32位是ebp)以及返回地址。s是存储的rbp,代表这个函数结束以后rbp要被修改为什么。r是返回地址,代表这个函数结束以后程序会跳转到哪个地址继续执行,大多数情况下都是利用这个返回地址来进行操作。

栈的生长方向是由高地址往低地址增长的,可以看到左边是变量所在的相对位置,以s为基准。在read读入字符的时候,第一个字符会被放在相对地址是0x10的位置,第二个字符会被放在0x0F的位置,当读入的字符超过了buf的长度,那么会接着向下(高地址)存放,这个时候就会覆盖掉原来保存在高地址的s和r,以让程序跳转到不同的地方。

read函数可以读入0x64个字符,而buf的长度为16,s为8,r为8,可以修改s和r,(在32位程序中s和r为4,64位程序中s和r为8,一个字符长度是一个字节,一个字节的长度是8位(即长度为8的二进制数),32/8 = 4,64/8 = 8)

目的是为了跳转到gift函数处,那么r是返回地址,也就是说要让r的地址成为gift起始地址

找到gift函数地址

然后构造payload

payload = b'a' * 16 + b'a' * 8

payload += p64(0x4005B6)

接下来写exp

from pwn import *

p = remote("node4.anna.nssctf.cn",28035)
payload = b'a' * 16 + b'a' * 8
payload += p64(0x4005B6)
p.send(payload)
p.interactive()

得到flag

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

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

相关文章

Ubuntu安装Gitlab详细图文教程

1、环境准备 1.1、Ubuntu环境 Ubuntu24.04Sever版安装教程 1.2、更新系统 sudo apt update -y sudo apt-get update sudo apt-get upgrade 2、安装Nginx 2.1 安装nginx # 安装 apt install nginx -y 2.2 修改nginx配置⽂件 # 修改nginx配置 vim /etc/nginx/si…

计算机网络之王道考研读书笔记-1

第 1 章 计算机网络体系结构 1.1 计算机网络概述 1.1.1 计算机网络概念 internet(互连网):泛指由多个计算机网络互连而成的计算机网络。这些网络之间可使用任意通信协议。 Internet(互联网或因特网):指当前全球最大的、开放的、由众多网络和路由器互连…

交互妙方Ethercat转Profinet网关连接雷赛伺服驱动器

客户需求:将雷赛DM3E伺服驱动器接入西门子系列PLC,该PLC使用Profinet协议通讯,而伺服驱动器为EthereCAT协议,故使用开疆智能EtherCAT转Profinet网关进行数据转换。 配置过程: 1:首先找到伺服驱动器的官网下…

TDengine 新功能 从 CSV 批量创建子表

1. 背景 我们在从一些数据源(比如关系型数据库)批量导入数据前,我们可能需批量创建出所需子表。TDengine 引擎从 v3.3.3.0 版本开始,提供了通过 CSV 文件批量创建子表的功能,使用者只要按约定的格式生成 CSV 文件&…

帮忙摆脱焦虑的「自洽」逻辑

每个人都像是一座孤岛,承载着各自的梦想、恐惧与困惑。外界的解读、评判和定义有时如同环岛的潮水,时而温柔轻拂,时而猛烈拍打,让人在自我认知中漂泊不定。 当置于艰难处境,被焦虑、抑郁等负面情绪不断吞噬&#xff0c…

二叉搜索树 平衡树(c嘎嘎版)

定义: 二叉搜索树是一种二叉树的树形数据结构,其定义如下: 空树是二叉搜索树。 若二叉搜索树的左子树不为空,则其左子树上所有点的附加权值均小于其根节点的值。 若二叉搜索树的右子树不为空,则其右子树上所有点的附加权值均大于其根节点的值。 二叉搜索树的左右子树均为…

旅游系统旅游小程序PHP+Uniapp

旅游门票预订系统,支持景点门票、导游产品便捷预订、美食打卡、景点分享、旅游笔记分享等综合系统 更新日志 V1.3.0 1、修复富文本标签 2、新增景点入驻【高级版本】3、新增门票核销【高级版】4、新增门票端口【高级版】

使用winscp从windows访问Ubuntu进行文件传输

Ubuntu 系统上的准备工作 • 安装 SSH 服务器: 确保 Ubuntu 系统上已经安装了 SSH 服务器。如果没有安装,可以使用以下命令安装: sudo apt update sudo apt install openssh-server • 启动 SSH 服务: 确保 SSH 服务正在运行&a…

Day10 苍穹外卖项目 订单搜索、各个状态的订单统计、查询订单详细、接单、拒单、取消订单、派送订单、完成订单

目录 1.订单搜索 1.1 需求分析和设计 1.2 接口设计 1.2 代码实现 1.2.1 admin/OrderController 1.2.2 OrderService 1.2.3 OrderServiceImpl 2.各个状态的订单数量统计 2.1 需求分析和设计 2.2 接口设计 2.3 代码实现 2.3.1 admin/OrderController 2.3.2 OrderService 2.3.3 Or…

智慧商城:登录页静态布局,axios请求数据切换图形验证

登录页静态布局 在src目录下新建 styles,主要用于 存放公共样式。在该文件夹下新建common.less文件,并将其在main.js中引入 将图片拷贝到src文件夹下的 assets文件夹下 完成静态布局 点击左箭头能返回到首页 所有组件头部返回左箭头颜色都是一样的&#…

uni-app开发AI康复锻炼小程序,帮助肢体受伤患者康复!

**提要:**近段时间我们收到多个康复机构用户,咨询AI运动识别插件是否可以应用于肢力运动受限患者的康复锻炼中来,插件是可以应用到AI康复锻炼中的,今天小编就为您介绍一下AI运动识别插件在康腹锻炼中的应用场景。 一、康复机构的应…

怎样设计校园物联网智慧用电平台?

安科瑞戴婷 Acrel-Fanny 相关背景 安全用电历来都是学校安全工作的一个重点,然而每年因此发生的人身伤害以及火灾事故却在继续着,究其原因,主观上是我们的防患意识淡薄,客观上则是由于学生在宿舍使用违规电器、乱拉电线造成的。…

STM32F405 + CubeMX - 产生互补PWM波,中心对齐模式1 + PWM模式2(FOC算法专用)

导言 在FOC算法里,SVPWM用于产生三相PWM波给电机。为了生成SVPWM波形,STM32的高级定时器TIM使用互补PWM的中心对齐模式1可以很好地实现。 如上图所示,按照后面的笔记来配置TIM1后,可以产生的互补PWM波形。 我们期望的SVPWM&…

【Excel】单元格分列

目录 分列(新手友好) 1. 选中需要分列的单元格后,选择 【数据】选项卡下的【分列】功能。 2. 按照分列向导提示选择适合的分列方式。 3. 分好就是这个样子 智能分列(进阶) 高级分列 Tips: 新手推荐基…

助力 Tuanjie OpenHarmony 开发:如何使用工具包 Hilog 和 SDK Kits Package?

随着团结引擎从 1.0.0 迭代至 1.3.0,越来越多的开发者开始使用团结引擎开发 OpenHarmony 应用。 在开发的过程中,我们也收到了大量反馈,尤其是在日志、堆栈和性能数据方面,这些信息对开发和调试过程至关重要。同时,我…

穷举vs暴搜vs深搜vs回溯vs剪枝系列一>找出所有子集的异或总和再求和

题目&#xff1a; 解析&#xff1a; 代码&#xff1a; private int ret;//返回周结果private int path;//枚举一个元素就异或进去public int subsetXORSum(int[] nums) {dfs(nums, 0);return ret;} private void dfs(int[] nums, int pos){ret path;for(int i pos; i <…

详解排序几大算法

一、插入排序 基本思想&#xff1a; 直接插入排序是一种简单的插入排序算法&#xff0c;其基本思想是&#xff1a;把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列。 步骤&#x…

ARMS 用户体验监控正式发布原生鸿蒙应用 SDK

作者&#xff1a;杨兰馨&#xff08;楠瑆&#xff09; 背景 2024 年 10 月 22 日&#xff0c;华为正式发布了原生鸿蒙操作系统&#xff08;HarmonyOS NEXT&#xff09;。原生鸿蒙实现了系统底座全部自研&#xff0c;系统的流畅度、性能、安全特性等方面显著提升&#xff0c;也…

嵌入式驱动开发详解17(CAN驱动开发)

文章目录 前言CAN简介CAN收发器CAN协议讲解电气特性传输协议数据帧遥控帧错误帧过载帧帧间隔 同步矫正 CAN控制器CAN控制器模式CAN接收器CAN波特率 CAN设备树分析CAN测试后续参考文献 前言 该专栏主要是讲解嵌入式相关的驱动开发&#xff0c;但是由于部分模块的驱动框架过于复…

计算机游戏运行时常见问题解析:d3dx9_43.dll丢失的真相与修复指南

游戏运行时d3dx9_43.dll缺失问题全解析 在计算机游戏的探险之旅中&#xff0c;d3dx9_43.dll文件缺失常成为玩家的绊脚石。此DLL文件是DirectX 9的关键组件&#xff0c;对图形渲染至关重要。以下&#xff0c;我们将深入剖析其丢失原因&#xff0c;并提供精简有效的修复策略。 …