IT学习网 - 爱学习 - 最具影响力综合资讯网站 -- 中国IT界的领航者!
热门关键字:      88888  as  xxx
站外
广告
站外
广告

接口安全分析之从printf源码看libc的IO

发布时间:2017-10-04 13:24文章来源:互联网文章作者: 佚名点击次数:
接口安全分析之从printf源码看libc的IO。咱们彷佛每天都在应用IO,最典型的应用便是printf,scanf,曩昔咱们只晓得printf会有格式化字符串破绽,然则咱们并无怎样穷究过IO详细的是怎样回事,和详细有甚么可以或许入侵攻击的点。 2016 HITCON有一道 house of

接口安全分析之从printf源码看libc的IO。咱们彷佛每天都在应用IO,最典型的应用便是printf,scanf,曩昔咱们只晓得printf会有格式化字符串破绽,然则咱们并无怎样穷究过IO详细的是怎样回事,和详细有甚么可以或许入侵攻击的点。

2016 HITCON有一道 house of orange,是一道可谓经典的标题,第一次(或许彷佛是第一次?)让咱们把入侵攻击的思想往IO FILE里去斟酌,因而咱们开端思虑libc的虚表的可入侵攻击性,可怜的是,libc的开辟职员也很快认识到了这个虚表的成绩,在2.24的libc版本中对vtables停止了加固:

2.24 libc更新日记中的一个内容:

[20191] stdio: libio: vtables hardening

因而这个方法逐步变得艰苦了起来,还好咱们的思绪不仅仅是如许……

本文主要从经典的虚表道理开端提及,中央弥补一下scanf和printf的道理,末了提到一种较新的(或许是我觉得较新的?)思绪。

从虚表开端提及

起首咱们来看下经典的(固然彷佛是2016以后才风行起来的)_IO_FILE_plus的虚表入侵攻击方法。

1._IO_FILE 与 _IO_FILE_plus

源码永久是答复心中疑难的好先生,起首来看看对于这两个布局体的源码:

// libio/libio.h _IO_FILE 布局体

struct _IO_FILE {

int _flags; /* High-order word is _IO_MAGIC; rest is flags. */

#define _IO_file_flags _flags

/* The following pointers correspond to the C++ streambuf protocol. */

/* Note: Tk uses the _IO_read_ptr and _IO_read_end fields directly. */

char* _IO_read_ptr; /* Current read pointer */

char* _IO_read_end; /* End of get area. */

char* _IO_read_base; /* Start of putback+get area. */

char* _IO_write_base; /* Start of put area. */

char* _IO_write_ptr; /* Current put pointer. */

char* _IO_write_end; /* End of put area. */

char* _IO_buf_base; /* Start of reserve area. */

char* _IO_buf_end; /* End of reserve area. */

/* The following fields are used to support backing up and undo. */

char *_IO_save_base; /* Pointer to start of non-current get area. */

char *_IO_backup_base; /* Pointer to first valid character of backup area */

char *_IO_save_end; /* Pointer to end of non-current get area. */

struct _IO_marker *_markers;

struct _IO_FILE *_chain;

int _fileno;

#if 0

int _blksize;

#else

int _flags2;

#endif

_IO_off_t _old_offset; /* This used to be _offset but it's too small. */

#define __HAVE_COLUMN /* temporary */

/* 1+column number of pbase(); 0 is unknown. */

unsigned short _cur_column;

signed char _vtable_offset;

char _shortbuf[1];

/* char* _save_gptr; char* _save_egptr; */

_IO_lock_t *_lock;

#ifdef _IO_USE_OLD_IO_FILE

};

和_IO_FILE_plus:

// libio/libioP.h

#define JUMP_FIELD(TYPE, NAME) TYPE NAME

#define JUMP0(FUNC, THIS) (_IO_JUMPS_FUNC(THIS)->FUNC) (THIS)

struct _IO_jump_t // 虚表布局体

{

JUMP_FIELD(size_t, __dummy);

JUMP_FIELD(size_t, __dummy2);

JUMP_FIELD(_IO_finish_t, __finish);

JUMP_FIELD(_IO_overflow_t, __overflow);

JUMP_FIELD(_IO_underflow_t, __underflow);

JUMP_FIELD(_IO_underflow_t, __uflow);
接口安全分析之从printf源码看libc的IO
本文由 IT学习网 整理,转载请注明“转自IT学习网”,并附上链接。
原文链接:http://www.ourlove520.com/Article/diannao/wangluo/1073109.html

标签分类:

上一篇:上一篇:让黑客都犯愁的最难破解密码居然是这些
下一篇: 下一篇:没有了
无觅关联推荐,快速提升流量