首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Ret2Shellcode之Mprotect修改bss权限

mprotect()函数把自start开始的、长度为len的内存区的保护属性修改为prot指定的值。...原型: int mprotect(const void *start, size_t len, int prot); 第一个参数:需改写属性的内存中开始地址 第二个参数:需改写属性的内存长度 第三个参数...Prot=7 是可读可写可执行的最高权限 一般用于在利用shellcode方式进行栈溢出时,但是bss段没有足够的权限来写入shellcode时,可以利于mprotect函数来改写bss段的权限 例题分析...可以看到只开启了nx保护 程序中有直接可以读取flag的get_flag函数,但这次我们使用mprotect的方式来直接拿shell 使用gdb中的vmmap先来看一下bss段的权限 ?...mprotect来修改指定bss段地址的权限,在利用pop esi;pop edi;pop ebp;ret来返回到指定地址如read函数上以读取shellcode到以修改权限的bss段地址上,最后再次利用

2.5K20
您找到你想要的搜索结果了吗?
是的
没有找到

PWN 利用mprotect函数进行.got.plt地址段的读取

mprotect函数详解 在Linux中,mprotect()函数可以用来修改一段指定内存区域的保护属性 函数原型如下: #include #include int mprotect(const void *start, size_t len, int prot); mprotect()函数把自start开始的、长度为len的内存区的保护属性修改为...mprotect函数的利用 这个函数利用方式为将目标地址:.got.plt或.bss段 修改为可读可写可执行 例题分析 not_the_same_3dsctf_2016 原题链接:https://buuoj.cn...第二个参数需要设置为被修改内存的大小,这里我还没完全弄明白具体要设置多大,这里我设置为0x100 第三个参数需要设置为被修改内存的权限,这里设置为7 = 4 + 2 + 1 (rwx) 也就是读写执行,这里如果不是很理解,可以百度一下Linux...返回地址覆盖需要三个连续的pop地址,因为mprotect函数需要传入三个地址,使用ROPgadget来获取地址 ROPgadget --binary not_the_same_3dsctf_2016

46610

Kokodayo-Wp

讲一下mprotect函数,函数原型为int mprotect(const void *start, size_t len, int prot);, 该函数有三个参数,分别为: 要修改的内存地址 ==>...start 要修改的内存大小 ==> len 以及赋予多大的权限 ==> prot 也就是说,mprotect是把从addr开始的长度为length的内存空间的保护属性修改为prot的值。...需要注意的是mprotect修改权限时,是以一个内存页为最小单位的,也就是说,如果写入的长度没有达到一个内存页的大小(0x1000),mprotect认为修改一整个页的权限。...时,第三个参数prot为5,所以只有rx,也就是读取和执行权限,没有写入的权限(这里不懂的可以搜一下Linux下权限相关的文章看看),所以,为了后续能把可写的内存变大,需要先对这片内存赋予可写的权限,这题直接使用...mprotect扩展即可,mprotect所对应的系统调用号可以在/usr/include/x86_64-linux-gnu/asm/unistd_64.h中所找到。

29220

Linux 内核 内存管理】内存管理系统调用 ① ( mmap 创建内存映射 | munmap 删除内存映射 | mprotect 设置虚拟内存区域访问权限 )

文章目录 一、mmap 创建内存映射 二、munmap 删除内存映射 三、mprotect 设置虚拟内存区域访问权限 一、mmap 创建内存映射 ---- mmap 系统调用函数 , 用于 创建 " 内存映射...对比 : 传统的文件操作 , 首先调用 fopen 函数打开文件 , 然后调用 fread fwrite 等函数操作文件 , 这些操作 在 用户模式 下调用 , 然后需要 切换到 内核模式 下调用 Linux...munmap 系统调用 的作用是 删除内存映射 , 其函数原型如下 : #include int munmap(void* start,size_t length); 三、mprotect...设置虚拟内存区域访问权限 ---- mprotect 系统调用 的作用是 设置虚拟内存区域访问权限 , 其函数原型如下 : #include int mprotect(const

1.2K20

无法获取指向控制台的文件描述符 (couldnt get a file descriptor referring to the console)

(0x76f36000, 8192, PROT_READ) = 0 mprotect(0x76f4f000, 20480, PROT_READ|PROT_WRITE) = 0 mprotect(0x76f4f000...解决方案 既然根因是权限导致的,那就从权限入手来解决,之前系统总结过 linux 文件权限的规则 (参考 《[apue] linux 文件访问权限那些事儿 》),要将 root 创建的文件分享给当前用户访问...(0x76f3a000, 8192, PROT_READ) = 0 mprotect(0x76f53000, 20480, PROT_READ|PROT_WRITE) = 0 mprotect(0x76f53000...(0x76ea2000, 8192, PROT_READ) = 0 mprotect(0x76ebb000, 20480, PROT_READ|PROT_WRITE) = 0 mprotect(0x76ebb000...结语 本文探索了诡异的 tty 设备文件权限问题,结合 linux 文件权限相关的知识进行了一番大胆的尝试,最后却另辟蹊径解决了问题。

3.5K20

线程的创建以及线程的本质

link with -pthread. pthread_create是创建一个新线程,参数thread是threadID, 可以通过pthread_self返回,此threadID是遵循POSIX的标准,和linux...pthread_self返回的ID是遵循POSIX的标准,而gettid()返回的ID是linux内核自定义的 我们通过PS来看下进程和线程的关系 root@ubuntu:$ ps -eLf UID...(0x7f31ab548000, 16384, PROT_READ) = 0 mprotect(0x7f31ab76b000, 4096, PROT_READ) = 0 mprotect(0x5604674c3000...linux就是通过这样的方式来实现用户线程的。这样一来父子进程共享了所有的资源,共享了所有的资源,则这就是线程。...但是linux内核没有线程的概念,内核中只认task_struct结构,只要是task_struct结构就可以参与调度。所以内核中并没有区分进程和线程。

1.5K20

使用golang的net包进行域名解析过程分析

当然在linux环境下,用来做dns解析的工具有很多,比如dig和nslookup之类的,但是通常对于复杂问题的排查直接去机器上去很显然是不太现实的,因此打算使用golang的接口来封装域名解析服务,来提供后期的操作...分析dns解析过程以及系统调用 注意:在linux环境下可以使用dig +trace来追踪域名解析过程 我们都知道,在计算机的世界,建立连接都是需要依靠五元组的(源ip,源端口,目的ip,目的端口,协议.../dns-test [185.199.110.153 185.199.111.153 185.199.109.153 185.199.108.153] # 使用linux系统工具trace分析整个dns.....}) = 0 mmap(NULL, 2212768, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f5c6d605000 mprotect...(0x7f5c6d5fb000, 16384, PROT_READ) = 0 mprotect(0x7f5c6d81c000, 4096, PROT_READ) = 0 mprotect(0x7f5c6da43000

12.5K60
领券