美文网首页
linux 用户态内存属性的修改

linux 用户态内存属性的修改

作者: onedam | 来源:发表于2022-03-05 19:03 被阅读0次

https://www.cnblogs.com/Max-hhg/articles/13939064.html

//windows 下修改内存属性的api 为 VirtualProtect 
#include <sys/mman.h>
int mprotect(const void *addr, size_t len, int prot); 

此函数把自addr开始的、长度为len的内存区的保护属性修改为prot指定的值,prot值如下:

prot标签值         描述
PROT_NONE   The memory cannot be accessed at all.
PROT_READ   The memory can be read.
PROT_WRITE  The memory can be written to.
PROT_EXEC   The memory can contain executing code.

https://blog.csdn.net/zmlcool/article/details/9378897

mmap通过映射 /dev/zero 来分配内存页。内存将被初始化为可读和可写模式。

int fd = open (“/dev/zero”, O_RDONLY);
char* memory = mmap (NULL, page_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
close (fd);
然后,您的程序可以使用 mprotect 把它变成只读:

mprotect (memory, page_size, PROT_READ);
有一种监控内存访问的高级技巧,可以通过利用 mmap 和 mprotect 保护目标内存区间,然后当程序访问时候接收并处理 Linux 系统发送的 SIGSEGV 信号。代码 展示了这个技巧。

代码使用mprotect检测内存访问

#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

static int alloc_size;
static char* memory;

void segv_handler (int signal_number)
{
  printf (“memory accessed!\n”);
  mprotect (memory, alloc_size, PROT_READ | PROT_WRITE);
}

int main ()
{
  int fd;
  struct sigaction sa;

  /* 初始化segv_handler为SIGSEGV的句柄。*/
  memset (&sa, 0, sizeof (sa));
  sa.sa_handler = &segv_handler;
  sigaction (SIGSEGV, &sa, NULL);

  /* 使用映射/dev/zero分配内存页。最初映射的内存为只写。*/
  alloc_size = getpagesize ();
  fd = open (“/dev/zero”, O_RDONLY);
  memory = mmap (NULL, alloc_size, PROT_WRITE, MAP_PRIVATE, fd, 0);
  close (fd);
  /* 写页来获得一个私有复制。 */
  memory[0] = 0;
  /* 使内存为不可写。 */
  mprotect (memory, alloc_size, PROT_NONE);

  /* 写分配内存区域。 */
  memory[0] = 1;
  /* 所有工作都结束;unmap内存映射。 */
  printf (“all done\n”);
  munmap (memory, alloc_size);

  return 0;
}
上述程序按照如下步骤执行:

程序为 SIGSEGV 建立一个信号处理句柄。
程序通过映射 /dev/zero 分配一个内存分页,然后通过写入数据的方式获得一个私有复本。
程序通过调用带 PROT_NONE 权限的 mprotect 保护了内存。
当程序在后续执行中写入内存时,Linux 向进程发送 SIGSEGV,这个信号被 segv_handler 句柄接收处理。这个句柄将解除内存保护,因而程序内存访问得以继续。
当信号句柄执行完成时,程序控制权返回 main 函数,程序将使用 munmap 来释放内存。

https://blog.csdn.net/zacklin/article/details/7478118 注入shellcode . 设置内存为可执行...

相关文章

  • linux 用户态内存属性的修改

    https://www.cnblogs.com/Max-hhg/articles/13939064.html[ht...

  • Android IPC——Binder

    Linux基础 Linux的源码目录结构 内核态、用户态 内核态:CPU可以访问内存所有数据,包括外围设备,例如硬...

  • linux 内存看一篇就够了(多图)

    ​ 正文 0 内存模块 1 linux内存总体布局:内存分成用户态和内核态 4G进程地址空间解析 内核地址空间 进...

  • 用户态内存管理

    linux内核态的内存管理主要是基于伙伴系统和slab机制,而用户态内存管理主要是VMA虚拟地址空间。 在linu...

  • Linux/IO学习笔记

    相关知识 Linux中一切类型都被抽象成文件,故Linux都是文件描述符 内存被划分为:内核态和用户态,数据在内核...

  • Linux - 用户态内存映射 和 内核态内存映射

    操作系统的内存管理,主要分为三个方面。第一,物理内存的管理,相当于会议室管理员管理会议室。第二,虚拟地址的管理,也...

  • 2019-08-11 Linux面试常用命令

    一Linux结构体系 Linux从结构体系上看,可以分为二大部分,用户态和内核态,用户态主要是用户上层的活动,内核...

  • 面试内容梳理之Linux操作系统

    问熟悉Linux操作系统么?答: linux 操作系统按照层次可以分为用户态和内核态两层。用户态主要运行着用户的应...

  • Android进程间通信

    Linux进程间通信 基础概念 内核态/用户态 如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和...

  • 【总结】LINUX常见命令深度解析

    摘要 本文讲解LINUX下用户/用户组,文件属性及修改,SUDO免密登录,SSH互信免密登录,VIM,histor...

网友评论

      本文标题:linux 用户态内存属性的修改

      本文链接:https://www.haomeiwen.com/subject/uoimrrtx.html