攻防世界--re1-100

摘要:
confuseKey)//改变原本flag中字符串的顺序{responseFalse();}elseif(!strncmp)//'{}'中间有40个字符,10个为一组,则现在顺序为3,4,1,2{responseTrue();}else{responseFalse();}}else{responseFalse();}}else{responseFalse();}}else{responseFalse();}}else{responseFalse();}}else{responseFalse();}}}exit;}exit;}bool__cdeclconfuseKey{charszPart1[15];//[rsp+10h][rbp-50h]charszPart2[15];//[rsp+20h][rbp-40h]charszPart3[15];//[rsp+30h][rbp-30h]charszPart4[15];//[rsp+40h][rbp-20h]unsigned__int64v7;//[rsp+58h][rbp-8h]v7=__readfsqword;*szPart1=0LL;*&szPart1[8]=0;*&szPart1[12]=0;szPart1[14]=0;*szPart2=0LL;*&szPart2[8]=0;*&szPart2[12]=0;szPart2[14]=0;*szPart3=0LL;*&szPart3[8]=0;*&szPart3[12]=0;szPart3[14]=0;*szPart4=0LL;*&szPart4[8]=0;*&szPart4[12]=0;szPart4[14]=0;if(iKeyLength!=123)return0;strncpy;strncpy;strncpy;strncpy;memset;*szKey=123;strcat;strcat;strcat;strcat;szKey[41]=125;return1;}3.代码分析第一段代码我们能够获取到flag[0],flag[1]~flag[10],flag[31]~flag[40],flag[41],以及调换顺序之后的flag第二段代码实际上是在对原来的flag字符串的位置进行调换,"{}"中间有40个字符,10个为一组,现在的顺序就是3,4,2,1。这道题最坑的就是真正的flag没有"{}"4.getflag!

测试文件:https://adworld.xctf.org.cn/media/task/attachments/dc14f9a05f2846249336a84aecaf18a2.zip

1.准备

攻防世界--re1-100第1张

获取信息

  • 64位文件

2.IDA打开

前面大部分都是“无用代码”,这里贴上我们需要的代码

    while ( 1)
    {
      memset(flag, 0, 0xC8uLL);
      numRead = read(pParentWrite[0], flag, 0xC8uLL);
      if ( numRead == -1)
        break;
      if( numRead )
      {
        if( childCheckDebugResult() )
        {
          responseFalse();
        }
        else if ( flag[0] == '{' )              //flag[0]为'{'
{
          if ( strlen(flag) == 42 )             //len(flag)=42
{
            if ( !strncmp(&flag[1], "53fc275d81", 10uLL) )//flag[1]~flag[10]为"53fc275d81"
{
              if ( flag[strlen(flag) - 1] == '}' )//flag[41]='}'
{
                if ( !strncmp(&flag[31], "4938ae4efd", 10uLL) )//flag[31]~flag[40]为'4938ae4efd'
{
                  if ( !confuseKey(flag, 42) )  //改变原本flag中字符串的顺序
{
                    responseFalse();
                  }
                  else if ( !strncmp(flag, "{daf29f59034938ae4efd53fc275d81053ed5be8c}", 42uLL) )//'{}'中间有40个字符,10个为一组,则现在顺序为3,4,1,2
{
                    responseTrue();
                  }
                  else
                  {
                    responseFalse();
                  }
                }
                else
                {
                  responseFalse();
                }
              }
              else
              {
                responseFalse();
              }
            }
            else
            {
              responseFalse();
            }
          }
          else
          {
            responseFalse();
          }
        }
        else
        {
          responseFalse();
        }
      }
    }
    exit(1);
  }
  exit(1);
}
bool __cdecl confuseKey(char *szKey, intiKeyLength)
{
  char szPart1[15]; //[rsp+10h] [rbp-50h]
  char szPart2[15]; //[rsp+20h] [rbp-40h]
  char szPart3[15]; //[rsp+30h] [rbp-30h]
  char szPart4[15]; //[rsp+40h] [rbp-20h]
  unsigned __int64 v7; //[rsp+58h] [rbp-8h]

  v7 = __readfsqword(0x28u);
  *(_QWORD *)szPart1 =0LL;
  *(_DWORD *)&szPart1[8] = 0;
  *(_WORD *)&szPart1[12] = 0;
  szPart1[14] = 0;
  *(_QWORD *)szPart2 =0LL;
  *(_DWORD *)&szPart2[8] = 0;
  *(_WORD *)&szPart2[12] = 0;
  szPart2[14] = 0;
  *(_QWORD *)szPart3 =0LL;
  *(_DWORD *)&szPart3[8] = 0;
  *(_WORD *)&szPart3[12] = 0;
  szPart3[14] = 0;
  *(_QWORD *)szPart4 =0LL;
  *(_DWORD *)&szPart4[8] = 0;
  *(_WORD *)&szPart4[12] = 0;
  szPart4[14] = 0;
  if ( iKeyLength != 42)
    return 0;
  if ( !szKey )
    return 0;
  if ( strlen(szKey) != 42)
    return 0;
  if ( *szKey != 123)
    return 0;
  strncpy(szPart1, szKey + 1, 0xAuLL);
  strncpy(szPart2, szKey + 11, 0xAuLL);
  strncpy(szPart3, szKey + 21, 0xAuLL);
  strncpy(szPart4, szKey + 31, 0xAuLL);
  memset(szKey, 0, iKeyLength);
  *szKey = 123;
  strcat(szKey, szPart3);
  strcat(szKey, szPart4);
  strcat(szKey, szPart1);
  strcat(szKey, szPart2);
  szKey[41] = 125;
  return 1;
}

3.代码分析

第一段代码我们能够获取到flag[0],flag[1]~flag[10],flag[31]~flag[40],flag[41],以及调换顺序之后的flag

第二段代码实际上是在对原来的flag字符串的位置进行调换,"{}"中间有40个字符,10个为一组,现在的顺序就是3,4,2,1。

因此,我们通过调换顺序之后的flag,能够获取到原来的flag。这道题最坑的就是真正的flag没有"{}"

4.get flag!

53fc275d81053ed5be8cdaf29f59034938ae4efd

免责声明:文章转载自《攻防世界--re1-100》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇linux下使用ffmpeg将amr转成mp3Performance Monitor1:开始性能监控下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Jumpserver-堡垒机

管理用户是资产的根用户,或具有NOPASSWD:ALLsudo权限的用户。Jumpserver使用此用户推送系统用户并获取资产硬件信息。使用Web终端连接到服务器后,我查看当前用户,显示为Jumpserver。下面是一个通过单击Docker直接安装koko的命令。当系统用户创建时,如果选择了自动推送,Jumpserver将使用...

windows下mstsc 远程Ubuntu 教程

为远程桌面控制设置Ubuntu 16.04的缺点是重新启动系统需要使用监视器登录系统。首先,我们将Ubuntu远程控制设置为允许远程连接,进入系统-˃首选项-˃桌面共享,或直接搜索桌面共享。如图所示,选中此项,然后选中安全项,并设置远程密码。...

AcWing算法基础课

第二行包含n个整数,表示整数序列。输出格式对于每个输出指令PM,输出表示当前集合中最小值的结果。每个结果占据一行。数据范围1≤ N≤ 105109≤ x(x)≤ 109是合法的。输入示例:8I-10PMI-10D1C28I6PMDM输出示例:-106分析:对于向上和向下操作,请注意ph和hp的应用,这相当于指针ph[k]=t;插入堆中的Kth的位置为t;hp...

【转】 中兴OLT-C300常用命令

在当前的C220版本中,ONU类型名称在GPON和EPON中应该是唯一的。这里我们使用“ZTEG-F620”。ZXAN#ponZXAN#onu-typegponZTEG-F620描述4ETH,2POTSZXAN#onu-ifZTEG-F620eth_0/1-4ZXAN#onon-ifZTEG-F620pots_0/1-2ZXAN#on u type attr...

sql server 日志软件过大设置办法

在使用sqlserver的过程中,sql日志文件的大小将随着其增长而受到限制。1.找到相应的库--˃属性--˃恢复模式,并将其更改为简单模式。2.选择库--˃任务--˃收缩--˃文件。3.选择日志文件收缩或数据库文件收缩。删除命令后占用的空间将在此处释放。数据库ldf文件的占用空间将更改为设置的空间大小。...

每个文件之间延迟启动批处理bat方法之一

延迟在文件之间启动批处理的方法之一:。文本→. bat将扩展名更改为.bat或在txt中将其另存为.bat。例如,如果B是包含空格的路径名,请使用引号“”,否则将找不到文件。批处理bat要运行的文件位于同一目录文件夹@echoffstart xiongmaoshu.jpgping127.0.0.1-n 10>批处理bat和文件是否位于同一目录文...