Shellcode入门

Shellcode入门shell

1、shellcode基础知识编程

  Shellcode实际是一段代码(也能够是填充数据),是用来发送到服务器利用特定漏洞的代码,通常能够获取权限。另外,Shellcode通常是做为数据发送给受攻击服务器的。 Shellcode是溢出程序和蠕虫病毒的核心,提到它天然就会和漏洞联想在一块儿,毕竟Shellcode只对没有打补丁的主机有用武之地。网络上数以万计带着漏洞顽强运行着的服务器给hackerVxer丰盛的晚餐。漏洞利用中最关键的是Shellcode的编写。因为漏洞发现者在漏洞发现之初并不会给出完整Shellcode,所以掌握Shellcode编写技术就显得尤其重要。数组

  Shellcode本质上可使用任何编程语言,但咱们须要的是提取其中的机器码。Shellcode使用汇编语言编写是最具可控性的,由于咱们彻底能够经过指令控制代码生成,缺点就是须要大量的时间,并且还要你深刻了解汇编。若是你想追求速度,C是不错的选择。C语言编写起来较为省力,但Shellcode提取较为复杂,不过,一旦写好模板,就省事许多。服务器

2、用C语言编写获取shellcode网络

1.用于获取shellcodeC语言代码编程语言

2.编译与执行函数

execve(执行文件)在父进程中fork一个子进程,在子进程中调用exec函数启动新的程序。execve()用来执行第一参数字符串所表明的文件路径,第二个参数是利用指针数组来传递给执行文件,而且须要以空指针(NULL)结束,最后一个参数则为传递给执行文件的新环境变量数组。从图中能够,若是经过C语言调用execve来返回shell的话,首先须要引入相应的头文件,而后在主函数中调用系统调用函数execve;同时传入三个参数。spa

编译以后运行结果以下图3d

为了以后可以看到反汇编的结果,此次采用的静态编译。正常返回shell指针

3.objdump反汇编

那么要想提取其中的shellcode就须要经过反汇编来获取相应的汇编代码或是二进制代码。

  注:(1)个人这个实践中scode.cxxyshellcode.c的副本,二者内容一致

      2)编译时必需要有64位到32位的转换:-m32,否则后续位数不匹配容易出问题

  

 4.采用gdb查看主函数mainexecve的反汇编结果

 

从反汇编结果来看,execve函数执行的前一部分首先将向寄存器ebx,ecx,edx中赋值。以后调用了(*0x80e8a90)处的代码,该处就是_dl_sysinfo_int80,反汇编后发现实际上是经过中断指令int 0x80进入ring0。也就是说exceve函数是经过调用软中断int 0x80进入ring0

5.验证int 0x80调用

Shellcode的提取就是要获取exceve函数调用时的参数及软中断调用。经过软终端加载相应的系统调用号及参数来执行相应的任务。

  

  查看四个寄存器。

前面咱们已经提过了execve系统调用的参数部分。看看上图的寄存器赋值,第1个参数ebx,恰好是"/bin/sh";第2个参数ecx是一个指针数组,第一个元素是第一个参数地址,第二个元素为空;第3个参数是edx为空。最后execve的系统调用号就放在了寄存器eax=0xb

而经过查找系统的execve函数调用号就是110xb

  6Shellcode的提取

由上面能够看出若是想要获得shellcode就须要将部分指令代码拼接。组成execve的系统调用以下图所示。(两块红色区域机器码拼接)

  

  

尽管这样能够实现shell返回的shellcode,可是里面包含里不少\x00空字符,只要在单独拷贝shellcode就颇有可能致使shellcode阶段而不能正常执行shellcode,须要进行进一步加工,过于麻烦这里不详述。

3、用汇编语言形式写出shellcode

1.编写汇编源码,下图是一个返回shell的汇编源码

  

2.编译、连接、执行

连接过程当中出现问题i386 architecture模式与i386:x86-64模式不匹配,须要多输入"-m elf_i386"转换一下

  

  执行以后成功返回shell

3.汇编代码分析

根据以前int 0x80中断指令调用形式,要求eax存放系统调用号;ebxecxedx分别存放参数部分。

汇编源码中,首先是第4eax清零;以后第5行压栈;而后第6行,第7行字符串压栈,这样在栈中就构造了以"\x00"结尾的字符串"/bin//sh"。注意这里的"/bin//sh""/bin/sh"一样效果。

 此时的ESP指针指向了这个字符串首地址,第8行将该首地址赋给ebx,这样就有了int 0x80中断指令的第一个参数ebx;第9行中eax入栈,此时eax值仍是0;第10ebx入栈也就是把字符串"/bin//sh"地址入栈,两次压栈,此时栈中就有了字符串地址和一个0,恰好构成了一个指针数组;第11行将该指针数组的地址也就是esp赋给ecx,系统调用的第2个参数ecx中就保持了指针数组的地址;第12edx清零,恰好是系统调用的第3个参数为零。第13行将系统调用号0xB赋给al,这样能够避免出现坏字符。最后调用软中断指令执行。

  栈空间的模型:

  

4.shellcode的提取

  

红框中的机器码就是该shellcode对应的指令代码,中间没有\x00坏字符,这样在拷贝时也就不会有截断问题

5.shellcode有效性的验证

  经过一小段C语言代码来进行验证,代码以下(由上面提取到的shellcode指令代码而来)

 

  

  调试运行,发现"segmentation fault"

  

  编译时对该程序启动栈空间可执行权限,问题解除。

  

相关文章
相关标签/搜索