首页
学习
活动
专区
圈层
工具
发布

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段地址上,最后再次利用

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

    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']) #

    90710

    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中所找到。

    47820

    记一次爱加密企业版脱壳与反调试绕过

    提取所有内存数据由于反调试检测线程的libexec.bin库文件在程序启动后加载,具有延迟性,而mprotect又是在程序启动时就加载,所以可以在反调试生效前,hook mprotect提取加载时执行的所有代码拦截...mprotect 调用,检查内存权限更改,并强制将某些内存区域设置为 rwx,然后尝试进行内存转储,提取所有执行的代码,其中包括了解密后的dex文件var mprotect = Module.findExportByName...(null, "mprotect");     if (mprotect) {         Interceptor.attach(mprotect, {             onEnter: function...(标记可读内存)     var mprotect = Module.findExportByName(null, "mprotect");     if (mprotect) {         Interceptor.attach...(mprotect, {             onEnter: function (args) {                 this.addr = ptr(args[0].toString(

    2.4K30

    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()函数返回后就可以正常执行栈上代码了。

    1.3K10
    领券