IO_FILE泄漏问题如何任意读取解决?
- 内容介绍
- 文章标签
- 相关推荐
本文共计2629个文字,预计阅读时间需要11分钟。
在堆题中没有show函数时,我们可以使用+IO_FILE+进行leak记录。下面是如何实现这一手法的简单说明:
使用一个输出函数+puts+来说明,它在源代码中的表现形式为+_IO_puts+。
c+_IO_puts+(const char *str){ int result; // ... 实现细节 ...}
在堆题没有show函数时,我们可以用 IO_FILE 进行leak,本文就记录一下如何实现这一手法。
拿一个输出函数 puts 来说,它在源码里的表现形式为 _IO_puts 。
_IO_puts (const char *str) { int result = EOF; _IO_size_t len = strlen (str); _IO_acquire_lock (_IO_stdout); if ((_IO_vtable_offset (_IO_stdout) != 0 || _IO_fwide (_IO_stdout, -1) == -1) && _IO_sputn (_IO_stdout, str, len) == len && _IO_putc_unlocked ('\n', _IO_stdout) != EOF) result = MIN (INT_MAX, len + 1); _IO_release_lock (_IO_stdout); return result; }
我们可以看到 _IO_puts 又调用了一个叫 _IO_sputn 的函数。
本文共计2629个文字,预计阅读时间需要11分钟。
在堆题中没有show函数时,我们可以使用+IO_FILE+进行leak记录。下面是如何实现这一手法的简单说明:
使用一个输出函数+puts+来说明,它在源代码中的表现形式为+_IO_puts+。
c+_IO_puts+(const char *str){ int result; // ... 实现细节 ...}
在堆题没有show函数时,我们可以用 IO_FILE 进行leak,本文就记录一下如何实现这一手法。
拿一个输出函数 puts 来说,它在源码里的表现形式为 _IO_puts 。
_IO_puts (const char *str) { int result = EOF; _IO_size_t len = strlen (str); _IO_acquire_lock (_IO_stdout); if ((_IO_vtable_offset (_IO_stdout) != 0 || _IO_fwide (_IO_stdout, -1) == -1) && _IO_sputn (_IO_stdout, str, len) == len && _IO_putc_unlocked ('\n', _IO_stdout) != EOF) result = MIN (INT_MAX, len + 1); _IO_release_lock (_IO_stdout); return result; }
我们可以看到 _IO_puts 又调用了一个叫 _IO_sputn 的函数。

