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; | 
参考链接
             评论
        
        
    评论插件加载失败
    
    
    正在加载评论插件