首页
社区
课程
招聘
[原创]第一阶段第二题
2008-10-7 08:52 2695

[原创]第一阶段第二题

2008-10-7 08:52
2695
逆出来的检查序列号的函数
void fun(DWORD Sn[]/*35h*/, BYTE OutPut[], DWORD arg[])
{
  DWORD i = 0, j = 0, iOutPut = 0, l = 0, m = 0, k = 0, qwer, asdf, tyu, hjk, temp;
  int local72 = 0, local73 = 0;
  DWORD buff[0x30], arr[4][4];
  
  for (i = 0; i < 0x0C; i++)
    buff[i] = 0x1E;
  
  if (Sn[0] > 0)
    l = 0x0C / Sn[0];
  
  while (m < 2)
  {
    if (k > 0)
      buff[arg[k-1]] = 0x1E;
    k = 0;
    while (k < 0x0C)
    {
      if (k > 0)
        buff[arg[k-1]] = 0x1E;
      if (m == 0)
      {
        buff[arg[k]] = 0x28;
        k++;
      }
      if (m == 1)
      {
        buff[arg[k]] = 0x14;
        k++;
      }
      
      for (i = 0; i < Sn[0]; i++)
      {
        temp = 0;
        for (j = 0; j < l; j++)
        {
          arr[i][j] = buff[temp];
          temp++;
        }
      }
      qwer = 0;  asdf = 0;
      for (i = 0; i < l; i++)
      {
        qwer += arr[Sn[1]][i];
        asdf += arr[Sn[2]][i];
      }
      if (qwer == asdf)
      {
        if (arr[Sn[3]][Sn[4]] == arr[Sn[5]][Sn[6]])
        {
          if (arr[Sn[7]][Sn[8]] == arr[Sn[9]][Sn[10]])
            OutPut[iOutPut++] = 0x6C;
          else
            OutPut[iOutPut++] = 0x6B;
        }
        else
        {
          if (arr[Sn[7]][Sn[8]] == arr[Sn[9]][Sn[10]])
            OutPut[iOutPut++] =  0x6A;
          else
            OutPut[iOutPut++] =  0x69;
        }
      }
      
      if (qwer > asdf)
      {
        i = 0;tyu = 0;hjk = 0;
        arr[Sn[1]][Sn[11]] = arr[Sn[12]][Sn[13]];
        arr[Sn[1]][Sn[14]] = arr[Sn[15]][Sn[16]];
        arr[Sn[1]][Sn[17]] = arr[Sn[18]][Sn[19]];
        arr[Sn[2]][Sn[20]] = arr[Sn[21]][Sn[22]];
        arr[Sn[2]][Sn[23]] = arr[Sn[24]][Sn[25]];
        arr[Sn[2]][Sn[26]] = arr[Sn[27]][Sn[28]];
        while (i < l)
        {
          tyu += arr[Sn[1]][i];
          hjk += arr[Sn[2]][i];
          i++;
        }
        //内层检查
        if (tyu > hjk)
        {
          if (arr[Sn[29]][Sn[30]] == arr[Sn[31]][Sn[32]])
            OutPut[iOutPut++] = 0x65;
          else
            OutPut[iOutPut++] = 0x61;
        }
        if (tyu < hjk)
        {
          if (arr[Sn[33]][Sn[34]] > arr[Sn[35]][Sn[36]])
            OutPut[iOutPut++] = 0x67;
          else if (arr[Sn[33]][Sn[34]] < arr[Sn[35]][Sn[36]])
            OutPut[iOutPut++] = 0x66;
          else if (arr[Sn[33]][Sn[34]] = arr[Sn[35]][Sn[36]])
            OutPut[iOutPut++] = 0x68;
        }
        if (tyu == hjk)
        {
          temp = 0;
          for (i = 0; i < Sn[0]; i++)
          {
            for (j = 0; j < l; i++)
            {  
              arr[i][j] = buff[temp];
              temp++;
            }
            if (arr[Sn[37]][Sn[38]] > arr[Sn[39]][Sn[40]])
              OutPut[iOutPut++] = 0x62;
            else if (arr[Sn[37]][Sn[38]] < arr[Sn[39]][Sn[40]])
              OutPut[iOutPut++] = 0x63;
            else if (arr[Sn[37]][Sn[38]] == arr[Sn[39]][Sn[40]])
              OutPut[iOutPut++] = 0x64;
          }
        }
        if (qwer < asdf)
        {
          i = 0;
          arr[Sn[1]][Sn[11]] = arr[Sn[12]][Sn[13]];
          arr[Sn[1]][Sn[14]] = arr[Sn[15]][Sn[16]];
          arr[Sn[1]][Sn[17]] = arr[Sn[18]][Sn[19]];
          arr[Sn[2]][Sn[20]] = arr[Sn[21]][Sn[22]];
          arr[Sn[2]][Sn[23]] = arr[Sn[24]][Sn[25]];
          arr[Sn[2]][Sn[26]] = arr[Sn[27]][Sn[28]];
          while (i < l)
          {
            local72 += arr[Sn[1]][i];
            local73 += arr[Sn[2]][i];
            i++;
          }
          //内层检查
          if (local72 > local73)
          {
            if (arr[Sn[41]][Sn[42]] > arr[Sn[43]][Sn[44]])
              OutPut[iOutPut++] = 66;
            if (arr[Sn[41]][Sn[42]] < arr[Sn[43]][Sn[44]])
              OutPut[iOutPut++] = 67;
            if (arr[Sn[41]][Sn[42]] < arr[Sn[43]][Sn[44]])
              OutPut[iOutPut++] = 68;
            
            else if (local72 < local73)
            {
              if (arr[Sn[45]][Sn[46]] == arr[Sn[47]][Sn[48]])
                OutPut[iOutPut++] = 0x65;
              else
                OutPut[iOutPut++] = 0x61;
            }
          }
          else if (local72 == local73)
          {
            temp = 0;
            for (i = 0; i < Sn[0]; i++)
            {
              for (j = 0; i <l; j++)
              {
                arr[i][j] = buff[temp];
                temp++;
              }
            }
            if (arr[Sn[49]][Sn[50]] > arr[Sn[51]][Sn[52]])
              OutPut[iOutPut++] = 0x63;
            else if (arr[Sn[49]][Sn[50]] < arr[Sn[51]][Sn[52]])
              OutPut[iOutPut++] = 0x62;
            else if (arr[Sn[49]][Sn[50]] == arr[Sn[51]][Sn[52]])
              OutPut[iOutPut++] = 0x64;
          }
        }
        m++;
  }
}
如果经过序列号检查后生成的标志序列与用户名生成的标志序列一致,则通过检查
标志序列是一个描述原字符串中元素的大小关系的序列:key[i] = n (第i个元素在字符串中是第n大字母)
序列号是个由35h个0~3的数字组成的数字序列,第一个数字决定检查序列号时的arr数组是个几维的数组(必须为3),第二、三两位决定了需要计算和的是arr中的哪两行(二者不可以相等,只可以在0、1之间选择),3~10位决定了第一层检查的结果为等于时用生成哪些标志,11~28位决定了在内层检查时用哪些位覆盖哪些位,29~40位决定了第一层检查的结果为大于时用生成哪些标志,41~52位决定了第一层检查的结果为大于时用生成哪些标志

两组用户名/序列号
nukoabcdefgh
30120212022111212313121221321000101020102010201000102
abcedhijklmu
30120212022111212313121220321000101020102010201000102

====================
早上准备过来交key的时候才看到netwind的给shoooo的回复,没想到“符合规则的用户名”是这个意思,但是规则中的“在注册机中任意输入用户名”又让我吃不准,所以还是只交key了

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞0
打赏
分享
最新回复 (1)
雪    币: 7209
活跃值: (2630)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
netwind 13 2008-10-7 19:30
2
0
结果提交次数 = 1
结果提交时间长度 = 2692 分钟
结果提交作为注册码
得分 = [(2880 - 2692)/2880]^1/8 x 0.5 x 100 - (1 -1 ) x 5 = 35.55

根据您的提交时间,您的分数是: 35.55分。

注册码可以有多组,例如:
301 20 21 2022111212313120221322001101020102010200200102
看这个注册码,把20 和21 换个位置就又组新的了
301 21 20 2022111212313120221322001101020102010200200102

对于只判断等与不等的结点,两个字符互换可以得倒新的注册码

如有疑问请跟贴说明,感谢参与!
游客
登录 | 注册 方可回帖
返回