首页
社区
课程
招聘
[原创]签到题 拜师学艺WriteUp
发表于: 2021-5-10 16:00 2115

[原创]签到题 拜师学艺WriteUp

2021-5-10 16:00
2115

题目描述

看雪.深信服2021KCTF春季赛

此题是一道Windows 32位逆向题。

本题实例涉及到一些外壳用到的技术,会被杀毒软件误报为病毒或木马。读者见到这些报告,可以不必慌张。

 

看来有壳,或者内部自解密

寻找关键位置

运行程序,提示Please input your flag:

 

x64dbg运行程序,搜索字符串
搜索字符串

 

IDA打开程序,跳转到004011E7,发现下面不是代码,猜测0040125C处的调用为解密代码
解密前

 

在x64dbg中00401261地址下断点,输入字符串,后面的代码发生改变,那么dump,修复IAT,用IDA打开修复后的程序,并F5

 

解密后

 

解密IDAF5

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
v3 = 0;
  j_memset(&v4, 0, 255);
  j_memset(&v2, 0, 255);
  sub_4014F0(&unk_403108);
  sub_4014F0("http://bbs.pediy.com\n");
  sub_4014F0("Please input your flag: ");
  sub_4014A0("%s", &v3, 256);
  sub_401470(1);
  // 字符串长度
  if ( strlen(&v3) == 12 )
  {
    // 比较字符
    if ( v3 != 'f' || v4 != 'l' || v5 != 'a' || v6 != 'g' || v7 != '{' || v10 != '}' )
      goto LABEL_16;
    v11 = v8;
    v12 = v9;
    sub_401000();
    // 比较字符串
    v1 = strcmp((const char *)((int (__fastcall *)(char *, signed int))loc_401050)(&v3, 12), "ZmxhZ3trYW54dWV9");
    if ( v1 )
      v1 = -(v1 < 0) | 1;
    if ( v1 )
    {
LABEL_16:
      sub_4014F0("Try again!\n");
      result = -1;
    }
    else
    {
      sub_4014F0("You are winner!\n");
      result = 0;
    }
  }

先判断字符串长度是否为12,然后检查格式flag{xxxxxx},然后将字符串放到loc_401050返回值跟ZmxhZ3trYW54dWV9对比

关键分析

loc_401050一开始都在检查,核心算法位于loc_401087

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
.text:00401087 loc_401087:
.text:00401087                 dec     ebx
.text:00401088                 cmp     esi, 1FFBh
.text:0040108E                 jnb     short loc_4010F8
.text:00401090                 movzx   eax, byte ptr [ecx]
.text:00401093                 inc     edx
.text:00401094                 inc     ecx
.text:00401095                 add     edi, eax
.text:00401097                 cmp     edx, 3
.text:0040109A                 jnz     short loc_4010F1;将3个字符的ASCII放到edi中
.text:0040109C                 mov     eax, edi
.text:0040109E                 sar     eax, 12h
.text:004010A1                 movzx   eax, ds:byte_403188[eax];Byte_403188存放的为'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
.text:004010A8                 mov     byte_404788[esi], al
.text:004010AE                 mov     eax, edi
.text:004010B0                 sar     eax, 0Ch
.text:004010B3                 and     eax, 3Fh
.text:004010B6                 movzx   eax, ds:byte_403188[eax]
.text:004010BD                 mov     byte_404789[esi], al
.text:004010C3                 mov     eax, edi
.text:004010C5                 sar     eax, 6
.text:004010C8                 and     edi, 3Fh
.text:004010CB                 and     eax, 3Fh
.text:004010CE                 movzx   eax, ds:byte_403188[eax]
.text:004010D5                 mov     byte ptr word_40478A[esi], al
.text:004010DB                 movzx   eax, ds:byte_403188[edi]
.text:004010E2                 xor     edi, edi
.text:004010E4                 mov     byte ptr (word_40478A+1)[esi], al
.text:004010EA                 add     esi, 4
.text:004010ED                 xor     edx, edx
.text:004010EF                 jmp     short loc_4010F4

这个乍一看,通过右移,将3个字符变成四个字符,很像base64,直接解密ZmxhZ3trYW54dWV9就出答案了


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

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//