Pwn堆利用学习—— Use-After-Free——pwnable_hacknote

admin 2020年12月22日17:58:50评论254 views字数 2141阅读7分8秒阅读模式
Pwn堆利用学习—— Use-After-Free——pwnable_hacknote

本文为看雪论优秀文章

看雪论坛作者ID:直木



步骤一:运行查看


Pwn堆利用学习—— Use-After-Free——pwnable_hacknote


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


32位程序


Pwn堆利用学习—— Use-After-Free——pwnable_hacknote


步骤三:IDA反编译分析


main函数:


Pwn堆利用学习—— Use-After-Free——pwnable_hacknote

add_note函数:


Pwn堆利用学习—— Use-After-Free——pwnable_hacknote

print_note_content函数:


Pwn堆利用学习—— Use-After-Free——pwnable_hacknote

del_note函数:free之后没有置为NULL,存在UAF漏洞。
Pwn堆利用学习—— Use-After-Free——pwnable_hacknote

print_note函数:
Pwn堆利用学习—— Use-After-Free——pwnable_hacknote 
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函数。

Pwn堆利用学习—— Use-After-Free——pwnable_hacknote

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

Pwn堆利用学习—— Use-After-Free——pwnable_hacknote
Pwn堆利用学习—— Use-After-Free——pwnable_hacknote

步骤四:调试和思路


Pwn堆利用学习—— Use-After-Free——pwnable_hacknote

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了!
 
调试:
 
Pwn堆利用学习—— Use-After-Free——pwnable_hacknote
Pwn堆利用学习—— Use-After-Free——pwnable_hacknote
Pwn堆利用学习—— Use-After-Free——pwnable_hacknote

步骤五: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




Pwn堆利用学习—— Use-After-Free——pwnable_hacknote

- End -


Pwn堆利用学习—— Use-After-Free——pwnable_hacknote


看雪ID:直木

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

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




# 往期推荐





Pwn堆利用学习—— Use-After-Free——pwnable_hacknote
公众号ID:ikanxue
官方微博:看雪安全
商务合作:[email protected]



Pwn堆利用学习—— Use-After-Free——pwnable_hacknote

球分享

Pwn堆利用学习—— Use-After-Free——pwnable_hacknote

球点赞

Pwn堆利用学习—— Use-After-Free——pwnable_hacknote

球在看



Pwn堆利用学习—— Use-After-Free——pwnable_hacknote

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

本文始发于微信公众号(看雪学院):Pwn堆利用学习—— Use-After-Free——pwnable_hacknote

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2020年12月22日17:58:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Pwn堆利用学习—— Use-After-Free——pwnable_hacknotehttp://cn-sec.com/archives/214348.html

发表评论

匿名网友 填写信息