在一些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

posted @ 2020-05-11 20:57  Rookle  阅读(2592)  评论(1编辑  收藏  举报