Skip to content

通过 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)

  1. 修改 stdout_IO_write_ptr,实现 fp->_IO_write_ptr > fp->_IO_write_base
  2. 修改伪造的 _IO_OVERFLOW 为 one gadget

Comments