通过 IO 来改变 exit 程序流
复制本地路径 | 在线编辑
exit 中存在一条函数调用链: exit->__run_exit_handlers->_IO_cleanup->_IO_flush_all_lockp. 关键源码如下.
fp = (_IO_FILE *) _IO_list_all;
while (fp != NULL) {
// ...
if (((fp->_mode <= 0 && fp->_IO_write_ptr > fp->_IO_write_base)
#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
|| (_IO_vtable_offset (fp) == 0
&& fp->_mode > 0
&& (fp->_wide_data->_IO_write_ptr > fp->_wide_data->_IO_write_base))
#endif
)
&& _IO_OVERFLOW (fp, EOF) == EOF)
- 修改
stdout中_IO_write_ptr,实现fp->_IO_write_ptr > fp->_IO_write_base - 修改伪造的
_IO_OVERFLOW为 one gadget