如何编写一段内存蠕虫?

安全 应用安全
我们怎么写一段代码,能够在程序内存里面不停移动?就是让shellcode代码能在内存中不停的复制自己,并且一直执行下去,也就是内存蠕虫。

我们怎么写一段代码,能够在程序内存里面不停移动?就是让shellcode代码能在内存中不停的复制自己,并且一直执行下去,也就是内存蠕虫。我们要把shellcode代码偏移出蠕虫长度再复制到蠕虫后面的内存中,然后执行。

[[320925]]

我们在实现过程中同时把前面同长度代码变成\x90,那个就是虫子走过的路,最终吃掉所有的内存。实现这个我们要知道shellcode长度,并且计算好shellcode每次移动的位置是多少。我们的shllcode以调用printf函数为例。

1. 写出printf程序

#include "stdio.h" 
int main() 

    printf("begin\n"); 
    char *str="a=%d\n"
     
    __asm{ 
        mov eax,5 
        push eax 
        push str 
        mov eax,0x00401070   
        call eax 
        add esp,8 
        ret 
    } 
        return 0; 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

0×00401070 是我机子上printf的地址,将自己机子上的printf地址更换一下就行,还要在最后加一个ret,因为执行完shellcode还要回到复制shellcode的代码执行。

上面汇编转成shellcode形式,shellcode为:

char shellcode[]="\xB8\x05\x00\x00\x00\x50\xFF\x75\xFC\xB8\x70\x10\x40\x00\xFF\xD0\x83\x**\x08\xc3"; 
  • 1.

2. 编写蠕虫代码

insect:mov bl,byte ptr ds:[eax+edx] 
       mov byte ptr ds:[eax+edx+20],bl 
       mov byte ptr ds:[eax+edx],0x90 
       inc edx 
       cmp edx,20 
       je ee 
       jmp insect 
        
ee:     add eax,20 
        push eax 
        call eax 
        pop eax 
        xor edx,edx 
        jmp insect 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

shellcode长度是20,假设数据的地址是s,我们把数据复制到地址为s+20处,原来的数据变为0×90,表示数据曾经来过这里,insect段是用来复制数据用到,复制了20次,刚刚好把shellcode复制完。

因为shellcode相当于向下移动20位,所以我们要把eax加上20,还要把edx恢复成0,方便下次接着复制,然后去执行我们的shellcode,接着跳转到insect段继续执行,这是ee段干的事。

inscet和ee段加起来是复制我们的shellcode到其他地方,然后去执行shellcode,然后再复制,循环下去。

3. 最终程序

#include "stdio.h" 
 
char shellcode[]="\xB8\x05\x00\x00\x00\x50\xFF\x75\xFC\xB8\x70\x10\x40\x00\xFF\xD0\x83\x**\x08\xc3"; 
int main() 

    printf("begin\n"); 
    char *str="a=%d\n"
     
     
    __asm{ 
         
        lea eax,shellcode 
        push eax 
        call eax 
        pop eax 
        xor edx,edx 
             
insect:mov bl,byte ptr ds:[eax+edx] 
       mov byte ptr ds:[eax+edx+20],bl 
       mov byte ptr ds:[eax+edx],0x90 
       inc edx 
       cmp edx,20 
       je ee 
       jmp insect 
        
ee:     add eax,20 
        push eax 
        call eax 
        pop eax 
        xor edx,edx 
        jmp insect 
 
 
         
    } 
     
     
    return 0; 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.

调试的时候找到shellcode位置,一步步调试能看见shellcode被复制,原来的转成0×90,并且printf还被执行

没有复制前:

复制后:

4. 总结

我们要先计算出shellcode的长度,计算好shellcode每次移动的位置是多少,然后写出复制程序,并且还要有调转到复制后的shellcode首地址程序,执行复制后的shellcode,接着在复制再执行,循环下去,当然在一段内存里循环执行也可以,只要找到位置,跳转过去就行

 

责任编辑:赵宁宁 来源: FreeBuf
相关推荐

2015-03-27 11:34:59

JavaJava编写引发内存泄露

2022-06-21 12:27:12

JavaScript前端

2018-11-02 16:16:41

程序硬盘存储

2009-11-07 11:18:57

2020-10-26 10:11:45

Jupyter Not早起Python开发

2014-03-21 09:58:08

比特币

2014-07-08 09:21:10

死代码创意歌曲

2018-06-23 08:02:31

程序员代码故事

2018-06-19 08:02:00

统计程序微信

2020-12-31 10:14:42

防注入代码绕过

2021-02-04 07:55:28

代码离职互联网

2021-01-04 05:58:57

WindowsXP微软操作系统

2014-09-09 14:47:20

2020-04-29 10:19:29

Python数据函数

2022-02-08 09:00:00

智能自动化人工智能RPA

2021-04-08 09:14:24

js前端函数

2017-11-20 16:44:59

云端算力

2019-10-14 09:51:08

爬虫网络系统

2019-10-18 09:39:44

爬虫消息大数据

2021-08-10 05:49:10

网络协议C语言Linux操作
点赞
收藏

51CTO技术栈公众号