花式栈溢出-mprotect绕过NX保护

  1. 前言
  2. 0x1:mprotect函数
  3. 0x2:验证mprotect函数
  4. 0x3:实例解析

前言

​ 现在的大部分程序都会在编译时开启NX保护,这样我们就无法向栈上注入shellcode从而获得一个shell;只能利用其他手段来泄露sytem函数的地址(ret2libc、dynELF)。 但是当程序存在mprotect函数时,我们通过mprotect函数来修改某个程序段的权限从而让这个段可执行,以此来绕过NX保护。(当然当程序不可使用system函数时,也可使用此方法)

0x1:mprotect函数

函数原型:

int mprotect(void *addr, size_t len, int prot)

mprotect函数把从start开始的,长度为len的内存区的保护属性修改为prot指定的值
    
第一个参数:开始地址(该地址是0x1000的倍数, 以页方式对齐)
第二个参数:指定长度(修改权限的长度, 长度也应该是0x1000的倍数)
第三个参数:指定修改的权限(与linux下文件权限相类似,1表示可执行、2表示可写、4表示可读。一般为7表示可读可写可执行)

0x2:验证mprotect函数

(1)编写以个C语言程序

#include<stdio.h>
#include <sys/mman.h>

int main()
{
    void *addr;
    addr = 0x555555554000;
    mprotect(addr, 0x1000, 7);
    return 0;
}

(2)gcc编译

gcc test.c -o test

(3)用vmmap查看执行mprotect前面程序的权限的变化。可以发现程序增加了可读的权限

image-20220207224656792

image-20220207224724684

0x3:实例解析


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮箱至 1627319559@qq.com

×

喜欢就点赞,疼爱就打赏