mmap&mprotect

最近做了一道题, 竟然不让用system和execve, 让用mmap 和 mprotect来解决。可是身为小白萌新的我,对此一脸懵逼, 查阅相关内容和文档, 写下这篇博客, 用来回顾和分享。

mmap函数

  • 头文件: <sys/mman.h>

  • 函数原型:
    void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset);

  • 作用:
    mmap将一个文件或者其它对象映射进内存,同时设置那段内存的属性可读可写或者是可执行。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。mmap在用户空间映射调用系统中作用很大。

  • 条件:
    mmap()必须以PAGE_SIZE为单位进行映射,而内存也只能以页为单位进行映射,若要映射非PAGE_SIZE整数倍的地址范围,要先进行内存对齐,强行以PAGE_SIZE的倍数大小进行映射。

  • 参数说明:

    • start:映射区的开始地址,设置为0时表示由系统决定映射区的起始地址。
    • length:映射区的长度。//长度单位是 以字节为单位,不足一内存页按一内存页处理
    • prot:期望的内存保护标志,不能与文件的打开模式冲突。是以下的某个值,可以通过or运算合理地组合在一起
      • PROT_EXEC //页内容可以被执行
      • PROT_READ //页内容可以被读取
      • PROT_WRITE //页可以被写入
      • PROT_NONE //页不可访问
    • flags:指定映射对象的类型,映射选项和映射页是否可以共享。它的值可以是一个或者多个以下位的组合体
      • MAP_FIXED //使用指定的映射起始地址,如果由start和len参数指定的内存区重叠于现存的映射空间,重叠部分将会被丢弃。如果指定的起始地址不可用,操作将会失败。并且起始地址必须落在页的边界上。
      • MAP_SHARED //与其它所有映射这个对象的进程共享映射空间。对共享区的写入,相当于输出到文件。直到msync()或者munmap()被调用,文件实际上不会被更新。
      • MAP_PRIVATE //建立一个写入时拷贝的私有映射。内存区域的写入不会影响到原文件。这个标志和以上标志是互斥的,只能使用其中一个。
      • MAP_DENYWRITE //这个标志被忽略。
      • MAP_EXECUTABLE //同上
      • MAP_NORESERVE //不要为这个映射保留交换空间。当交换空间被保留,对映射区修改的可能会得到保证。当交换空间不被保留,同时内存不足,对映射区的修改会引起段违例信号。
      • MAP_LOCKED //锁定映射区的页面,从而防止页面被交换出内存。
      • MAP_GROWSDOWN //用于堆栈,告诉内核VM系统,映射区可以向下扩展。
      • MAP_ANONYMOUS //匿名映射,映射区不与任何文件关联。
      • MAP_ANON //MAP_ANONYMOUS的别称,不再被使用。
      • MAP_FILE //兼容标志,被忽略。
      • MAP_32BIT //将映射区放在进程地址空间的低2GB,MAP_FIXED指定时会被忽略。当前这个标志只在x86-64平台上得到支持。
      • MAP_POPULATE //为文件映射通过预读的方式准备好页表。随后对映射区的访问不会被页违例阻塞。
      • MAP_NONBLOCK //仅和MAP_POPULATE一起使用时才有意义。不执行预读,只为已存在于内存中的页面建立页表入口。
    • fd:有效的文件描述词。一般是由open()函数返回,其值也可以设置为-1,此时需要指定flags参数中的MAP_ANON,表明进行的是匿名映射。
    • offset:被映射对象内容的起点。

    想要更详细的理解,请点击

mprotect函数

  • 头文件: <unistd.h>, <sys/mmap.h>
  • 函数原型:
    int mprotect(const void *start, size_t len, int prot);
  • 作用:
    可以用来修改一段指定内存区域的保护属性。把自start开始的、长度为len的内存区的保护属性修改为prot指定的值
  • 参数说明:
    • start:指向需要修改的地址
    • len: 需要修改的长度
    • prot:可以取以下几个值,并且可以用“|”将几个属性合起来使用:
      • PROT_READ:表示内存段内的内容可写;
      • PROT_WRITE:表示内存段内的内容可读;
      • PROT_EXEC:表示内存段中的内容可执行;
      • PROT_NONE:表示内存段中的内容根本没法访问。

总结

简单来说mmap函数创建一块内存区域,将一个文件映射到该区域,进程可以像操作内存一样操作文件。mprotect函数可以改变一块内存区域的权限(以页为单位),在做pwn题的时候, 通常把bss的权限改为可读可写可执行,将shellcode写入并执行。一般来说64位下mprotect(0x600000,0x1000,7)(起始地址,长度,权限)32位下mprotect(0x804A000,0x400,7),长度都是对齐的,记住有三个参数在这里。

mmap mprotect详解相关推荐

  1. 共享内存映射之mmap()函数详解

    转 共享内存映射之mmap()函数详解 /span> 查看全文 http://www.taodudu.cc/news/show-3175071.html 相关文章: 子集生成(二进制法,逐步生成 ...

  2. linux mmap 函数详解,Linux之mmap函数简介

    本文主要讲述mmap 函数的使用,与驱动中 mmap 函数的实现 mmap 怎么使用,怎么实现,为什么 mmap 可以减少额外的拷贝? 下面简单详情. 一. mmap 的使用#include void ...

  3. linux mmap 函数详解,mmap函数详解与代码实操

    icon1.jpg mmap 函数是 unix/linux下的系统调用. 当存在客户-服务程序中复制文件时候,其数据流如下,要经历四次数据复制,开销很大. image.png 果采用共享内存的方式,那 ...

  4. mmap函数详解(what?why?how?)

    WHAT? 1.什么是mmap mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系. 实现这样的映射关系后, ...

  5. mmap函数详解整理

    mmap将一个文件或者其它对象映射进内存.文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零.mmap在用户空间映射调用系统中作用很大. 头文件 <sys ...

  6. Linux mmap 详解

    Linux mmap详解 一.mmap()是什么 二.mmap()原理 三.mmap和常规文件操作的区别 四.mmap相关函数 五.mmap使用细节 六.对mmap()返回地址的访问 例子: 情形一: ...

  7. 【详解文件IO系列】讲讲 MQ 消息中间件 (Kafka,RocketMQ等)与 MMAP、PageCache 的故事

    网络io相关视频讲解:网路io底层epoll 网络编程相关视频讲解:详解网络编程相关的细节处理 Linux服务器开发高级架构学习视频:C/C++Linux服务器开发/Linux后端开发架构师 一般的I ...

  8. Linux I/O操作fsync后数据就安全了么(fsync、fwrite、fflush、mmap、write barriers详解)

    系列文章 Linux I/O操作fsync后数据就安全了么(fsync.fwrite.fflush.mmap.write barriers详解) Linux I/O系列之直接内存(Direct IO) ...

  9. Linux系统调用详解(实现机制分析)

    为什么需要系统调用   linux内核中设置了一组用于实现系统功能的子程序,称为系统调用.系统调用和普通库函数调用非常相似,只是系统调用由操作系统核心提供,运行于内核态,而普通的函数调用由函数库或用户 ...

最新文章

  1. Serverless 初体验:快速开发与部署一个Hello World(Java版)
  2. python好找工作吗2017-2018年七大工作机会最多的编程语言和技术!
  3. python PyQt5.QtWidgets.QWidget.mouseMoveEvent()函数
  4. 面向全球用户的Teams app之夏令时篇
  5. CF1408G:Clusterization Counting(区间dp、克鲁斯卡尔重构树)
  6. jquery 事件冒泡的介绍以及如何阻止事件冒泡
  7. DCMTK的Lib 引用顺序
  8. CSDN - 屏蔽百度广告
  9. C Traps:运算
  10. 远古有圆孔的头颅可能是穿越者
  11. mysql msi失败_MySQL .msi 安装失败改用.zip安装步骤
  12. 提供三份程序员简历模板
  13. 基于模块化多电平换流器(MMC)的柔性直流输电系统simulink仿真模型开发
  14. mysql stmt attr set_mysqli_stmt::attr_set()
  15. Mybatis关联查询遇到的坑-无主键的关联数据去重
  16. 植物大战僵尸存档任务C1-01
  17. 利用screen命令将程序挂在linux后台
  18. python校验用户登录信息
  19. Gateway篇(一)之Gateway配置
  20. htmla标签下划线去除_html超链接的下划线怎么去掉?a标签去下划线的方法都在这里...

热门文章

  1. 《dojo 边学边用》(01), 初识dojo,dojo简介和框架概览
  2. 泛型--定制泛型接口、泛型类--介绍篇
  3. Access数据库注入
  4. [网络安全自学篇] 三十一.文件上传之Upload-labs靶场及CTF题目01-10(四)
  5. 2018年第九届蓝桥杯 - 省赛 - C/C++大学A组 - F.航班时间
  6. 63. Unique Paths II 不同路径 II
  7. Georgia and Bob POJ - 1704
  8. 征战蓝桥 —— 2015年第六届 —— C/C++A组第5题——九数组分数
  9. 【Linux系统编程应用】Linux音频编程实战(一)
  10. webpack devserver配置_webpack中webpack-dev-server的contentBase和index属性实测