-
-
[原创]2019 KCTF Q3 Pwn题 第六题:神秘刺客设计思路:0xbirdpwn
-
发表于: 2019-8-29 21:47 3447
-
题目名称:0xbirdheap
题目flag:flag{He1e's_an_f10g_3Nc3507_E0sy_pwn}
题目格式:linux下64位的ELF文件,只开了NX保护
出题思路:
main函数源码:
通过malloc分配一个堆缓冲区;释放指定的缓冲区;在指定地址可以写入;输出堆栈地址;退出返回
主要漏洞逻辑是在malloc和free函数中,每一个堆块都有读写区域,最后两个word会作为空闲列表指针。
堆区域布置如下:
在free之后存在一个UAF漏洞,可以通过在free和malloc之后重写fd的值将bin设置成任意地址,现在该地址的区域是由下一个malloc保护的,这样就可以控制返回地址,并且只开了NX,代码是可以被写入堆空间中的,这样返回地址就会被重写为堆地址,劫持后执行shellcode。
add_free_block函数源码:
malloc代码:
这个漏洞是在分配新缓冲区时,没有检查缓冲区大小,这样就可以提供负大小的缓冲区
IDA代码如下:
free_buffer(data_ptr)将得到块的长度data_ptr - 8,并且会存储指向head_free_list_ptr的块,在下一次free()后 ,这个指针将会被解引用,但是这个指针也是可控的。
利用这个漏洞需要使用堆分配器直接在堆栈内进行分配(由于“Nice Addr”命令,其地址已知)。
所以我们需要:
第二次释放后,我们就可以控制head_free_list_ptr了:
现在需要确切知道最后一次调用$ rbp的确切位置,“Nice Addr”命令会提供信息。
main() 函数使用非常大的缓冲区(0x100字节)来存储从stdin读取的值:
位置也很容易确定:
现在head_free_list_ptr就完全可控了。我们需要在此地址写入一个较大的值,例如0x1000,这样在检查此地址时,allocate_buffer()会认为堆栈中的缓冲区足够大,就可用于新的分配:
这样就将其转换为了常规堆栈溢出,只需在新分配的地址0x7fffffffe458处写入shellcode即可。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!