事前准备
nx pie 32 小端序
看看ida
字符串里面没东西
就调用了一个函数,名字有点奇怪,点进去看看
int 80、11、eax、还有binsh字符串.....这些东西是触发execve的getshell所需要的一些元素 简单来说,在此种方法的32b环境下需要eax=11 ebx=sh字符串,ecx=0(或者指向sh字符串),edx=0(详细内容自行学习ret2syscall),ida又说eax就是result.......
漏洞及其利用思路
推测就是exceve方法的getshell,看伪c还缺点东西(ecx和edx的0)但是这个程序没有溢出点(main就调用了这一个getshell函数,而这个被调用的函数又没有什么溢出点给你用,除了系统调用没东西了),我怀疑他是直接把shell给你了....但是这个猜想确实离谱,可也没其他可能了,我就去本地运行了一下这个程序。
好吧确实是这样(ls的东西是我这个程序文件夹的名字,重点在于,可以运行ls了,说明已经有shell了)既然伪c没东西了,那说明汇编应该会告诉我们什么
下面我把int80前重要的语句全部讲一下:
ret2syscall简介
但在讲这个之前,简要讲一下syscall的内容吧,int 80是系统级调用的一个,触发此中断后可以执行一些函数,通过eax指向的编号调用。其中execve的编号就是11.像system很经典的system(‘‘/bin/sh’’)execve对应的就是execve("/bin/sh",0,0)(或第二个参数同样是sh字符串)
一般如果是手动触发syscall,通过往栈中写入数据后pop部署好寄存器后执行syscall
了解了这些之后,我们再来看看上面的代码段
这几个蓝色句子下面对应的就是它的汇编段
函数调用后进行最基本的ebp esp指向在此之前并没有发生栈调用,所以ebp与esp重合(这里以及后面的寄存器情况截图是gdb调试里的,就b下断点然后 n下一句遇到函数调用s一下,逐步观察就行了,一些很基本的操作,我不多做赘述)
异或使edx指向0(xor不同为1,结果存edx中)
将edx(0)压入栈中
因为是小端序以及栈数据结构的特点,逆序压入字符串(实际上压入的对应的ascii码,我为了便于观看在ida中对字符串按了r使其变为字符串形式显示)
esp此时指向的栈顶正是sh的字符串,所以这里通过mov的方式使ebx指向了sh字符串,再使0入栈
将ebx中存的sh字符串入栈,然后将其放入ecx
放入了一个数,然后用前后数相减的方式使eax指向了11
至此寄存器已经部署完毕,触发80中断getshell
以上便是此函数是如何getshell的过程解释
(这题直接给shell我就懒得写exp了,直接手动nc)