首页
学习
活动
专区
工具
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.8K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    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...返回地址覆盖需要三个连续的pop地址,因为mprotect函数需要传入三个地址,使用ROPgadget来获取地址 ROPgadget --binary not_the_same_3dsctf_2016...) + p32(got_plt_size) + p32(got_plt_type) # mprotect的三个参数 payload += p32(elf.symbols['read']) #

    63810

    Kokodayo-Wp

    打开虚拟机发现保护全开,是64位的,拖进IDA反汇编后查看伪代码,在如下图中的位置: 可以发现,程序使用mmap开辟了空间,并向该内存读入了0x11个字节,并且使用mprotect来修改该区域的权限,...讲一下mprotect函数,函数原型为int mprotect(const void *start, size_t len, int prot);, 该函数有三个参数,分别为: 要修改的内存地址 ==>...start 要修改的内存大小 ==> len 以及赋予多大的权限 ==> prot 也就是说,mprotect是把从addr开始的长度为length的内存空间的保护属性修改为prot的值。...需要注意的是mprotect修改权限时,是以一个内存页为最小单位的,也就是说,如果写入的长度没有达到一个内存页的大小(0x1000),mprotect认为修改一整个页的权限。...扩展即可,mprotect所对应的系统调用号可以在/usr/include/x86_64-linux-gnu/asm/unistd_64.h中所找到。

    32520

    android 的hook技术,Android Native Hook技术(一)

    void *)(pos+(i*4)), (void *)*p)) return -1; return 0; } 写入栈以后,shellcode并不能执行,因为当前Android都开启了栈执行保护,需要先通过mprotect...(),来修改栈的可执行权限: // 计算栈顶指针 regs.ARM_sp = regs.ARM_sp – n*4 – sizeof(sc); // 调用mprotect()设置栈可执行 regs.ARM_r0...\n”); regs.ARM_lr = codeaddr; // lr指向shellcode,mprotect()后执行 regs.ARM_pc = mprotectaddr; } // 旧版本Android...没有栈保护,Android 2.3引入 else { regs.ARM_pc = codeaddr; } 这段代码首先计算栈顶位置,接着将栈 起始地址/栈大小/权限位 3个参数压栈,然后调用mprotect...()函数设置栈的可执行权限,最后将lr寄存器设置为栈上代码的起始地址,这样当mprotect()函数返回后就可以正常执行栈上代码了。

    91710
    领券