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

  • 相关阅读:
    java怎样将一组对象传入Oracle存储过程
    android webview内容压线问题解决方法
    BS和CS对比
    【OpenCV-Python】Python Extension Packages for Windows
    hdu4462 Scaring the Birds
    tomcat安全配置之证书密码加密存储
    UVA 10714 Ants 蚂蚁 贪心+模拟 水题
    一个不喜欢读书的Javaer的读书单
    二叉树可视化--Graphviz
    [置顶] mmog游戏开发之业务篇
  • 原文地址:https://www.cnblogs.com/Rookle/p/12871878.html
Copyright © 2011-2022 走看看