前言 本文以 0x00 CTF 2017 的 babyheap 为例介绍下通过修改 vtable 进行 rop 的操作 (:-_- 漏洞分析 首先查看一下程序开启的安全措施 18:07 haclh@ubuntu:0x00ctf $ checksec ./babyheap [*] '/home/haclh/workplace/0x00ctf/babyheap' Arch: amd64-64-little RELRO: Full RELRO Stack: Canary found NX: NX en…
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 利用 FILE 结构体进行攻击,在现在的 ctf 比赛中也经常出现,最近的 hitcon2017 又提出了一种新的方式.本文对该攻击进行总结. 正文 首先来一张 _IO_FILE 结构体的结构 _IO_FILE_plus 等价于 _IO_FILE + vtable 调试着来看看(64 位) vtable 指向的位置是一组函数指针 利用 vtable 进行攻击 通过…
前言 前面几篇文章说道,glibc 2.24 对 vtable 做了检测,导致我们不能通过伪造 vtable 来执行代码.今天逛 twitter 时看到了一篇通过绕过 对vtable 的检测 来执行代码的文章,本文做个记录. 文中涉及的代码,libc, 二进制文件. https://gitee.com/hac425/blog_data/blob/master/pwn_file/file_struct_part4.rar 正文 首先还是编译一个有调试符号的 glibc 来辅助分析. 源码下载链接…
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 前面介绍了几种 File 结构体的攻击方式,其中包括修改 vtable的攻击,以及在最新版本 libc 中 通过 修改 File 结构体中的一些缓冲区的指针来进行攻击的例子. 本文以 hitcon 2017 的 ghost_in_the_heap 为例子,介绍一下在实际中的利用方式. 不过我觉得这个题的精华不仅仅是在最后利用 File 结构体 getshell 那…
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 最新版的 libc 中会对 vtable 检查,所以之前的攻击方式,告一段落.下面介绍一种,通过修改 _IO_FILE 实现任意地址读和任意地址写的方式. 正文 _IO_FILE 通过这些指针,来读写数据. 如果我们修改了它们,然后通过一些文件读写函数时,我们就能实现 任意地址读写. 任意地址读 代码示例 #include <stdio.h> #include…
stdin.stdout.FILE结构体.缓冲区和fflush理解 因为之前调试代码时, printf输出的字符串总是被截断了输出(先输出部分, 再输出剩余的), 当时调试了很久, 才知道问题所在, 并用fflush函数解决了上述bug. 1. stdin和stdout是什么 它们是FILE*类型的结构体指针(所以并不是int类型的0,1,2), 只是程序默认一般打开的. man pages3中的定义: #include <stdio.h> extern FILE *stdin; extern…
struct file结构体定义在/linux/include/linux/fs.h(Linux 2.6.11内核)中,其原型是:struct file {        /*         * fu_list becomes invalid after file_free is called and queued via         * fu_rcuhead for RCU freeing         */        union {                struct l…
struct file(file结构体): struct file结构体定义在include/linux/fs.h中定义.文件结构体代表一个打开的文件,系统中的每个打开的文件在内核空间都有一个关联的 struct file. 它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数.在文件的所有实例都关闭后,内核释放这个数据结构.在内核创建和驱动源码中, struct file的指针通常被命名为file或filp.其有两个非常重要的字段:文件描述符和缓冲区.  文件描述符fd: fd只是一个…
f_flags,File Status Flag f_pos,表示当前读写位置 f_count,表示引用计数(Reference Count): dup.fork等系统调用会导致多个文件描述符指向同一个file结构体,例如有fd1和fd2都引用同一个file结构体,那么它的引用计数就是2,当close(fd1)时并不会释放file结构体,而只是把引用计数减到1,如果再close(fd2),引用计数就会减到0同时释放file结构体,这才真的关闭了文件. file_operations结构体: 每个…
文件描述符 fd 概念:文件描述符在形式上是一个非负整数.实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表.当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符.在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开. 习惯上,标准输入(standard input)的文件描述符是 0,标准输出(standard output)是 1,标准错误(standard error)是 2. 查看当前最大打开文件描述符数 : ulimit -n FI…