zoukankan      html  css  js  c++  java
  • 在一些64位的glibc的payload调用system函数失败问题

    在一些64位的glibc的payload调用system函数失败问题

    当我在做题的时候就发现一个奇怪的事情,我在ubuntu16.04运行成功的exp在ubuntu 18.04却报出了timeout: the monitored command dumped core的错误。我觉得很奇怪,一些新的64位的glibc在控制了程序流后,调用system函数的时候,会直接crash,经过调试之后,终于发现了问题所在。

    // gcc -g -no-pie -Og shell.c -o shell
    #include <stdlib.h>
    int main()
    {
        system("/bin/sh");
        return 0;
    }
    

    程序编译之后是能正常运行的,但是我们要的是让程序不正常运行。

    image-20200427131939801

    ldd查看一下所用的libc

    image-20200427132543261

    我们将libc拷贝出来,分析一下。

    image-20200427132744647

    我们们把断点下到这一条指令。

    image-20200427133206008

    可以看到$rsp+0x40的地址是16字节对齐的。

    image-20200427133251926

    我们使用set $rsp=$rsp+1使得rsp加一

    image-20200427133438144

    此时$rsp+0x40的值就不是16字节对齐了,我们使程序继续运行.

    image-20200427133536577

    可以看到程序crash掉了。

    image-20200427133805207

    我从网上查了一下movaps这条指令。

    movaps  XMM,XMM/m128 
    movaps  XMM/m128,XMM
    

    把源存储器内容值送入目的寄存器,当有m128时, 内存地址必须是16字节对齐的

    XMMWORD旨在表示与m128相同的类型,刚好这里符合第二条。

    解决办法

    主要问题就是改变栈的地址。

    1. 改变payload的长度或填充一些其他的指令。

      原本的payload,运行后栈如下
      ret  pop_rdi_ret
           bin_sh
           system
          
      我们增加一些额外的指令,ret,ret 1,ret 2,ret 3等等
      ret  ret
           pop_rdi_ret
           bin_sh
           system
      
    2. 如果有现成的后门可以用,改变返回地址的值在调用system函数,如下图我们可以尝试ret的地址为箭头的地址。与1的思路差不多。

      image-20200427135052948

    3. 当payload有长度限制的时候,我们可以尝试进行栈转移来进行栈地址的改变,如果遇到了没有对齐的情况就继续将栈地址+1,直到遇到栈对齐的情况。

    4. 调用execve

  • 相关阅读:
    sqli-libs(3)
    python学习之路(18)
    BZOJ3534:[SDOI2014]重建——题解
    洛谷省选斗兽场全通关祭~以及之后的打算!
    BZOJ4596:[SHOI2016]黑暗前的幻想乡——题解
    BZOJ2732:[HNOI2012]射箭——题解
    BZOJ1486:[HNOI2009]最小圈——题解
    BZOJ4552:[HEOI2016/TJOI2016]排序——题解
    BZOJ2830 & 洛谷3830:[SHOI2012]随机树——题解
    BZOJ4889 & 洛谷3759:[TJOI2017]不勤劳的图书管理员——题解
  • 原文地址:https://www.cnblogs.com/Rookle/p/12871878.html
Copyright © 2011-2022 走看看