美文网首页
easytree ---- 2018.10月安恒

easytree ---- 2018.10月安恒

作者: Adam_0 | 来源:发表于2019-01-30 19:29 被阅读0次
首先,用upxshell去壳。 upxshell去壳.png

再用ida打开,shift+F12查找关键字,F5分析主函数。

 int __cdecl main(int argc, const char **argv, const char **envp)
{
  const char *v3; // eax@4
  int v5; // [sp+14h] [bp-2Ch]@1
  __int16 v6; // [sp+1Ah] [bp-26h]@4
  _BYTE v7[3]; // [sp+29h] [bp-17h]@1
  int v8; // [sp+38h] [bp-8h]@4
  int *v9; // [sp+3Ch] [bp-4h]@1

  __main();
  v5 = 0;
  v9 = &v5;
  welcome();
  gets(v7);
  if ( strlen(v7) != 15 )
  {
      printf("Nah... ur a fake reverser!");
      exit(0);
  }
  v8 = createBinTree((int)v7, 15);     // 创建完美二叉树
  preOrderTraverse(v8, v9, (int)&v6);  // 前序遍历
  v3 = (const char *)enc((char *)&v6); // 猜测 base64加密
  if ( !strncmp(v3, "aWNuZXJyc2VhZXRydmVl", 0x14u) )
  {
       puts("well done bro!");
       printf("ur really know something about tree!");
  }
  else
  {
       printf("Nah.. ur an idiot!");
  }
  return 0;
}

将 “aWNuZXJyc2VhZXRydmVl” base64解密 “icnerrseaetrvee”。

接下来分析 createBinTree 函数:

为每个节点创建12个字节,前面四个存自己的值,中间四个存左孩子的地址,最后四个存右孩子的地址。

  v13 = 1;
  v12 = 0;
  v11 = 0;
  v7 = malloc(4 * a2);
  while ( v12 < a2 )
  {
    v6 = (signed int)floor(pow(2.0, (long double)(v13 - 1)));
    v10 = 0;
    for ( i = 0; i < v6; ++i )
    {
        v5 = v12 + i;
        if ( v12 + i >= a2 )
            break;
        v8 = 0;
        if ( *(_BYTE *)(v5 + a1) != 35 )  // 结尾
        {
            v8 = malloc(12u);            // 创建12个字节
            *(_BYTE *)v8 = *(_BYTE *)(v5 + a1);
            v8[1] = 0;
            v8[2] = 0;
            v7[v5] = v8;
        }
        if ( v12 > 0 )
        {
            v4 = v7[v11 + v10];
            if ( i & 1 )                //  左右孩子
            {
              *(_DWORD *)(v4 + 8) = v8;
              ++v10;
            }
            else
            {
              *(_DWORD *)(v4 + 4) = v8;
            }
        }
    }
    v11 = v12;
    v12 += v6;
    ++v13;
  }
  v2 = *v7;
  free(v7);
  return v2;
  }

在分析 preOrderTraverse 函数:

这个是二叉树的遍历,遍历又分:前序遍厉,中序遍历,后序遍历。这个是前序遍历。

int __cdecl preOrderTraverse(int a1, _DWORD *a2, int a3)
{
  int v3; // eax@2
  int result; // eax@2

  if ( a1 )
  {
    v3 = (*a2)++;
    *(_BYTE *)(a3 + v3) = *(_BYTE *)a1;
    preOrderTraverse(*(_DWORD *)(a1 + 4), a2, a3);
    result = preOrderTraverse(*(_DWORD *)(a1 + 8), a2, a3);
  }
  return result;
}

将得到的字符串“icnerrseaetrvee”根据所创建的二叉树结构和前序遍历得到树的结构

二叉树结构.png

得到flag : icanreversetree

注:

1.树与二叉树以及二叉树的遍历:(参考大佬文章)(https://blog.csdn.net/johnny901114/article/details/80574803

相关文章

  • easytree ---- 2018.10月安恒

    再用ida打开,shift+F12查找关键字,F5分析主函数。 将 “aWNuZXJyc2VhZXRydmVl” ...

  • 定 恒 安

    人心定,是明白凡事或人都有两面,辩证地去看,喜欢这一面就要接纳另一面;人心恒,是去情绪化,对于自己选择的多一些信心...

  • 【连载】何处安玉004众里寻他千百度(2)

    工作上有了仲恒的帮助,安胥轻松了许多,仲恒的表现也着实让安胥刮目相看。 仲恒从未涉猎过白道的产业,以前大哥没遇到大...

  • 安恒7月

    gmpy还是安不上,死亡了 misc-刷新过的图片 描述:浏览图片的时候刷新键有没有用呢 由题目可知是f5隐写,工...

  • 9.29安恒笔试

    一共10道选择1.软件测试理论4道2.自动化测试理论1道3.linux权限rwx4.http协议3道5.pytho...

  • 《梦神赋》第156章、弃骨肉

    在城门外,福灵安下了马,再次向傅恒辞行。傅恒也下了马,在城外的风沙飞舞中,看着福灵安稍显憔悴的脸,心里一阵酸,交待...

  • hahaha----2019.02安恒

    我们得到压缩包发现要密码,看了既不是伪加密也没有提示信息,我们打开压缩包发现五个文件并且crc都比较短,那么这应该...

  • 2018 安恒杯 over

    这个为题太烧脑了,leave-ret对rbp/rsp各种操作,被exp代码两行数据烧了一周多。 先上vul代码:8...

  • 安恒劳务建议汇总

    张卫国:1.企业管理制度需要进一步完善,企业技术创新能力差。 2.提高建筑企业市场竞争力的对策,转变经营模式。 ...

  • 恒远,安暖呵护

    时光划过天穹 惊醒春色的清晨 萌动的暖阳 叩开童话的梦境 长情与馨香 随光阴的润动而绵延 桃源池畔 诗化一溪蝶飞纷...

网友评论

      本文标题:easytree ---- 2018.10月安恒

      本文链接:https://www.haomeiwen.com/subject/xkncsqtx.html