house of snake
这house of系列是真的多,上一个还没捂热下一个就来了,glibc更新也是真快。不过能在学习新东西的途中水一篇文章还是相当不错的。
背景介绍
在glibc2.37中_IO_obstack_jumps
被删除啦,导致前一篇的利用方式无了。
原理分析
这次聚焦的vtable是:
1 | static const struct _IO_jump_t _IO_printf_buffer_as_file_jumps libio_vtable = |
可以看到这里只有两个函数,并且我们真正使用的只有第一个函数:
1 | static int |
这个函数一来就是一个强制类型转化为__printf_buffer_as_file
结构体。
1 | struct __printf_buffer_as_file |
可以看到这个结构体的前面两个成员其实就相当于_IO_FILE_plus
结构体,再在后面跟了一个指针。
这个函数的目标是执行到__printf_buffer_flush
,所以需要通过前面的验证。
1 | static void |
这里第一个函数中就是验证了next指针的内容。
1 | struct __printf_buffer |
成功绕过上面的判断之后进入下面这个函数:
1 | static void |
这里最终目标是__printf_buffer_flush_obstack
函数。
1 | void |
这个函数的目标就是obstack_1grow
,前面的绕过方式很简单,直接绕过就行。
1 |
然后执行这个宏,宏中就有了我们熟悉的_obstack_newchunk
函数了。
1 | void |
这里又可以看到我们熟悉的宏CALL_CHUNKFUN
:
1 |
当(h)->use_extra_arg
不为0时即可执行到(h)->chunkfun
。现在就是整条链子的调用了。
总结
这里没有一点一点分析每个if语句应该怎么写,这里直接给出总的就行。
1 | *(A + 0x20) = 0; |
参考链接
评论
评论插件加载失败
正在加载评论插件