首页
社区
课程
招聘
[原创]2019 KCTF Q3 Pwn题 第六题:神秘刺客设计思路:0xbirdpwn
发表于: 2019-8-29 21:47 3447

[原创]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即可。

 
 

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2019-9-25 10:16 被kanxue编辑 ,原因:
上传的附件:
收藏
免费 3
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//