首页 > 其他 > 详细

2020 巅峰极客 WP_ Re

时间:2020-09-27 21:39:17      阅读:70      评论:0      收藏:0      [点我收藏+]

第一题:virus

技术分享图片

 

 

 是一个win32 的题,没给加壳。

主函数:

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v3; // eax
  int v5; // [esp+14h] [ebp-4Ch]
  int v6; // [esp+3Ch] [ebp-24h]
  int v7; // [esp+40h] [ebp-20h]
  int v8; // [esp+44h] [ebp-1Ch]
  int v9; // [esp+48h] [ebp-18h]
  int v10; // [esp+4Ch] [ebp-14h]
  size_t v11; // [esp+50h] [ebp-10h]
  int v12; // [esp+54h] [ebp-Ch]
  int i; // [esp+58h] [ebp-8h]
  int v14; // [esp+5Ch] [ebp-4h]

  __main();
  puts("There is a long way to defeat it.");
  scanf("%s", flag);
  v12 = strlen(flag);                           // 获取有效长度
  v6 = 0;
  v7 = 0;
  v8 = 0;
  v9 = 0;                                       // v6 v7 v8 v9 4个分别保存 "-" 在flag中的序号
                                                // 
  v10 = 0;
  v14 = 0;
  v11 = 0;
  for ( i = 0; i < v12; ++i )
  {
    if ( flag[i] == - )
    {
      v3 = v14++;
      *(&v6 + v3) = i;
    }
    if ( !v14 )
    {
      *(&v5 + i) = flag[i] - 0;
      if ( *(&v5 + i) > 9 || *(&v5 + i) < 0 )   // 第一个前 "-" 只能是数字 0 - 9
        return 0;                               // 在 *(&v5 + i)中写入之后参与4个迷宫的顺序
    }
  }
  if ( v14 != 4 )                               // 输入的flag中有4个 “-”
    return 0;
  v10 = v12;
  for ( i = 1; i <= v14; ++i )
  {
    v11 = *(&v6 + i) - *(&v6 + i - 1) - 1;      // 将flag的2、3、4、5部分的字符数,即对应迷宫的出走步数依次写入v11
    if ( step[i] != v11 )                       // step[4]: {0x13 , 0x19 , 0x1A , 0x1C} 用step中限定的步数参与迷宫
      return 0;
    strncpy(&road[200 * i], &flag[*(&v6 + i - 1) + 1], v11);// 将输入的flag的第2、3、4、5部分(对应迷宫的出走路径)去掉 "-"之后拷入road
  }
  for ( i = 0; i <= 3; ++i )
  {
    if ( check_flag((int)&global_map + 0xC8 * *(&v5 + i), *(&v5 + i), &road[200 * (i + 1)]) )
    {
      puts("How about try again?");
      return 0;
    }
    if ( i == 3 )
      printf("Great! We will defeat it!!! your flag is flag{%s}", flag);
  }
  return 0;
}

 main函数的条理还是很清晰的

 接收一串形如  "  XXXX—XXXX—XXXX—XXXX—XXXX  "的字符串

 检查flag中的  "  -  "的数量(必须是4个)和位置, 

 

 将第一部分的字符按位减去0x30要求不大于9且不小于0并保存在*(&v5 + i),所以第一部分应该是纯数字。

 将flag的第 2、3、4、5部分经过位数检查之后 &road[200 * i]

再往后就是通过函数check_flag 校验flag

技术分享图片

 

 


我们检查check_flag的参数后发现 global_map记录的是4个迷宫:

技术分享图片

 

 整理后如下:

迷宫及起始地址:                 路径及所需步数:    


0x403108:
||||||||||||||| 0 0 0 0 0  >>>  dddddddddsssssaaaaaaaaawww -- 0x1A
||||||||||||||| 0 0 0 0 0
||||||||||||||| 0 0 0 0 0
||s.........||| 0 0 0 0 0
|||||||||||.||| 0 0 0 0 0
||d||||||||.||| 0 0 0 0 0
||.||||||||.||| 0 0 0 0 0 
||.||||||||.||| 0 0 0 0 0
||..........||| 0 0 0 0 0
||||||||||||||| 0 0 0 0 0 

0x4031D0:
||||||||||||||||||| 0   >>>   sdsdsdsdsdsdsddwdwdwdwdwdwdw -- 0x1C
||s|||||||||||||d|| 0 
||..|||||||||||..|| 0 
|||..|||||||||..||| 0 
||||..|||||||..|||| 0 
|||||..|||||..||||| 0 
||||||..|||..|||||| 0 
|||||||..|..||||||| 0 
||||||||...|||||||| 0 
||||||||||||||||||| 0 

0x403298:
||||||||||||||| 0 0 0 0 0  >>>  aaaaaaaaasssssssddddddddd -- 0x19
||.........s||| 0 0 0 0 0 
||.|||||||||||| 0 0 0 0 0 
||.|||||||||||| 0 0 0 0 0 
||.|||||||||||| 0 0 0 0 0 
||.|||||||||||| 0 0 0 0 0 
||.|||||||||||| 0 0 0 0 0 
||.|||||||||||| 0 0 0 0 0 
||.........d||| 0 0 0 0 0 
||||||||||||||| 0 0 0 0 0 

0x403360:
||||||||||||||| 0 0 0 0 0    >>>  wwwwwdddddddddsssss  -- 0x13
||||||||||||||| 0 0 0 0 0 
||||||||||||||| 0 0 0 0 0 
|||..........|| 0 0 0 0 0 
|||.||||||||.|| 0 0 0 0 0 
|||.||||||||.|| 0 0 0 0 0 
|||.||||||||.|| 0 0 0 0 0 
|||.||||||||.|| 0 0 0 0 0 
|||s||||||||d|| 0 0 0 0 0 
||||||||||||||| 0 0 0 0 0 

可以发现每个迷宫之间的偏移都是 0XC8 ,&global_map 到0X403108的偏移也是0XC8

每个迷宫所需的步数都可以在main函数中的step数组里找到 ,故而这四个迷宫的顺序应该是 4312 ,即flag的第一部分是4312

上面提到过,flag的2、3、4、5部分对应各个迷宫的走法,所以 ,将 4312 和 各个迷宫的走法按顺序拼接之后就是真正的flag。

FLAG :flag{4312-wwwwwdddddddddsssss-aaaaaaaaasssssssddddddddd-dddddddddsssssaaaaaaaaawww-sdsdsdsdsdsdsddwdwdwdwdwdwdw}

 

 

 第二题:fu!k_py

解压开来是一个 .pyc 文件,第一步自然是对它进行反编译

技术分享图片

 

 说实话,Python不太好的我看到这套娃式的代码时人都不好了。

但为了能多搞点分,还是硬着头皮看了下去。

我能识别的信息并不多

技术分享图片

 

 这里有个 input ,flag应该是从这里输入的,包含 "  flag{}  "且总长度必须为 87 个字符。

然后是这个:

技术分享图片

 

 应该是有个有关 9 x 9 数组的信息

很容易让人往数独方面想

而且后面还有一堆的什么  check(xx) != 45,而 1 + 2 + 3  + 4 + 5 + 6 + 7 + 8 + 9 = 45

技术分享图片

 

 之后我找了个数独的解密网站按位填入 :

技术分享图片

 

然后将整个数独中的数整理下来,并套上flag{} 提交,最终通过了。

FLAG: flag{145327698839654127672918543496185372218473956753296481367542819984761235521839764}

 

2020 巅峰极客 WP_ Re

原文:https://www.cnblogs.com/pmrPMR/p/13741034.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!