首页
社区
课程
招聘
[原创]看雪CTF 2017年秋季赛 第三题 writeup
2017-10-29 08:47 2449

[原创]看雪CTF 2017年秋季赛 第三题 writeup

2017-10-29 08:47
2449

反调试

这一题的核心在于绕过反调试来进行动态调试。

 

作者写了很多的反调试,总体的感觉在于都过于集中,很容易就绕过了。

 

每一块反调试都是 粗粗一看就能够 猜出这一块就是反调试。

 

程序没有完整性检测,nop掉这类反调试区域依旧能够调试

  v5 = 0;
  v5 = sub_42E27F();
  if ( v5 == 1 )
    sub_42E086();
  v5 = 0;
  v5 = sub_42E162();
  if ( v5 == 1 )
    sub_42E086();
  v5 = 0;
  v5 = sub_42D4F6();
  if ( v5 == 1 )
    sub_42E086();
  v5 = 0;
  v5 = sub_42DA41();
  if ( v5 == 1 )
    sub_42E086();
  v5 = 0;
  v5 = sub_42D096();
  if ( v5 == 1 )
    sub_42E086();
  v5 = 0;
  v5 = sub_42E45A();
  if ( v5 == 1 )
    sub_42E086();

加、解密环节

程序是静态编译的,部分算法比较难以识别

 

程序刚开始进行了两次base64解密,然后又分为两部分

 

一是根据解密后的字符串,来进行类似莫斯电码的解密。。

.-**    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

.-.-.-*     .
---...*     :
--..--*     ,
-.-.-.*     ;
..--..*     ?
-...-**     =
.----.*     '
-..-.**     /
-.-.--*     !
-....-*     -
..--.-*     _
.-..-.*     "
-.--.**     (
-.--.-*     )
...-..-     $
.-...**     &
.--.-.*     @
.-**-..     .

并且会对两次base64解密之后的字符串进行一次 前三位的sm3哈希求值。

 

刚开始看到这个的时候以为需要爆破hash..后来则不是

验证环节

第一个验证环节是使用 sm3哈希值与输入未进行base64解密的参数进行比对,要全部相同才可以。

 

第二个环节是一个迷宫,&unk_49B000处的数值就是一张迷宫

0 1 1 1 1 1 1 1 1 0 
0 0 1 1 1 1 1 0 0 0 
1 0 0 0 0 0 1 0 1 1 
1 1 1 1 1 0 1 0 0 1 
1 0 0 0 1 0 1 0 0 1 
1 0 1 0 0 0 1 0 1 1 
1 0 1 1 1 1 1 0 0 1 
1 0 0 0 0 1 1 1 0 0 
1 1 1 1 0 0 0 0 1 0 
1 1 1 1 1 1 1 0 0 0

然后

 

--..z
.-..l
.--.p
--.-q

 

分别为下右左上

 

zlzllllzzzppqppzzzlllzlllzllqqpqpqqlq 能到程序意图中的 x=8,y=3

 

然而 程序有一个bug 就是 遇到 空格就会跳出循环,,就是说 如果 不走迷宫 也是一样能够过的 只需要空格即可

 

所以我在验证的时候 输入的是 zlzllllzzzppqppzzzlllzlllzllqqpqpqqlq(因为最终的注册码不能有=的出现,所以多加了个空格)

 

转为 莫斯电码为
--.. .-.. --.. .-.. .-.. .-.. .-.. --.. --.. --.. .--. .--. --.- .--. .--. --.. --.. --.. .-.. .-.. .-.. --.. .-.. .-.. .-.. --.. .-.. .-.. --.- --.- .--. --.- .--. --.- --.- .-.. --.- //

 

得到的注册码为
TFMwdUxpQXVMUzR1SUMwdExpNGdMaTB1TGlBdUxTNHVJQzR0TGk0Z0xpMHVMaUF0TFM0dUlDMHRMaTRnTFMwdUxpQXVMUzB1SUM0dExTNGdMUzB1TFNBdUxTMHVJQzR0TFM0Z0xTMHVMaUF0TFM0dUlDMHRMaTRnTGkwdUxpQXVMUzR1SUM0dExpNGdMUzB1TGlBdUxTNHVJQzR0TGk0Z0xpMHVMaUF0TFM0dUlDNHRMaTRnTGkwdUxpQXRMUzR0SUMwdExpMGdMaTB0TGlBdExTNHRJQzR0TFM0Z0xTMHVMU0F0TFM0dElDNHRMaTRnTFMwdUxTQXZMdz09b92a72497b685c31013347a7276f371f8cf91085ab8322009bfed2df41d94f94

 

但是实际上只需要空格就可以了

 

简单的///////就可以了
得到零一组解为 THk4dkx5OHZMdz099aa4f168af9fcb372825d2e817379ab6ad4a7da973a38c44a0ec56a788dfb89b

 

思路和想法不错,,,就是在验证迷宫的时候代码写烂了。。。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回