-
-
[比赛]看雪.WiFi万能钥匙 CTF 2017第七题 点评及解题思路
-
发表于: 2017-6-28 18:47 3148
-
看雪CTF 2017 比赛进行至第七题
截止至今天中午12点,第七题破解人数为16人!
攻击方排名前十名变动较大,比赛排名有人升、有人降。
loudy上升4位,从第十升到第5位!
EricAzche也升到第7位,
本题过后,又一位新面孔冲进前十,kkHAIKE
谁会获得最终的大奖呢?最后的前十名又是谁呢?
期待ing......
接下来我们来回顾一下第六题
看看 看雪评委和出题者是怎么说的ヾ(๑╹◡╹)ノ"。
看雪评委 netwind 点评:
此题作者采用了多种反调试手段给攻击方增加了不少难度。通过int3 异常触发程序执行流程;通过TLS对OEP进行异或加密;通过对部分函数进行加密,让其以SMC动态解码的方式执行来保护函数不被调试分析;通过对程序进行自效验的方式,防止被篡改。算法上采用约瑟夫环变形处理。此题难在考察攻方选手绕过反调试的能力。
作者简介:
作者不问年少,本名蒋超。毕业于西南交大计算机系,现在铁路行业任数据库系统工程师。爱好计算机编程(熟悉C/c++/Basic等语言)、电影、游戏、逆向分析、跑步、象棋等。2008年左右接触看雪,我认识了很多朋友,谢谢你们的帮助,让我不断成长,也学到了很多新的知识!
看雪 CTF2017 第七题设计思路
注册码说明:原注册码为 bwns@pediy!后来根据要求全改为字母加数字,连空格都去掉了!
现注册码为:BwnsAtPediy2017KX9Ok
注册成功截图:
制作思路:
来源于约瑟夫环的变形处理。将一张码表看成一个圈,取用户输入的字符在码表中的下标。然后从此字符的下一字符处开始移动其下标值/5+5(这样做为了大幅度减少循环次数),然后取对应的字符,对此字符进行高5位低3位移位操作后,取其HEX字符进行验证。
验证方式为对每个字符的ASCII值/4的商,余数比较。(可由此进行注册码的反推。)
其他处理:
1、在Button中进行了特殊处理,使用int3异常开始游戏,必须触发异常,否则就退出了。
2、用TLS对OEP进行异或解密。
3、使用了SMC对显示对话框解码,解码的KEY即为用户输入的字符。此处用了try-catch包裹,故输入不正确的key不会崩溃。
4、StartGame函数也进行了 SMC 加密,运行时解密,完成后再加密。
5、对EXE加入简单自校验,使用MapFileCheckSum(测试发现此处360会误报木马),若发现改动,直接退出。
6、SMC均采用IDA直接查看地址后精确处理,无其它标记,制作稍麻烦。
关键代码:
序言:
本题采用TLS、SMC等反调试、反分析手段,算法为索引一个64字节“环”匹中密文再进行加密和隐藏比较,
并利用注册码进行SMC解码,想爆破都不容易!本题算法和防护手段都算上乘之作,无奈碰到了大神而饮恨。
本文是在提交答案之后重新写的,假设输入答案:BwnsAtPediy2017KX9Ok,节省笔墨纸砚,努力把文章写好。
一、查壳,试运行,分析TLS反调试
//首先查壳,Microsoft Linker(14.0)[EXE32],OD加载直接运行,OEP停不下来,噶么鬼?
//检查PE格式发现TLS
//勾选SOD插件“Break On Tls”,重新加载,跟踪40C120 TLS函数,看看都做了什么小动作
//加载停在了40C120
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 40 41 | 0040C120 55 PUSH EBP 0040C121 8BEC MOV EBP,ESP 0040C123 83EC 10 SUB ESP,0x10 0040C126 A1 84044000 MOV EAX, DWORD PTR DS:[0x400484] 0040C12B 33C5 XOR EAX,EBP 0040C12D 8945 FC MOV DWORD PTR SS:[EBP-0x4],EAX 0040C130 837D 0C 01 CMP DWORD PTR SS:[EBP+0xC],0x1 0040C134 53 PUSH EBX 0040C135 56 PUSH ESI 0040C136 57 PUSH EDI 0040C137 75 48 JNZ X7-不问少.0040C181 0040C139 8365 F0 00 AND DWORD PTR SS:[EBP-0x10],0x0 0040C13D 60 PUSHAD 0040C13E 64:A1 18000000 MOV EAX, DWORD PTR FS:[0x18] 0040C144 64:A1 18000000 MOV EAX, DWORD PTR FS:[0x18] 0040C14A 8B40 30 MOV EAX, DWORD PTR DS:[EAX+0x30] 0040C14D 8B40 08 MOV EAX, DWORD PTR DS:[EAX+0x8] 0040C150 8B58 3C MOV EBX, DWORD PTR DS:[EAX+0x3C] 0040C153 03D8 ADD EBX,EAX ; 取得PE头地址 0040C155 8B5B 28 MOV EBX, DWORD PTR DS:[EBX+0x28] 0040C158 03D8 ADD EBX,EAX ; 取得OEP 0040C15A 895D F0 MOV DWORD PTR SS:[EBP-0x10],EBX 0040C15D 61 POPAD 0040C15E 8D45 F4 LEA EAX, DWORD PTR SS:[EBP-0xC] 0040C161 C745 F4 EB7458CC MOV DWORD PTR SS:[EBP-0xC],0xCC5874EB 0040C168 66:C745 F8 E875 MOV WORD PTR SS:[EBP-0x8],0x75E8 0040C16E 6A 06 PUSH 0x6 ; 密钥长度 0x6 字节 0040C170 50 PUSH EAX ; 异或密钥 EB 74 58 CC E8 75 0040C171 68 C8000000 PUSH 0xC8 ; 解密 0xC8 字节 0040C176 FF75 F0 PUSH DWORD PTR SS:[EBP-0x10] ; OEP 起始地址 0040C179 E8 584C0000 CALL 7-不问少.00410DD6 ; 利用6字节密钥循环解密并清除OEP开始0xC8字节 0040C17E 83C4 10 ADD ESP,0x10 0040C181 8B4D FC MOV ECX, DWORD PTR SS:[EBP-0x4] 0040C184 5F POP EDI 0040C185 5E POP ESI 0040C186 33CD XOR ECX,EBP 0040C188 5B POP EBX 0040C189 E8 CD7D0000 CALL 7-不问少.00413F5B 0040C18E 8BE5 MOV ESP,EBP 0040C190 5D POP EBP 0040C191 C2 0C00 RETN 0x |
//使用6字节密钥“EB 74 58 CC E8 75”分别异或OEP入口0xC8字节代码,还原并清除了OD自动设置的OEP断点,所以载入就跑飞了。
//接下来对代码段设置内存访问断点,几次运行后就能断到OEP
1 2 | 00414422 > E8 16050000 CALL 7-不问少0041493D 00414427 ^ E9 5CFEFFFF JMP 7-不问少00414288 |
二、分析主体流程
//断点 bp GetDlgItemTextA,输入注册码,单击“开始验证”
1 2 3 4 5 | 0012FAE0 00410502 /CALL 到 GetDlgItemTextA 来自 7-不问少.004104FC 0012FAE4 000E02A0 |hWnd = 000E02A0 ( 'CrackMe By 不问年少' , class = '#32770' ) 0012FAE8 000003E8 |ControlID = 3E8 (1000.) 0012FAEC 0012FB20 |Buffer = 0012FB20 0012FAF0 00000064 \Count = 64 (100.) |
//断下来之后,返回主程序
1 2 3 4 5 6 7 8 9 10 11 12 | 004104F1 6A 64 PUSH 0x64 004104F3 50 PUSH EAX 004104F4 68 E8030000 PUSH 0x3E8 004104F9 FF76 04 PUSH DWORD PTR DS:[ESI+0x4] 004104FC FF15 283E4500 CALL DWORD PTR DS:[; user32.GetDlgItemTextA 00410520 C745 E8 5045444>MOV DWORD PTR SS:[EBP-0x18],0x49444550 00410527 53 PUSH EBX 00410528 BF 301B4100 MOV EDI,7-不问少.00411B30 0041052D C645 EC 59 MOV BYTE PTR SS:[EBP-0x14],0x59 ; PEDIY 00410531 57 PUSH EDI 00410532 E8 9F080000 CALL 7-不问少.00410DD6 |
//用“PEDIY”作为密钥,解密426字节,对应“CALL 00411B30”所需要的主算法程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 00410DD6 /$ 55 PUSH EBP 00410DD7 |. 8BEC MOV EBP,ESP 00410DD9 |. 8B4D 08 MOV ECX, DWORD PTR SS:[EBP+0x8] 00410DDC |. 56 PUSH ESI 00410DDD |. 33F6 XOR ESI,ESI 00410DDF |. 3975 0C CMP DWORD PTR SS:[EBP+0xC],ESI 00410DE2 |. 7E 17 JLE X7-不问少.00410DFB 00410DE4 |. 57 PUSH EDI 00410DE5 |. 8B7D 10 MOV EDI, DWORD PTR SS:[EBP+0x10] 00410DE8 |> 8BC6 /MOV EAX,ESI 00410DEA |. 99 |CDQ 00410DEB |. F77D 14 |IDIV DWORD PTR SS:[EBP+0x14] 00410DEE |. 8A043A |MOV AL, BYTE PTR DS:[EDX+EDI] 00410DF1 |. 3001 |XOR BYTE PTR DS:[ECX],AL 00410DF3 |. 41 |INC ECX 00410DF4 |. 46 |INC ESI 00410DF5 |. 3B75 0C |CMP ESI, DWORD PTR SS:[EBP+0xC] 00410DF8 |.^ 7C EE \JL X7-不问少.00410DE8 00410DFA |. 5F POP EDI 00410DFB |> 5E POP ESI 00410DFC |. 5D POP EBP 00410DFD \. C3 RETN |
//处理前
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 | 00411B30 3A 6D FC 6C 5F 15 45 AC 2E 7D 50 45 CF B8 6A 8B :m黮_E?}PE细j 00411B40 CC 19 B5 DA BC 5D C9 0C 51 D9 20 A0 C2 95 00 AD ?第糫?Q?犅? 00411B50 F7 A8 A6 AF 83 01 B5 58 D8 18 B8 C2 97 B8 3F 45 鳕Ο?礨?嘎椄?E 00411B60 49 59 D4 85 4B CD 02 51 45 44 C4 17 74 C8 01 41 IY詤K?QED?t?A 00411B70 62 98 31 4D 23 A6 03 15 AC F2 B6 AF BA CF 0C 41 b?M#?动合.A 00411B80 DD 08 B4 18 09 DD 08 9C C0 1C 80 CD 19 B9 D0 0D ??.?溊€?剐. 00411B90 9D CD 14 85 D9 18 A4 A1 EC 51 45 44 8F 1C AC 47 澩呝ぁ霶ED?珿 00411BA0 C9 04 51 DB 18 58 CA A2 40 CE 01 51 56 13 08 4C ?Q?X盛@?QVL 00411BB0 4A 98 D3 BE 54 C4 14 58 CE BC 46 1A 1D 4D 77 9B J樣綯?X渭FMw 00411BC0 78 05 A9 6F B0 62 98 4A 03 34 B5 D5 BA 30 45 D9 x﹐癰楯4嫡?E 00411BD0 61 89 05 0B 62 87 30 B3 C2 04 4C 76 8D C0 14 B8 a?b?陈Lv嵗 00411BE0 7C 09 99 56 DE F4 44 49 59 DB 38 9C 7A 99 10 CC |.橵摁DIY?渮? 00411BF0 39 A5 72 97 82 01 AD 5C 50 45 44 C0 1C 9C BA 31 9梻璡PED?満1 00411C00 AD DA AB 55 C9 0C 51 5F 06 01 41 5A 91 15 BB 3F 玌?Q_AZ?? 00411C10 5D AF 73 AC 7D AA AF BA CF 81 DA 94 55 7F 07 5D ]痵瑌合佢擴] 00411C20 24 25 CE 88 73 56 CD 43 3C 5C 63 9E 07 A2 5A 5F $%螆sV虲<\c?_ 00411C30 FB 9C CA 24 B8 45 CC 56 25 6E CE 01 85 5A 97 CC 麥?窫蘓%n?匷椞 00411C40 01 9D 6A AF 04 7F 07 5D 25 47 CF 47 56 EE 86 03 漥?]%G螱V顔 00411C50 D0 AE 2D A1 2E 4C 03 53 87 7F B1 2C B7 CE 39 A5 挟-?LS??肺9 00411C60 D3 91 6F 42 C1 5E 25 40 77 92 1A BB 46 4B F7 81 討oB羄%@w?籉K鱽 00411C70 D3 28 90 48 D1 4F 30 8E 46 E7 5F CE 42 C3 5D 51 ?怘袿0嶧鏮蜝胅Q 00411C80 CD 43 C2 14 B8 04 03 C0 14 B8 CC 39 A5 62 1D 95 虲???柑9 00411C90 39 41 D2 0D 59 AD 2D A6 AF BA C9 0C A9 00 BA 31 9A?Y?Ο荷.?? 00411CA0 95 A6 25 9D AC 85 AB AF BA C7 8D 55 DD 00 9C C4 暒%潿叓菎U?溎 00411CB0 17 5C 15 AC 7D A3 AF BA 77 92 D1 0D B9 C9 04 81 \瑌/簑捬.股 00411CC0 B8 8C 46 49 59 D3 08 B8 B6 D4 1D 4D 17 23 58 B8 笇FIY?付?M#X 00411CD0 4A AA B6 A6 B8 D6 66 49 59 92 JΩ謋IY?.j. |
//处理后
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 | 00411B30 6A 28 B8 25 06 45 00 E8 67 24 00 00 8B F1 33 DB j(?E.鑗$..嬹3 00411B40 89 5D FC 83 EC 18 8D 45 08 89 65 E4 8B CC 50 E8 塢鼉?岴塭鋴蘌 00411B50 B3 E1 FF FF C6 45 FC 01 88 5D FC 8B CE E8 7A 01 翅艵?圿鼖舞z 00411B60 00 00 84 C0 0F 84 5B 01 00 00 8D 4E 24 8D 45 08 ..劺刐..峃$岴 00411B70 3B C8 74 09 6A FF 53 50 E8 BB EF FF FF 8B 45 18 ;萾.jSP杌?婨 00411B80 8D 4D F0 51 50 8D 4D D8 89 45 D0 88 5D F0 89 5D 峂餛P峂貕E袌]饓] 00411B90 D8 89 5D DC 89 5D E0 E8 B5 01 00 00 C6 45 FC 02 貕]軌]噼?..艵? 00411BA0 8D 4D 08 8B 5D 1C 83 FB 10 8B 45 18 0F 43 4D 08 峂媇凔婨CM 00411BB0 03 C1 83 FB 10 8D 4D 08 8B F8 0F 43 4D 08 33 D2 羶?峂孁CM3 00411BC0 21 55 EC 2B F9 3B C8 0F 47 7D EC 85 FF 74 0C 80 !U???G}靺t.€ 00411BD0 31 CC 41 42 3B D7 75 F7 8B 5D 1C 33 C9 89 4D E8 1藺B;譽鲖]3蓧M 00411BE0 39 4D D0 0F 8E B1 00 00 00 8B 7D D8 33 C0 40 89 9M?幈...媫?繞 00411BF0 7D EC 2B C7 C7 45 E4 05 00 00 00 89 45 CC FF 75 }?乔E?...塃?u 00411C00 E4 83 FB 10 8D 45 08 0F 43 45 08 03 C1 50 FF 76 鋬?岴CE罰v 00411C10 04 FF 36 E8 34 F3 FF FF 8B C8 83 C4 10 3B 4E 04 6??嬋兡;N 00411C20 74 60 8A C1 2A 06 88 07 75 05 33 DB 43 EB 03 0F t`娏*?u3跜? 00411C30 BE D8 83 7D E8 00 88 1F 7C 3E 8B 45 CC 03 C7 89 矩儅??|>婨?菈 00411C40 45 D4 33 FF 41 3B 4E 04 75 02 8B 0E 0F BE C3 47 E?A;Nu?久G 00411C50 99 F7 7D E4 6A 05 5A 03 C2 3B F8 75 E7 8B 7D EC 欦}鋔Z?鴘鐙} 00411C60 8A C1 2A 06 88 07 75 05 33 DB 43 EB 03 0F BE D8 娏*?u3跜?矩 00411C70 83 6D D4 01 88 1F 75 CA 0F BE 0F 8B 06 8A 04 01 僲??u???? 00411C80 88 07 8B 4D E8 41 47 89 4D E8 89 7D EC 3B 4D D0 ?婱鐰G塎鑹}?M 00411C90 7D 08 8B 5D 1C E9 64 FF FF FF 8D 45 F0 50 FF 75 }媇閐岴餚u 00411CA0 DC FF 75 D8 E8 CC F2 FF FF 83 C4 0C 8D 45 D8 8D ?u罔舔兡.岴貚 00411CB0 4E 0C 50 E8 34 FA FF FF 33 DB 88 5D FC 8D 4D D8 N.P??3蹐]鼚M 00411CC0 E8 C9 02 00 00 83 4D FC FF 8D 4D 08 53 6A 01 E8 枭..僊?峂Sj 00411CD0 0F EE FF FF E8 93 22 00 00 C2 ?钃"..?.j |
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 | //IDA -- 处理426字节 char __cdecl sub_410DD6( int a1, signed int a2, int a3, signed int a4) { int v4; // ecx@1 signed int i; // esi@1 char result; // al@2 v4 = a1; for ( i = 0; i < a2; ++i ) { result = *(_BYTE *)(i % a4 + a3); *(_BYTE *)v4++ ^= result; } return result; } int __thiscall sub_40FD07( int this , int a2) { int v2; // esi@1 v2 = this ; *(_DWORD *)( this + 20) = 15; *(_DWORD *)( this + 16) = 0; *(_BYTE *) this = 0; sub_410B38(a2, 0, -1); return v2; } |
//继续跟踪主程序
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 | 00410518 6A 05 PUSH 0x5 0041051A 50 PUSH EAX 0041051B BB AA010000 MOV EBX,0x1AA 00410520 C745 E8 5045444>MOV DWORD PTR SS:[EBP-0x18],0x49444550 00410527 53 PUSH EBX 00410528 BF 301B4100 MOV EDI,7-不问少.00411B30 0041052D C645 EC 59 MOV BYTE PTR SS:[EBP-0x14],0x59 ; PEDIY 00410531 57 PUSH EDI 00410532 E8 9F080000 CALL 7-不问少.00410DD6 ; 用“PEDIY”作为密钥,解密426字节 00410537 51 PUSH ECX 00410538 51 PUSH ECX 00410539 8D85 68FFFFFF LEA EAX, DWORD PTR SS:[EBP-0x98] 0041053F 89A5 64FFFFFF MOV DWORD PTR SS:[EBP-0x9C],ESP 00410545 8BCC MOV ECX,ESP 00410547 50 PUSH EAX 00410548 E8 BAF7FFFF CALL 7-不问少.0040FD07 ; 字符串拷贝 0041054D C645 FC 01 MOV BYTE PTR SS:[EBP-0x4],0x1 00410551 C645 FC 00 MOV BYTE PTR SS:[EBP-0x4],0x0 00410555 8D4E 40 LEA ECX, DWORD PTR DS:[ESI+0x40] 00410558 E8 D3150000 CALL 7-不问少.00411B30 ; Function2 0041055D 6A 05 PUSH 0x5 0041055F 8D45 E8 LEA EAX, DWORD PTR SS:[EBP-0x18] 00410562 50 PUSH EAX 00410563 53 PUSH EBX 00410564 57 PUSH EDI 00410565 E8 6C080000 CALL 7-不问少.00410DD6 0041056A 83C4 10 ADD ESP,0x10 0041056D 8D4E 40 LEA ECX, DWORD PTR DS:[ESI+0x40] 00410570 E8 B0120000 CALL 7-不问少.00411825 ; check |
三、分析算法程序
//断点410558,断下后单步跟进 CALL 00411B30
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 00411BBA |. 0F434D 08 CMOVNB ECX, DWORD PTR SS:[EBP+0x8] ; 取input 00411BBE |. 33D2 XOR EDX,EDX 00411BC0 |. 2155 EC AND DWORD PTR SS:[EBP-0x14],EDX 00411BC3 |. 2BF9 SUB EDI,ECX ; 位数 00411BC5 |. 3BC8 CMP ECX,EAX 00411BC7 |. 0F477D EC CMOVA EDI, DWORD PTR SS:[EBP-0x14] ; 位数结束 00411BCB |. 85FF TEST EDI,EDI 00411BCD |. 74 0C JE X7-不问少.00411BDB 00411BCF |> 8031 CC /XOR BYTE PTR DS:[ECX],0xCC ; 将用户输入input[]每一位与0xCC异或 00411BD2 |. 41 |INC ECX 00411BD3 |. 42 |INC EDX 00411BD4 |. 3BD7 |CMP EDX,EDI 00411BD6 |.^ 75 F7 \JNZ X7-不问少.00411BCF 00411BD8 |. 8B5D 1C MOV EBX, DWORD PTR SS:[EBP+0x1C] |
//Array1:(用户输入与0xCC异或后)
1 2 3 4 5 6 7 8 9 10 11 12 13 | 0068F9B0 8E BB A2 BF 8D B8 9C A9 A8 A5 B5 FE FC FD FB 87 幓⒖嵏湬ē叠麌 0068F9C0 94 F5 83 A7 00411BF4 |. C745 E4 05000>MOV DWORD PTR SS:[EBP-0x1C],0x5 ; 5 00411BFB |. 8945 CC MOV DWORD PTR SS:[EBP-0x34],EAX 00411BFE |> FF75 E4 /PUSH DWORD PTR SS:[EBP-0x1C] ; 5 00411C01 |. 83FB 10 |CMP EBX,0x10 00411C04 |. 8D45 08 |LEA EAX, DWORD PTR SS:[EBP+0x8] 00411C07 |. 0F4345 08 |CMOVNB EAX, DWORD PTR SS:[EBP+0x8] 00411C0B |. 03C1 |ADD EAX,ECX 00411C0D |. 50 |PUSH EAX ; xor_input 00411C0E |. FF76 04 |PUSH DWORD PTR DS:[ESI+0x4] 00411C11 |. FF36 |PUSH DWORD PTR DS:[ESI] ; 注意 [esi] |
Array2:(64字节)
1 2 3 4 | 00684C90 89 BC 95 FC FB BA ED 9A BB AE FE 99 A2 98 B9 F9 壖朁須划郭 00684CA0 9F 84 9C FD 83 AD B6 A9 A5 F5 8C A7 9E 96 8A F4 焺滮儹订ヵ導灃婔 00684CB0 85 BE A8 8F 86 AF 88 9D 87 BF FF A1 8B 81 A0 AB 吘◤啹垵嚳仩? 00684CC0 8E BD B5 AA 82 94 A4 8D A3 F8 B4 FA 9B A6 B8 80 幗氮倲x代洣竴 |
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | 00411BFE |> /FF75 E4 /PUSH DWORD PTR SS:[EBP-0x1C] 00411C01 |. |83FB 10 |CMP EBX,0x10 00411C04 |. |8D45 08 |LEA EAX, DWORD PTR SS:[EBP+0x8] 00411C07 |. |0F4345 08 |CMOVNB EAX, DWORD PTR SS:[EBP+0x8] 00411C0B |. |03C1 |ADD EAX,ECX 00411C0D |. |50 |PUSH EAX 00411C0E |. |FF76 04 |PUSH DWORD PTR DS:[ESI+0x4] 00411C11 |. |FF36 |PUSH DWORD PTR DS:[ESI] 00411C13 |. |E8 34F3FFFF |CALL 7-不问少.00410F4C ; Array1 逐位搜索在 Array2 中的位置 00411C18 |. |8BC8 |MOV ECX,EAX 00411C1A |. |83C4 10 |ADD ESP,0x10 00411C1D |. |3B4E 04 |CMP ECX, DWORD PTR DS:[ESI+0x4] ; 不超出数组下限 00411C20 |. |74 60 |JE X7-不问少.00411C82 00411C22 |. |8AC1 |MOV AL,CL 00411C24 |. |2A06 |SUB AL, BYTE PTR DS:[ESI] ; Array2 下标,如果索引超出下标就回头,类似一个环 00411C26 |. |8807 |MOV BYTE PTR DS:[EDI],AL 00411C28 |. |75 05 |JNZ X7-不问少.00411C2F 00411C2A |. |33DB |XOR EBX,EBX 00411C2C |. |43 |INC EBX 00411C2D |. |EB 03 |JMP X7-不问少.00411C32 00411C2F |> |0FBED8 |MOVSX EBX,AL 00411C32 |> |837D E8 00 |CMP DWORD PTR SS:[EBP-0x18],0x0 ; 计数器 00411C36 |. |881F |MOV BYTE PTR DS:[EDI],BL 00411C38 |. |7C 3E |JL X7-不问少.00411C78 00411C3A |. |8B45 CC |MOV EAX, DWORD PTR SS:[EBP-0x34] 00411C3D |. |03C7 |ADD EAX,EDI 00411C3F |. |8945 D4 |MOV DWORD PTR SS:[EBP-0x2C],EAX ; 小循环次数 00411C42 |> |33FF |/XOR EDI,EDI 00411C44 |> |41 ||/INC ECX 00411C45 |. |3B4E 04 |||CMP ECX, DWORD PTR DS:[ESI+0x4] 00411C48 |. |75 02 |||JNZ X7-不问少.00411C4C 00411C4A |. |8B0E |||MOV ECX, DWORD PTR DS:[ESI] 00411C4C |> |0FBEC3 |||MOVSX EAX,BL ; 最近一次匹中Array2的下标 00411C4F |. |47 |||INC EDI 00411C50 |. |99 |||CDQ 00411C51 |. |F77D E4 |||IDIV DWORD PTR SS:[EBP-0x1C] 00411C54 |. |6A 05 |||PUSH 0x5 00411C56 |. |5A |||POP EDX 00411C57 |. |03C2 |||ADD EAX,EDX 00411C59 |. |3BF8 |||CMP EDI,EAX 00411C5B |.^|75 E7 ||\JNZ X7-不问少.00411C44 ; 小间隔定位 00411C5D |. |8B7D EC ||MOV EDI, DWORD PTR SS:[EBP-0x14] 00411C60 |. |8AC1 ||MOV AL,CL 00411C62 |. |2A06 ||SUB AL, BYTE PTR DS:[ESI] ; Array2 下标 (小间隔) 00411C64 |. |8807 ||MOV BYTE PTR DS:[EDI],AL ; 就是个索引算法,详细见附件Python 00411C66 |. |75 05 ||JNZ X7-不问少.00411C6D 00411C68 |. |33DB ||XOR EBX,EBX 00411C6A |. |43 ||INC EBX 00411C6B |. |EB 03 ||JMP X7-不问少.00411C70 00411C6D |> |0FBED8 ||MOVSX EBX,AL 00411C70 |> |836D D4 01 ||SUB DWORD PTR SS:[EBP-0x2C],0x1 ; 小间隔循环次数 00411C74 |. |881F ||MOV BYTE PTR DS:[EDI],BL 00411C76 |.^|75 CA |\JNZ X7-不问少.00411C42 00411C78 |> |0FBE0F |MOVSX ECX, BYTE PTR DS:[EDI] 00411C7B |. |8B06 |MOV EAX, DWORD PTR DS:[ESI] 00411C7D |. |8A0401 |MOV AL, BYTE PTR DS:[ECX+EAX] 00411C80 |. |8807 |MOV BYTE PTR DS:[EDI],AL 00411C82 |> |8B4D E8 |MOV ECX, DWORD PTR SS:[EBP-0x18] 00411C85 |. |41 |INC ECX 00411C86 |. |47 |INC EDI 00411C87 |. |894D E8 |MOV DWORD PTR SS:[EBP-0x18],ECX 00411C8A |. |897D EC |MOV DWORD PTR SS:[EBP-0x14],EDI 00411C8D |. |3B4D D0 |CMP ECX, DWORD PTR SS:[EBP-0x30] ; 位数 00411C90 |. |7D 08 |JGE X7-不问少.00411C9A 00411C92 |. |8B5D 1C |MOV EBX, DWORD PTR SS:[EBP+0x1C] 00411C95 |.^\E9 64FFFFFF \JMP 7-不问少.00411BFE |
//在Array2环中索引查询结果
//Array3:
1 2 | 001D29B8 B8 AD AF 9C 9D BB 85 BF F9 BB BE 99 B8 A1 9C 99 腑瘻澔吙緳浮湙 001D29C8 8C 85 9A A4 寘殼B. |
//对Array3再次异或、移位、与等加密,结果还是更新到Array3中
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 | 00411C9D |. 50 PUSH EAX 00411C9E |. FF75 DC PUSH DWORD PTR SS:[EBP-0x24] 00411CA1 |. FF75 D8 PUSH DWORD PTR SS:[EBP-0x28] 00411CA4 |. E8 CCF2FFFF CALL 7-不问少.00410F75 ; Array3 异或 移位 与 等,结果还是存到 Array3 char __cdecl sub_410F75(unsigned int arrary3, unsigned int a2) { unsigned int arrary3_; // edx@1 char result; // al@1 int len; // esi@1 int i; // edi@1 arrary3_ = arrary3; result = 0; len = a2 - arrary3; i = 0; if ( arrary3 > a2 ) len = 0; if ( len ) { do { result = 8 * (*(_BYTE *)arrary3_ ^ 0xCC) | (( char )(*(_BYTE *)arrary3_ ^ 0xCC) >> 5); *(_BYTE *)arrary3_++ = result; ++i; } while ( i != len ); } return result; } |
//加密后的Array3
1 2 | 001D29B8 A3 0B 1B 82 8A BB 4A 9B A9 BB 93 AA A3 6B 82 AA ?倞籎洨粨k偑 001D29C8 02 4A B2 43 J睠B |
更多 http://www.kanxue.com/article-1527.htm
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- [话题] 9月10日 教师节到了,说说你记忆深刻的老师 4519
- [原创] 我和程序猿男朋友的爱恨情仇【结帖】 8666
- [推荐]看雪杯AFSRC造洞节,最棒的福利送给看雪的你! 6463
- [注意]某白帽未授权渗透测试政府网站被抓 8526
- [分享] 本周 安全类会议 大汇总 4688