Vtable Hijack
concept
fwrite
summary
call trace
others
todo
Last updated
Last updated
size_t
_IO_fwrite (const void *buf, size_t size, size_t count, FILE *fp)
{
// ...
_IO_acquire_lock (fp);
if (_IO_vtable_offset (fp) != 0 || _IO_fwide (fp, -1) == -1)
written = _IO_sputn (fp, (const char *) buf, request); // <-- OUR INTEREST
_IO_release_lock (fp);
// ...
}#define _IO_XSPUTN(FP, DATA, N) JUMP2 (__xsputn, FP, DATA, N)size_t
_IO_wfile_xsputn (FILE *f, const void *data, size_t n)
{
// ...
if (n <= 0)
return 0;
if ((f->_flags & _IO_LINE_BUF) && (f->_flags & _IO_CURRENTLY_PUTTING))
{
// ...
if (count >= n)
{
const wchar_t *p;
for (p = s + n; p > s; )
{
if (*--p == L'\n')
{
// ...
}
}
}
}
if (count > 0)
{
if (count > to_do)
// ...
if (count > 20)
{
// ...
}
else
{
// ...
}
to_do -= count;
}
if (to_do > 0)
to_do -= _IO_wdefault_xsputn (f, s, to_do); // <-- OUR INTEREST
// ...
}size_t
_IO_wdefault_xsputn (FILE *f, const void *data, size_t n)
{
// ..
if (more <= 0)
return 0;
for (;;)
{
// ..
if (count > 0)
{
// ..
}
if (more == 0 || __woverflow (f, *s++) == WEOF) // <-- OUR INTEREST
// ..
}wint_t
__woverflow (FILE *f, wint_t wch)
{
if (f->_mode == 0)
_IO_fwide (f, 1);
return _IO_OVERFLOW (f, wch); // <-- OUR INTEREST
}typedef int (*_IO_overflow_t) (FILE *, int);
#define _IO_OVERFLOW(FP, CH) JUMP1 (__overflow, FP, CH)
#define _IO_WOVERFLOW(FP, CH) WJUMP1 (__overflow, FP, CH)wint_t
_IO_wfile_overflow (FILE *f, wint_t wch)
{
if (f->_flags & _IO_NO_WRITES) /* SET ERROR */
{
f->_flags |= _IO_ERR_SEEN;
__set_errno (EBADF);
return WEOF;
}
/* If currently reading or no buffer allocated. */
if ((f->_flags & _IO_CURRENTLY_PUTTING) == 0) // <-- NEEDS TO BE SATISFIED
{
/* Allocate a buffer if needed. */
if (f->_wide_data->_IO_write_base == 0) // <-- NEEDS TO BE SATISFIED
{
_IO_wdoallocbuf (f); // <-- OUR INTEREST
// stuff
if (f->_IO_write_base == NULL)
{
// stuff
}
}
// ... not rlly relevant
}
libc_hidden_def (_IO_wfile_overflow)void
_IO_wdoallocbuf (FILE *fp)
{
if (fp->_wide_data->_IO_buf_base) // <-- NEEDS TO BE SATISFIED
return;
if (!(fp->_flags & _IO_UNBUFFERED)) // <-- NEEDS TO BE SATISFIED
if ((wint_t)_IO_WDOALLOCATE (fp) != WEOF) // <-- OUR INTEREST
return;
// stuff
}
libc_hidden_def (_IO_wdoallocbuf)typedef int (*_IO_doallocate_t) (FILE *);
#define _IO_DOALLOCATE(FP) JUMP0 (__doallocate, FP)
#define _IO_WDOALLOCATE(FP) WJUMP0 (__doallocate, FP)