Pwn堆利用学习—— Use-After-Free——pwnable_hacknote
2020-12-22 18:58:00 Author: mp.weixin.qq.com(查看原文) 阅读量:121 收藏

本文为看雪论优秀文章

看雪论坛作者ID:直木

步骤一:运行查看

步骤二:查看文件类型和保护机制

32位程序

步骤三:IDA反编译分析

main函数:


add_note函数:

print_note_content函数:

del_note函数:free之后没有置为NULL,存在UAF漏洞。
print_note函数:
 
gdb确认(_DWORD *)((int (__cdecl *)(_DWORD *))*notelist[v2])(notelist[v2])是哪个函数的方法:
  1. 选中第一个notelist[2],按tab键,切换到汇编代码,分析得知对应调用函数的指令是call eax,拷贝地址;

  2. 然后在gdb中下断点,先r运行,输入1创建一个note;

  3. 然后输入3,进行打印,运行到断点处,si单步调试,进入函数,看到这个调用的函数就是print_note_content函数。

这题没有明显看到函数中有shell函数,那么我们就在IDA中搜索一下,Shift+F12,看到/bin/sh字符串,双击进去,然后交叉引用,看到magic函数。

步骤四:调试和思路

0x80485fb 在IDA中查看,是print_note_content函数。
0x8a71018 就在下面,是输入到堆里的“aaaa”。
所以,可以确定note结构体为:
struct note{ void* ptr = print_note_content; char* content;}
当然note-content chunk大小是0x18,还有8个字节我在图中没有打印出来。
 
思路:
 
还记得print_note函数里的(_DWORD *)((int (__cdecl *)(_DWORD *))*notelist[v2])(notelist[v2]),现在就可以理解了:(_DWORD *)((int (__cdecl *)(_DWORD *))*notelist[v2])就是note结构体中的第一个条目,即print_note_content函数。
 
那么由于有UAF漏洞,我们就要想办法去把堆中这个函数的地址0x80485fb给改掉,改成magic函数的地址,然后再去调用print_note函数,那么就会调用结构体里的print_note_content函数,当然现在变成了magic函数,就能getshell了!
 
怎么去改呢?
 
想想我们的输入,能输入content,也就是说我们能直接控制输入的note-content chunk的内容,不能直接控制note chunk的内容。
 
还有一点,这个大小的chunk free之后是放入fastbin中,先进先出。
 
所以,我们可以想办法先malloc出两个note chunk,然后再依次free,接着再调用add_note()函数的话,先free的这个 note chunk(即第一个note chunk)就会变成 note-content chunk 了,我们能控制最后一次malloc的note-content chunk,让输入的content为magic函数的地址,那么就让第一个note chunk中print_note_content的地址变为了magic的地址!
 
最后调用print_note,输入index为0,那么就getshell了!
 
调试:
 

步骤五:Exploit

from pwn import * context.log_level = 'debug'p = process('./hacknote')elf = ELF('./hacknote') def add(size,content='aaaa'):    p.sendlineafter(':','1')    p.sendlineafter(':',str(size))    p.sendlineafter(':',content) def delete(index):    p.sendlineafter(':','2')    p.sendlineafter(':',str(index)) def show(index):    p.sendlineafter(':','3')    p.sendlineafter(':',str(index)) sh = p32(elf.sym['magic'])add(0x10)add(0x10)delete(0)delete(1)add(0x8,sh)show(0) def dbg():    gdb.attach(p)    pause()#dbg()p.interactive()

参考文献

  • ctf-wiki

  • https://www.bilibili.com/video/BV1iE411H7cZ

- End -

看雪ID:直木

https://bbs.pediy.com/user-home-830671.htm

  *本文由看雪论坛 直木 原创,转载请注明来自看雪社区。


# 往期推荐

公众号ID:ikanxue
官方微博:看雪安全
商务合作:[email protected]

球分享

球点赞

球在看

点击“阅读原文”,了解更多!


文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458378498&idx=1&sn=d79800e20d56813e54666b44dfe3f99f&chksm=b180d18886f7589e5405a65b8980adced433a733cfb40b733022aa07c63f24141da3a48998de#rd
如有侵权请联系:admin#unsafe.sh