几天前从朋友那得到一个被感染的文件,大致分析了一下,该病毒并没有修改被感染程序的入口点先执行自己的代码再跳回原程序,只是加了一个区段,然后在在程序正常执行的流程中添加了一个call指向病毒代码,完成后在jmp回原程序继续执行。
004128EA . E8 F1FEFFFF call 004127E0
004128EF . 59 pop ecx
004128F0 > E8 22350000 call 00415E17
004128F5 . 8975 FC mov dword ptr [ebp-4], esi
004128F8 . E8 F3BA0200 call 0043E3F0 //指向病毒代码
004128FD . 85C0 test eax, eax
004128FF . 7D 08 jge short 00412909
00412901 . 6A 1B push 1B
00412903 . E8 B3FEFFFF call 004127BB
00412908 . 59 pop ecx
00412909 > FF15 00414200 call dword ptr [<&KERNEL32.GetCommand>; [GetCommandLineA
然后又是一个call到真正的病毒代码执行部分。
0043E3D2 E8 37000000 call 0043E40E //指向真正病毒代码
0043E3D7 - E9 C3E2FDFF jmp 0041C69F //病毒代码执行完后跳回原地址继续执行
0043E3DC E8 2D000000 call 0043E40E
0043E3E1 - E9 D488FCFF jmp 00406CBA
0043E3E6 E8 23000000 call 0043E40E
0043E3EB - E9 30D2FCFF jmp 0040B620
0043E3F0 E8 19000000 call 0043E40E
0043E3F5 - E9 F9ACFDFF jmp 004190F3
0043E3FA E8 0F000000 call 0043E40E
0043E3FF - E9 7C9FFDFF jmp 00418380
0043E404 E8 05000000 call 0043E40E
0043E409 - E9 FBFCFDFF jmp 0041E109
正好最近没什么事,所以打算写一个该程序的修复程序,练练手,原来的思路是遍历代码段,找E8,然后得到后面调用地址,比较是否是在病毒代码的区段,如果是再得到jmp 正常地址,用这条代码替换call 病毒代码。
但在写的过程中才发现,这样写是不行,因为E8也可能是数据或其他,不一定就是call。这一下我的思路就中断了,就在我思索有什么更好的办法修复程序的时候,突然想到病毒代码执行后会执行到jmp正常程序地址,我只要把病毒代码部分的第一句改成ret,就可以隔离病毒代码部分,完成修复了。
有了这个思路就好写代码了,只要找到感染代码入口的特征,然后把第一句代码改为ret就行了,具体代码怎么写就不说了,相信有点编程序基础的,这点小事是完全没问题的。
如果大家有更好的思路请告诉我,一起进步。
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界