首页
社区
课程
招聘
[原创] ACTF2020 Splendid_MineCraft
发表于: 2022-3-11 10:23 7099

[原创] ACTF2020 Splendid_MineCraft

2022-3-11 10:23
7099

反编译源码:

条件判断:

第一个判断是输入的flag的最后一个字符的地址-v11的起始地址是否等于26,应该就是需要flag的长度为26:

image-20211212181827825

后面两个判断就是判断flag的格式为:ACTF{xxxx}

strtok,用_将字符串分隔开,v3取的是最左边的一段字符,ACTF{xxxx,注意v17是从第六个字符开始,取4个字符的长度,然后v18是从第10个字符开始,取两个字符,这样其实都可以推断出来整个flag的格式为ACTF{xxxxxx_xxxxxx_xxxxxx}

往下存在一个unk_4051D8

image-20211212183722900

发现把unk_4051D8当成函数执行:((int (__cdecl *)(int *))unk_4051D8)(&v17),说明上面的一大段数据应该是字节码,然后将v17当成参数传入该函数中,重新运行,输入ACTF{aaaaaa_bbbbbb_cccccc},用x32dbg动态跟:

第一个循环:

image-20211212215926952

异或结果:

image-20211212230654068

看到EIP,发现就是通过循环解密出后面需要执行的字节码:

image-20211212230935974

解密之后的push ebp才是真正的函数开始,该函数先是往内存写值,一个是3@1b;b,一个是Welcome

image-20211212231406269

往下对刚刚写入的字符串的进行循环异或,

image-20211212231713546

6次循环后得到:yOu0y*

image-20211212233654525

最后出循环,test eax, eax,说明eax是作为函数执行结果,

image-20211212234011240

重新运行执行输入:

ACTF{abcdef_hijklm_opqrst}

处理完第一个strtok之后会得到一个字符串为:abcdefRvabcdef,中间的Rv是固定的

image-20211213232914763

三次strtok处理完之后会得到这样的结果:

image-20211213233135397

然后来到字节码部分,注意传进来的字符串为:abcdefRvabcdef

image-20211213233228219

进来之后先对字节码进行解密,解谜之后从0x9F515C开始才是函数处理的开始,注意传入的参数由EDX指向:

image-20211213233405286

随后生成3@1b;bwelcome,对这两个值进行异或再加上0x23,然后跟传入的字符串进行对比,不难发现预期值应该是两个相等的,往下走完循环拿完处理后的结果为yOu0y*

image-20211213233907366

重新运行:

image-20211213234107801

此时相等了,跳转不实现:

image-20211213234225491

将edx作为计数器来存储相等的个数,最后对比是否全部相等,将返回值置为1:

image-20211213234415857

往下来到第二个部分的验证:

image-20211214101314551

image-20211215110249558

异或之后的值作为key,然后对:405018开始的值进行异或,跟第一个函数一样,通过这个key对字节码进行解密,然后再执行,这里的内容就是第二部分字符串的验证:

image-20211215085046486

image-20211215085805863

开局几个循环啥事都没干就是将输入的第二部分字符串进行memcpy,到这个位置才真正对字符串进行处理:

image-20211215091013268

往下的mov很重要,EAX此时的值为0x705018,也就是该函数的字节码首地址,这里异或的结果作为数组下标,将字节码以byte的形式存储到EBX:

image-20211215091206850

往下从0x705018+0x166取值与上面通过偏移拿到的值进行比较:

image-20211215091509928

edi作为计数器,回到异或之前可以看到ecx的值来自于edi:

image-20211215092843105

image-20211215092045179

image-20211215111022353

得到异或逻辑为:

exp:

byte_405018,用Ghidra的字节复制复制下来:

image-20211215103806688

得到flag2:

image-20211215113140388

第三部分字符串发现就是直接进行strncmp:

image-20211215113450451

可以得到第三部分的字符串为:5mcsM<,最终flag:

image-20211215115036210

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char *v3; // eax
  char *v4; // eax
  char v6; // [esp+0h] [ebp-68h]
  int i; // [esp+14h] [ebp-54h]
  char *v8; // [esp+18h] [ebp-50h]
  char v9; // [esp+20h] [ebp-48h]
  char flag[25]; // [esp+24h] [ebp-44h] BYREF
  char v11[25]; // [esp+25h] [ebp-43h] BYREF
  char v12; // [esp+3Dh] [ebp-2Bh]
  int v13; // [esp+44h] [ebp-24h]
  __int16 v14; // [esp+48h] [ebp-20h]
  char v15[4]; // [esp+4Ch] [ebp-1Ch]
  __int16 v16; // [esp+50h] [ebp-18h]
  int v17; // [esp+54h] [ebp-14h] BYREF
  __int16 v18; // [esp+58h] [ebp-10h]
  int v19; // [esp+5Ch] [ebp-Ch]
  __int16 v20; // [esp+60h] [ebp-8h]
 
  sub_401020("%s\n", (char)aWelcomeToActfS);
  sub_401050("%s", (char)flag);
  if ( &flag[strlen(flag) + 1] - v11 == 26 && !strncmp(flag, "ACTF{", 5u) && v12 == '}' )
  {
    v12 = 0;
    v3 = strtok(flag, "_");
    v17 = *(_DWORD *)(v3 + 5);
    v18 = *(_WORD *)(v3 + 9);
    v19 = *(_DWORD *)(v3 + 5);
    v20 = *(_WORD *)(v3 + 9);
    v4 = strtok(0, "_");
    v13 = *(_DWORD *)v4;
    v14 = *((_WORD *)v4 + 2);
    v8 = strtok(0, "_");
    *(_DWORD *)v15 = *(_DWORD *)v8;
    v16 = *((_WORD *)v8 + 2);
    dword_403354 = (int)&unk_4051D8;
    if ( ((int (__cdecl *)(int *))unk_4051D8)(&v17) )
    {
      v9 = BYTE2(v19) ^ HIBYTE(v20) ^ v19 ^ HIBYTE(v19) ^ BYTE1(v19) ^ v20;
      for ( i = 256; i < 496; ++i )
        byte_405018[i] ^= v9;
      __asm { jmp     eax }
    }
  }
  sub_401020("Wrong\n", v6);
  return 0;
}
int __cdecl main(int argc, const char **argv, const char **envp)
{
  char *v3; // eax
  char *v4; // eax
  char v6; // [esp+0h] [ebp-68h]
  int i; // [esp+14h] [ebp-54h]
  char *v8; // [esp+18h] [ebp-50h]
  char v9; // [esp+20h] [ebp-48h]
  char flag[25]; // [esp+24h] [ebp-44h] BYREF
  char v11[25]; // [esp+25h] [ebp-43h] BYREF
  char v12; // [esp+3Dh] [ebp-2Bh]
  int v13; // [esp+44h] [ebp-24h]
  __int16 v14; // [esp+48h] [ebp-20h]
  char v15[4]; // [esp+4Ch] [ebp-1Ch]
  __int16 v16; // [esp+50h] [ebp-18h]
  int v17; // [esp+54h] [ebp-14h] BYREF
  __int16 v18; // [esp+58h] [ebp-10h]
  int v19; // [esp+5Ch] [ebp-Ch]
  __int16 v20; // [esp+60h] [ebp-8h]
 
  sub_401020("%s\n", (char)aWelcomeToActfS);
  sub_401050("%s", (char)flag);
  if ( &flag[strlen(flag) + 1] - v11 == 26 && !strncmp(flag, "ACTF{", 5u) && v12 == '}' )
  {
    v12 = 0;
    v3 = strtok(flag, "_");
    v17 = *(_DWORD *)(v3 + 5);
    v18 = *(_WORD *)(v3 + 9);
    v19 = *(_DWORD *)(v3 + 5);
    v20 = *(_WORD *)(v3 + 9);
    v4 = strtok(0, "_");
    v13 = *(_DWORD *)v4;
    v14 = *((_WORD *)v4 + 2);
    v8 = strtok(0, "_");
    *(_DWORD *)v15 = *(_DWORD *)v8;
    v16 = *((_WORD *)v8 + 2);
    dword_403354 = (int)&unk_4051D8;
    if ( ((int (__cdecl *)(int *))unk_4051D8)(&v17) )
    {
      v9 = BYTE2(v19) ^ HIBYTE(v20) ^ v19 ^ HIBYTE(v19) ^ BYTE1(v19) ^ v20;
      for ( i = 256; i < 496; ++i )
        byte_405018[i] ^= v9;
      __asm { jmp     eax }
    }
  }
  sub_401020("Wrong\n", v6);
  return 0;
}
&flag[strlen(flag) + 1] - v11 == 26 && !strncmp(flag, "ACTF{", 5u) && v12 == '}'
&flag[strlen(flag) + 1] - v11 == 26 && !strncmp(flag, "ACTF{", 5u) && v12 == '}'
cyclic 26 -> flag{aaaabaaacaaadaaaeaaa}
cyclic 26 -> flag{aaaabaaacaaadaaaeaaa}
 
 
v3 = strtok(flag, "_");
v17 = *(_DWORD *)(v3 + 5);
v18 = *(_WORD *)(v3 + 9);
v19 = *(_DWORD *)(v3 + 5);
v20 = *(_WORD *)(v3 + 9);
v4 = strtok(0, "_");
v13 = *(_DWORD *)v4;
v14 = *((_WORD *)v4 + 2);
v8 = strtok(0, "_");
*(_DWORD *)v15 = *(_DWORD *)v8;
v16 = *((_WORD *)v8 + 2);
v3 = strtok(flag, "_");
v17 = *(_DWORD *)(v3 + 5);

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

最后于 2022-3-13 00:12 被Gushang编辑 ,原因: 添加附件
上传的附件:
收藏
免费 4
支持
分享
最新回复 (3)
雪    币: 168
活跃值: (823)
能力值: ( LV10,RANK:173 )
在线值:
发帖
回帖
粉丝
2
附件呢
2022-3-12 16:16
0
雪    币: 1058
活跃值: (1187)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
3
这题调试起来真的好玩
2022-3-12 17:22
0
雪    币: 2890
活跃值: (1050)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
4
kaoyange 附件呢
加上了
2022-3-13 00:13
0
游客
登录 | 注册 方可回帖
返回
//