supermarket(xctf)

本文详细分析了一个程序的保护措施和执行流程,重点讲解了如何利用Use After Free (UAF) 漏洞,通过改变描述符大小配合特定函数实现任意地址的读写。首先确定libc版本并利用输出函数泄露函数地址,然后通过精心操作堆块,最终达到控制程序执行的目的。
摘要由CSDN通过智能技术生成

0x0 程序保护和流程

保护:

protect

流程:

main()

main

real_main()

real_main

add()

add

依次输入aaaa,100,0x50,aaaa后的会分配两个堆块。

heap_overview

heap_data

heap_pointer的情况。

heap_pointer

del()根据输入的名字free掉相应的堆块,list()输出所有的信息,change_price()可以修改价格。

change_descrip()

change_descrip

在这个函数中,如果输入的size和原来的不一样的话就会调用realloc函数重新分配堆块。如果size比原来大则会free掉原来的堆块,并且重新分配一个堆块,但是程序并没有对指针信息进行修改,形成了一个UAF。

0x1 利用过程

1.由于题目给出了libc,首先需要确定libc的版本。

libc_version

确定libc版本后选择ubuntu16.04作为复现的系统。

ldd

2.要想泄露函数的真实地址必须使用输出函数进行输出,而程序给出的输出函数是根据&heap_pointer)[index] + 6中的地址输出字符串。

list

3.通过以上的分析可以的得出,如果可以控制&heap_pointer)[index] + 6中的数据再配合change_descrip()函数就可以实现任意地址读写了。

4.UAF(use after free),顾名思义就是在释放完堆块之后还可以对其进行操作,如果对Linux的堆管理器有一定认识的话可以知道,在堆块释放完之后,如果重新申请的堆块大小合适,会将之前已经释放的堆块重新分配。也就是说当程序在realloc函数的时候size比原来大,free掉之前的chunk,再重新调用add()生成两个堆块,第一个堆块的位置会落在之前被realloc函数free掉的函数中,并且第一个堆块中存放的数据的地址信息可以被之前的指针进行修改,这样的话就可以实现任意地址读写。

首次add。

first_add

再次add,防止realloc直接向topchunk申请内存。

second_add

修改首次add的堆块大小。

change_first

这时首次add的堆块的指向description仍然指向原来的位置,而原来的位置已经被free了(配合上图食用)。

description

这时再add一个。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值