在一些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;
}
程序编译之后是能正常运行的,但是我们要的是让程序不正常运行。
ldd查看一下所用的libc
我们将libc拷贝出来,分析一下。
我们们把断点下到这一条指令。
可以看到$rsp+0x40的地址是16字节对齐的。
我们使用set $rsp=$rsp+1
使得rsp加一
此时$rsp+0x40
的值就不是16字节对齐了,我们使程序继续运行.
可以看到程序crash掉了。
我从网上查了一下movaps这条指令。
movaps XMM,XMM/m128
movaps XMM/m128,XMM
把源存储器内容值送入目的寄存器,当有m128时, 内存地址必须是16字节对齐的。
XMMWORD旨在表示与m128相同的类型,刚好这里符合第二条。
解决办法
主要问题就是改变栈的地址。
-
改变payload的长度或填充一些其他的指令。
原本的payload,运行后栈如下 ret pop_rdi_ret bin_sh system 我们增加一些额外的指令,ret,ret 1,ret 2,ret 3等等 ret ret pop_rdi_ret bin_sh system
-
如果有现成的后门可以用,改变返回地址的值在调用system函数,如下图我们可以尝试ret的地址为箭头的地址。与1的思路差不多。
-
当payload有长度限制的时候,我们可以尝试进行栈转移来进行栈地址的改变,如果遇到了没有对齐的情况就继续将栈地址
+1
,直到遇到栈对齐的情况。 -
调用execve