加载中…
个人资料
elecs
elecs
  • 博客等级:
  • 博客积分:0
  • 博客访问:53,406
  • 关注人气:1
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
正文 字体大小:

看雪CTF-2017秋季赛第三题

(2018-11-19 11:17:34)
标签:

摩斯电码

sm3

分类: 信息安全

通过IDA查找字符串,发现下列信息很可疑

看雪CTF-2017秋季赛第三题

上网查,使用了摩斯电码。 

通过字符串“CrackMe”、“ok”找到核心判断流程

看雪CTF-2017秋季赛第三题

通过Resource Hacker查找验证按钮的id=3EA,找到处理函数。

看雪CTF-2017秋季赛第三题

有反调试无法调试。设置断点(00435014 cmp  [ebp+var_1A40], 3EAh)后,点击验证,窗口无反应。

IDAstrings窗口发现了ollydbg.exe, idag.exe, ollyice.exe, windbg.exe, services.exe, cmd.exe等可以字符,以此为线索发现了下列反调试函数:

 

1. IsDebuggerPresent  3处, 改成mov eax,0

 

00439ADF call    ds:IsDebuggerPresent

0043D61D call    ds:IsDebuggerPresent

0044593F call    ds:IsDebuggerPresent

 

2. sub_431190:检查调试器,改成mov eax, 0

00434A98 call    sub_42E26B

00434B4E call    sub_42E26B

 

3. sub_430E80:检测调试器. eax=1表示找到调试器,改成mov eax,0

00434AB7 call    sub_42D7F8

00434B6D call    sub_42D7F8

 

4. CheckRemoteDebuggerPresent? eax=1表示找到调试器,改成mov eax,0

.text:00430078 push    offset aCheckremotedeb ; "CheckRemoteDebuggerPresent"

.text:0043007D mov     eax, [ebp+hModule]

.text:00430080 push    eax             ; hModule

.text:00430081 call    ds:GetProcAddress

 

00435E84 call    sub_42D23F   //改成mov eax, 0

 

.text:00432A41 push    offset aCheckremotedeb ; "CheckRemoteDebuggerPresent"

.text:00432A46 mov     eax, [ebp+hModule]

.text:00432A49 push    eax             ; hModule

.text:00432A4A call    ds:GetProcAddress

 

004354D2 call    sub_42D096  //改成mov eax, 0

 

5. ZwQueryInformationProces eax=1表示找到调试器,改成mov eax,0

.text:004301B1 push    offset aZwqueryinforma ; "ZwQueryInformationProcess"

.text:004301B6 mov     eax, [ebp+hModule]

.text:004301B9 push    eax             ; hModule

.text:004301BA call    ds:GetProcAddress

 

00435E9C call    sub_42D334  //改成mov eax, 0

 

.text:004302E1 push    offset aZwqueryinforma ; "ZwQueryInformationProcess"

.text:004302E6 mov     eax, [ebp+hModule]

.text:004302E9 push    eax             ; hModule

.text:004302EA call    ds:GetProcAddress

 

00435EBB call    sub_42DD66  //改成mov eax, 0

 

6. sub_430B10: 反调试

00434A79 call    sub_42D681    //改成mov eax, 0

 

7. sub_430610: 反调试

00435F18 call    sub_42E31F  //改成mov eax, 0

 

8. sub_431670:反调试

.text:004316FE cmp     [ebp+var_44], 3E8h

.text:00431705 jbe     short loc_431722

 

改成nop, jmp 431722

 

9. 反调试  QueryPerformanceCounter   改成mov eax, 0

00435BD8 call    sub_42D39D

004367D2 call    sub_42D39D

 

10. 根据前面的反调试处理流程,发现如果没有通过检测,都会调用sub_42E086退出。因此借助于检查所有调用sub_42E086的地方,检查是否遗漏了相关的反调试。

00435456 call    sub_42E27F  //不知道反调试的原理

00435475 call    sub_42E162

00435494 call    sub_42D4F6

004354B3 call    sub_42DA41  //OutputDebugStringA

004354F1 call    sub_42E45A  //NtSetInformationThread

00435510 call    sub_42D203

 

00435B76 call    sub_42DA7D  //int 3

看雪CTF-2017秋季赛第三题

原理就是如果没有调试器,就利用int 3设置四个硬件断点,这四个硬件断点都会inc eax,最后eax的值就是4。如果调试器处理的int 3,那么最后eax就是0

 

00435B9A call    sub_42D6BD    //NtSetInformationThread

00435BB9 call    sub_42D807 

00435EDA call    sub_42D92E  //ZwQuerySystemInformation,检查是否有系统调试器

00435EF9 call    sub_42DF7D    //SeDebugPrivilege

0043678F call    sub_42DA7D 

004367B3 call    sub_42D807 

00436935 call    sub_42D1CC 

00436954 call    sub_42DA96 

00436973 call    sub_42D8CA    //int 2Dh

00436992 call    sub_42DD48 

004369B1 call    sub_42DBC7 

 

11. 根据后续调试,发现还需要去掉另外3个反调试

004351D6 call    sub_42D0B4   nop

004367A7 call    sub_42D389   ; mov eax, 0

00435B8E call    sub_42D389   ; mov eax, 0

 

去除上述反调试后,就能自如地调试了。

 

跟踪到sub_42D267,发现会将4字节转换为3字节,且使用了"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",初步判断为Base64Decode

004350B9    E8 A981FFFF     call    0042D267

 

算法逻辑为

    if (nprbytes > 1) {

    *(bufout++) =

        (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);

    }

    if (nprbytes > 2) {

    *(bufout++) =

        (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);

    }

    if (nprbytes > 3) {

    *(bufout++) =

        (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);

    }

 

0043510C call    42D96A

跟踪sub_42D96A,发现为摩斯电码解码,分3种情况:5字节长的0~94字节的a~z,7字节长的特殊符号。

.-**    a

-...    b

-.-.    c

-..*    d

.***    e

..-.    f

--.*    g

....    h

..**    i

.---    j

-.-*    k

.-..    l

--**    m

-.**    n

---*    o

.--.    p

--.-    q

.-.*    r

...*    s

-***    t

..-*    u

...-    v

.--*    w

-..-    x

-.--    y

--..    z

 

-----   0

.----   1

..---   2

...--   3

....-   4

.....   5

-....   6

--...   7

---..   8

----.   9

 

.-.-.-*     .

---...*     :

--..--*     ,

-.-.-.*     ;

..--..*     ?

-...-**     =

.----.*     '

-..-.**     /

-.-.--*     !

-....-*     -

..--.-*     _

.-..-.*     "

-.--.**     (

-.--.-*     )

...-..-     $

.-...**     &

.--.-.*     @

.-**-..     .

 

跟踪sub_42DA78,发现了0x7380166F0x4914B2B9等常量,上网查询发现此为sm3哈希算法。将base64Decode(base64Decode(input))的前3字节取出,计算其sm3值。

00435133 call   42DA78

看雪CTF-2017秋季赛第三题

此后,进入关键比较处4351CA。跟踪发现此处将input的后64位与sm3数值进行比对,如果相等则进入后续流程。

看雪CTF-2017秋季赛第三题

跟踪sub_42D0B4,发现为反调试,没有实质性操作,可以nop掉。 

sub_42D9AB:走迷宫

看雪CTF-2017秋季赛第三题

49B000开始的数值转换为迷宫,用4bit表示一位

0049B000  00 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00  ...._..._..._...

0049B010  01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00  _..._..._..._...

0049B020  01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  _...............

0049B030  01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00  _..._..._..._...

0049B040  01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  _...............

0049B050  01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  _...............

0049B060  00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00  ........_.......

0049B070  01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00  _..._..._..._...

0049B080  01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00  _..._..._.......

0049B090  01 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00  _..........._...

0049B0A0  01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  _...............

0049B0B0  01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00  _......._.......

0049B0C0  00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00  ...._..._.......

0049B0D0  01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  _...............

0049B0E0  01 00 00 00 00 00 00 00 01 00 00 00 01 00 00 00  _......._..._...

0049B0F0  01 00 00 00 00 00 00 00 01 00 00 00 01 00 00 00  _......._..._...

0049B100  01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00  _..._..._.......

0049B110  00 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00  ...._..._.......

0049B120  00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00  ............_...

0049B130  01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00  _..._...........

0049B140  01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00  _..._..._..._...

0049B150  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

0049B160  01 00 00 00 00 00 00 00 01 00 00 00 01 00 00 00  _......._..._...

0049B170  01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00  _..._..._..._...

0049B180  01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  _...............

转换结果为

看雪CTF-2017秋季赛第三题

只能走在为0的格子,且不能走回头路

记左上角为(00),往右往下为x++y++,要走到(83)处

显然,是有两条路的 = =(出现多解的可能性:迷宫走法不唯一)

 

操作为q  z  p   l

 

比划一下,很快得出路线(下面这种走法才能得出答案)

mazeAnswer = "zlzllllzzzppqppzzzlllzlllzllqqpqpqqlq"

 

此方式假定坐标从上到下,从左到右表示的迷宫图,路线的末尾必须有一个空格,表示结束。

能走的坐标必须是"0"标记值,而走过之后都会在原来坐标标记"4"

 

而又由于空格表示停止,导致其存在地图校验bugbug可以导致不走迷宫而直接跳过迷宫校验,同时也可以只完成部分迷宫路径走动,而不必全部走出迷宫就可以完成校验。

 

最后综合以上算法,得到input

 

"zlzllllzzzppqppzzzlllzlllzllqqpqpqqlq "转换为摩斯电码

--.. .-.. --.. .-.. .-.. .-.. .-.. --.. --.. --.. .--. .--. --.- .--. .--. --..--.. --.. .-.. .-.. .-.. --.. .-.. .-.. .-.. --.. .-.. .-.. --.- --.- .--. --.-.--. --.- --.- .-.. --.- /

 

计算前3位的sm3哈希,

sm3(“--.”)= b92a72497b685c31013347a7276f371f8cf91085ab8322009bfed2df41d94f94

 

base64(base64(“--.. .-.. --.. .-.. .-.. .-.. .-.. --.. --.. --.. .--. .--. --.- .--. .--. --..--.. --.. .-.. .-.. .-.. --.. .-.. .-.. .-.. --.. .-.. .-.. --.- --.- .--. --.-.--. --.- --.- .-.. --.- /”))=

TFMwdUxpQXVMUzR1SUMwdExpNGdMaTB1TGlBdUxTNHVJQzR0TGk0Z0xpMHVMaUF0TFM0dUlDMHRMaTRnTFMwdUxpQXVMUzB1SUM0dExTNGdMUzB1TFNBdUxTMHVJQzR0TFM0Z0xTMHVMaUF0TFM0dUlDMHRMaTRnTGkwdUxpQXVMUzR1SUM0dExpNGdMUzB1TGlBdUxTNHVJQzR0TGk0Z0xpMHVMaUF0TFM0dUlDNHRMaTRnTGkwdUxpQXRMUzR0SUMwdExpMGdMaTB0TGlBdExTNHRJQzR0TFM0Z0xTMHVMU0F0TFM0dElDNHRMaTRnTFMwdUxTQXZJQT09

 

因此input = “TFMwdUxpQXVMUzR1SUMwdExpNGdMaTB1TGlBdUxTNHVJQzR0TGk0Z0xpMHVMaUF0TFM0dUlDMHRMaTRnTFMwdUxpQXVMUzB1SUM0dExTNGdMUzB1TFNBdUxTMHVJQzR0TFM0Z0xTMHVMaUF0TFM0dUlDMHRMaTRnTGkwdUxpQXVMUzR1SUM0dExpNGdMUzB1TGlBdUxTNHVJQzR0TGk0Z0xpMHVMaUF0TFM0dUlDNHRMaTRnTGkwdUxpQXRMUzR0SUMwdExpMGdMaTB0TGlBdExTNHRJQzR0TFM0Z0xTMHVMU0F0TFM0dElDNHRMaTRnTFMwdUxTQXZJQT09”+ “b92a72497b685c31013347a7276f371f8cf91085ab8322009bfed2df41d94f94”

= TFMwdUxpQXVMUzR1SUMwdExpNGdMaTB1TGlBdUxTNHVJQzR0TGk0Z0xpMHVMaUF0TFM0dUlDMHRMaTRnTFMwdUxpQXVMUzB1SUM0dExTNGdMUzB1TFNBdUxTMHVJQzR0TFM0Z0xTMHVMaUF0TFM0dUlDMHRMaTRnTGkwdUxpQXVMUzR1SUM0dExpNGdMUzB1TGlBdUxTNHVJQzR0TGk0Z0xpMHVMaUF0TFM0dUlDNHRMaTRnTGkwdUxpQXRMUzR0SUMwdExpMGdMaTB0TGlBdExTNHRJQzR0TFM0Z0xTMHVMU0F0TFM0dElDNHRMaTRnTFMwdUxTQXZJQT09b92a72497b685c31013347a7276f371f8cf91085ab8322009bfed2df41d94f94


0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有