RoarCTF2019逆向题-polyre writeup

RoarCTF2019逆向题writeup
现在还在思考为啥要打RoarCTF,自己找虐。既然打了就分享一波,polyre题,现在还没有该文件的地址,之后我放出来。
话不多说,直接上解法,首先用IDA逆向,拿伪代码如下(这个代码写的是挺恶心的,请教了一个专门做嵌入式工作的朋友也被恶心到了):

__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
  signed int v3; // ecx
  signed int v4; // ecx
  signed int v5; // ecx
  signed int v6; // ecx
  signed int v7; // ecx
  signed int v8; // ecx
  signed int v9; // ecx
  signed int v10; // ecx
  signed int v11; // ecx
  signed int v12; // ecx
  signed int v13; // ecx
  signed int v14; // ecx
  signed int v15; // ecx
  signed int v16; // ecx
  signed int v17; // ecx
  signed int v18; // ecx
  signed int v19; // ecx
  signed int v20; // ecx
  signed int v21; // ecx
  signed int v22; // esi
  signed int v23; // ecx
  signed int v24; // ecx
  signed int v25; // ecx
  signed int v26; // ecx
  signed int v28; // [rsp+1DCh] [rbp-114h]
  unsigned __int64 v29; // [rsp+1E0h] [rbp-110h]
  int v30; // [rsp+1E8h] [rbp-108h]
  int v31; // [rsp+1ECh] [rbp-104h]
  char s1[48]; // [rsp+1F0h] [rbp-100h]
  char s[60]; // [rsp+220h] [rbp-D0h]
  unsigned int v34; // [rsp+25Ch] [rbp-94h]
  char *v35; // [rsp+260h] [rbp-90h]
  int v36; // [rsp+26Ch] [rbp-84h]
  bool v37; // [rsp+272h] [rbp-7Eh]
  unsigned __int8 v38; // [rsp+273h] [rbp-7Dh]
  int v39; // [rsp+274h] [rbp-7Ch]
  char *v40; // [rsp+278h] [rbp-78h]
  int v41; // [rsp+284h] [rbp-6Ch]
  int v42; // [rsp+288h] [rbp-68h]
  bool v43; // [rsp+28Fh] [rbp-61h]
  char *v44; // [rsp+290h] [rbp-60h]
  int v45; // [rsp+298h] [rbp-58h]
  bool v46; // [rsp+29Fh] [rbp-51h]
  __int64 v47; // [rsp+2A0h] [rbp-50h]
  bool v48; // [rsp+2AFh] [rbp-41h]
  unsigned __int64 v49; // [rsp+2B0h] [rbp-40h]
  unsigned __int64 v50; // [rsp+2B8h] [rbp-38h]
  unsigned __int64 v51; // [rsp+2C0h] [rbp-30h]
  unsigned __int64 v52; // [rsp+2C8h] [rbp-28h]
  int v53; // [rsp+2D0h] [rbp-20h]
  int v54; // [rsp+2D4h] [rbp-1Ch]
  char *v55; // [rsp+2D8h] [rbp-18h]
  int v56; // [rsp+2E0h] [rbp-10h]
  int v57; // [rsp+2E4h] [rbp-Ch]
  bool v58; // [rsp+2EBh] [rbp-5h]
  unsigned int v59; // [rsp+2ECh] [rbp-4h]

  v34 = 0;
  v28 = 2013758019;
  while ( 1 )
  {
    while ( 1 )
    {
      while ( 1 )
      {
        while ( 1 )
        {
          while ( 1 )
          {
            while ( 1 )
            {
              while ( 1 )
              {
                while ( 1 )
                {
                  while ( 1 )
                  {
                    while ( 1 )
                    {
                      while ( 1 )
                      {
                        while ( 1 )
                        {
                          while ( 1 )
                          {
                            while ( 1 )
                            {
                              while ( 1 )
                              {
                                while ( 1 )
                                {
                                  while ( 1 )
                                  {
                                    while ( 1 )
                                    {
                                      while ( 1 )
                                      {
                                        while ( 1 )
                                        {
                                          while ( 1 )
                                          {
                                            while ( 1 )
                                            {
                                              while ( 1 )
                                              {
                                                while ( 1 )
                                                {
                                                  while ( 1 )
                                                  {
                                                    while ( 1 )
                                                    {
                                                      while ( 1 )
                                                      {
                                                        while ( 1 )
                                                        {
                                                          while ( 1 )
                                                          {
                                                            while ( 1 )
                                                            {
                                                              while ( 1 )
                                                              {
                                                                while ( 1 )
                                                                {
                                                                  while ( 1 )
                                                                  {
                                                                    while ( 1 )
                                                                    {
                                                                      while ( 1 )
                                                                      {
                                                                        while ( 1 )
                                                                        {
                                                                          while ( 1 )
                                                                          {
                                                                            while ( 1 )
                                                                            {
                                                                              while ( 1 )
                                                                              {
                                                                                while ( 1 )
                                                                                {
                                                                                  while ( 1 )
                                                                                  {
                                                                                    while ( 1 )
                                                                                    {
                                                                                      while ( 1 )
                                                                                      {
                                                                                        while ( 1 )
                                                                                        {
                                                                                          while ( 1 )
                                                                                          {
                                                                                            while ( 1 )
                                                                                            {
                                                                                              while ( 1 )
                                                                                              {
                                                                                                while ( 1 )
                                                                                                {
                                                                                                  while ( 1 )
                                                                                                  {
                                                                                                    while ( 1 )
                                                                                                    {
                                                                                                      while ( 1 )
                                                                                                      {
                                                                                                        while ( 1 )
                                                                                                        {
                                                                                                          while ( 1 )
                                                                                                          {
                                                                                                            while ( 1 )
                                                                                                            {
                                                                                                              while ( 1 )
                                                                                                              {
                                                                                                                while ( 1 )
                                                                                                                {
                                                                                                                  while ( 1 )
                                                                                                                  {
                                                                                                                    while ( 1 )
                                                                                                                    {
                                                                                                                      while ( 1 )
                                                                                                                      {
                                                                                                                        while ( 1 )
                                                                                                                        {
                                                                                                                          while ( 1 )
                                                                                                                          {
                                                                                                                            while ( 1 )
                                                                                                                            {
                                                                                                                              while ( 1 )
                                                                                                                              {
                                                                                                                                while ( 1 )
                                                                                                                                {
                                                                                                                                  while ( 1 )
                                                                                                                                  {
                                                                                                                                    while ( 1 )
                                                                                                                                    {
                                                                                                                                      while ( 1 )
                                                                                                                                      {
                                                                                                                                        while ( 1 )
                                                                                                                                        {
                                                                                                                                          while ( 1 )
                                                                                                                                          {
                                                                                                                                            while ( 1 )
                                                                                                                                            {
                                                                                                                                              while ( 1 )
                                                                                                                                              {
                                                                                                                                                while ( 1 )
                                                                                                                                                {
                                                                                                                                                  while ( 1 )
                                                                                                                                                  {
                                                                                                                                                    while ( 1 )
                                                                                                                                                    {
                                                                                                                                                      while ( 1 )
                                                                                                                                                      {
                                                                                                                                                        while ( 1 )
                                                                                                                                                        {
                                                                                                                                                          while ( 1 )
                                                                                                                                                          {
                                                                                                                                                            while ( 1 )
                                                                                                                                                            {
                                                                                                                                                              while ( 1 )
                                                                                                                                                              {
                                                                                                                                                                while ( 1 )
                                                                                                                                                                {
                                                                                                                                                                  while ( 1 )
                                                                                                                                                                  {
                                                                                                                                                                    while ( 1 )
                                                                                                                                                                    {
                                                                                                                                                                      while ( 1 )
                                                                                                                                                                      {
                                                                                                                                                                        while ( 1 )
                                                                                                                                                                        {
                                                                                                                                                                          while ( 1 )
                                                                                                                                                                          {
                                                                                                                                                                            while ( 1 )
                                                                                                                                                                            {
                                                                                                                                                                              while ( 1 )
                                                                                                                                                                              {
                                                                                                                                                                                while ( 1 )
                                                                                                                                                                                {
                                                                                                                                                                                  while ( 1 )
                                                                                                                                                                                  {
                                                                                                                                                                                    while ( 1 )
                                                                                                                                                                                    {
                                                                                                                                                                                      while ( v28 == -2119479925 )
                                                                                                                                                                                      {
                                                                                                                                                                                        v30 = 0;
                                                                                                                                                                                        v28 = 1768345936;
                                                                                                                                                                                      }
                                                                                                                                                                                      if ( v28 != -2087982142 )
                                                                                                                                                                                        break;
                                                                                                                                                                                      v28 = -477867459;
                                                                                                                                                                                    }
                                                                                                                                                                                    if ( v28 != -2048748379 )
                                                                                                                                                                                      break;
                                                                                                                                                                                    v28 = 283854908;
                                                                                                                                                                                  }
                                                                                                                                                                                  if ( v28 != -1971893440 )
                                                                                                                                                                                    break;
                                                                                                                                                                                  v28 = -981997032;
                                                                                                                                                                                }
                                                                                                                                                                                if ( v28 != -1876979972 )
                                                                                                                                                                                  break;
                                                                                                                                                                                v28 = 1278104886;
                                                                                                                                                                              }
                                                                                                                                                                              if ( v28 != -1843952179 )
                                                                                                                                                                                break;
                                                                                                                                                                              a3 = (char **)(unsigned int)(dword_603054 - 1);
                                                                                                                                                                              v21 = -1358401961;
                                                                                                                                                                              if ( dword_603058 < 10 || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
                                                                                                                                                                                v21 = -759088748;
                                                                                                                                                                              v28 = v21;
                                                                                                                                                                            }
                                                                                                                                                                            if ( v28 != -1841026192 )
                                                                                                                                                                              break;
                                                                                                                                                                            v28 = -981997032;
                                                                                                                                                                          }
                                                                                                                                                                          if ( v28 != -1835257763 )
                                                                                                                                                                            break;
                                                                                                                                                                          v31 = 0;
                                                                                                                                                                          v28 = -194920207;
                                                                                                                                                                        }
                                                                                                                                                                        if ( v28 != -1834653726 )
                                                                                                                                                                          break;
                                                                                                                                                                        v42 = v30;
                                                                                                                                                                        a3 = (char **)(unsigned int)(dword_603054 - 1);
                                                                                                                                                                        v13 = 762694599;
                                                                                                                                                                        if ( dword_603058 < 10 || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
                                                                                                                                                                          v13 = 1591698962;
                                                                                                                                                                        v28 = v13;
                                                                                                                                                                      }
                                                                                                                                                                      if ( v28 != -1799275846 )
                                                                                                                                                                        break;
                                                                                                                                                                      v28 = 1988968584;
                                                                                                                                                                    }
                                                                                                                                                                    if ( v28 != -1780989165 )
                                                                                                                                                                      break;
                                                                                                                                                                    v29 = *(_QWORD *)&v44[8 * v30];
                                                                                                                                                                    v28 = -1835257763;
                                                                                                                                                                  }
                                                                                                                                                                  if ( v28 != -1732387288 )
                                                                                                                                                                    break;
                                                                                                                                                                  a3 = (char **)2110558301;
                                                                                                                                                                  if ( v58 )
                                                                                                                                                                    a3 = (char **)3153606742LL;
                                                                                                                                                                  v28 = (signed int)a3;
                                                                                                                                                                }
                                                                                                                                                                if ( v28 != -1682981725 )
                                                                                                                                                                  break;
                                                                                                                                                                a3 = (char **)873723531;
                                                                                                                                                                if ( v43 )
                                                                                                                                                                  a3 = (char **)1558414728;
                                                                                                                                                                v28 = (signed int)a3;
                                                                                                                                                              }
                                                                                                                                                              if ( v28 != -1679168360 )
                                                                                                                                                                break;
                                                                                                                                                              a3 = (char **)(unsigned int)(dword_603054 - 1);
                                                                                                                                                              v8 = -1608245220;
                                                                                                                                                              if ( dword_603058 < 10 || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
                                                                                                                                                                v8 = -1039797642;
                                                                                                                                                              v28 = v8;
                                                                                                                                                            }
                                                                                                                                                            if ( v28 != -1658420490 )
                                                                                                                                                              break;
                                                                                                                                                            v28 = 738697886;
                                                                                                                                                          }
                                                                                                                                                          if ( v28 != -1608245220 )
                                                                                                                                                            break;
                                                                                                                                                          v28 = -1039797642;
                                                                                                                                                        }
                                                                                                                                                        if ( v28 != -1593453884 )
                                                                                                                                                          break;
                                                                                                                                                        v29 = v49;
                                                                                                                                                        v28 = -210664208;
                                                                                                                                                      }
                                                                                                                                                      if ( v28 != -1588745861 )
                                                                                                                                                        break;
                                                                                                                                                      v49 = 2 * v29;
                                                                                                                                                      v28 = -1099829591;
                                                                                                                                                    }
                                                                                                                                                    if ( v28 != -1578333348 )
                                                                                                                                                      break;
                                                                                                                                                    a3 = (char **)(unsigned int)(dword_603054 - 1);
                                                                                                                                                    v7 = -1015938266;
                                                                                                                                                    if ( dword_603058 < 10 || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
                                                                                                                                                      v7 = 977391758;
                                                                                                                                                    v28 = v7;
                                                                                                                                                  }
                                                                                                                                                  if ( v28 != -1453272720 )
                                                                                                                                                    break;
                                                                                                                                                  v51 = v29;
                                                                                                                                                  v28 = 1416478473;
                                                                                                                                                }
                                                                                                                                                if ( v28 != -1395524712 )
                                                                                                                                                  break;
                                                                                                                                                v57 = memcmp(s1, &unk_402170, 0x30uLL);
                                                                                                                                                v24 = 2127761645;
                                                                                                                                                if ( dword_603058 < 10 || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
                                                                                                                                                  v24 = -2048748379;
                                                                                                                                                v28 = v24;
                                                                                                                                              }
                                                                                                                                              if ( v28 != -1358463792 )
                                                                                                                                                break;
                                                                                                                                              v28 = 165194735;
                                                                                                                                            }
                                                                                                                                            if ( v28 != -1358401961 )
                                                                                                                                              break;
                                                                                                                                            *(_QWORD *)v55 = v29;
                                                                                                                                            v28 = -759088748;
                                                                                                                                          }
                                                                                                                                          if ( v28 != -1243245941 )
                                                                                                                                            break;
                                                                                                                                          v28 = 1852460924;
                                                                                                                                        }
                                                                                                                                        if ( v28 != -1241653263 )
                                                                                                                                          break;
                                                                                                                                        v31 = v41;
                                                                                                                                        a3 = (char **)(unsigned int)(dword_603054 - 1);
                                                                                                                                        v11 = 1958488484;
                                                                                                                                        if ( dword_603058 < 10 || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
                                                                                                                                          v11 = 397199458;
                                                                                                                                        v28 = v11;
                                                                                                                                      }
                                                                                                                                      if ( v28 != -1146236158 )
                                                                                                                                        break;
                                                                                                                                      a3 = (char **)3169640671LL;
                                                                                                                                      if ( v46 )
                                                                                                                                        a3 = (char **)174114970;
                                                                                                                                      v28 = (signed int)a3;
                                                                                                                                    }
                                                                                                                                    if ( v28 != -1141360554 )
                                                                                                                                      break;
                                                                                                                                    v28 = -1971893440;
                                                                                                                                    puts("Wrong!");
                                                                                                                                  }
                                                                                                                                  if ( v28 != -1125326625 )
                                                                                                                                    break;
                                                                                                                                  v54 = 8 * v30;
                                                                                                                                  v28 = 1241066884;
                                                                                                                                }
                                                                                                                                if ( v28 != -1104384261 )
                                                                                                                                  break;
                                                                                                                                v40 = &s[v31];
                                                                                                                                v28 = -199559592;
                                                                                                                              }
                                                                                                                              if ( v28 != -1099829591 )
                                                                                                                                break;
                                                                                                                              a3 = (char **)(unsigned int)(dword_603054 - 1);
                                                                                                                              v17 = -1593453884;
                                                                                                                              if ( dword_603058 < 10 || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
                                                                                                                                v17 = -210664208;
                                                                                                                              v28 = v17;
                                                                                                                            }
                                                                                                                            if ( v28 != -1039797642 )
                                                                                                                              break;
                                                                                                                            v39 = v38;
                                                                                                                            a3 = (char **)2686722076LL;
                                                                                                                            if ( dword_603058 < 10 || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
                                                                                                                              a3 = (char **)2417987324LL;
                                                                                                                            v28 = (signed int)a3;
                                                                                                                          }
                                                                                                                          if ( v28 != -1015938266 )
                                                                                                                            break;
                                                                                                                          v28 = -1578333348;
                                                                                                                        }
                                                                                                                        if ( v28 != -1008576722 )
                                                                                                                          break;
                                                                                                                        a3 = (char **)(unsigned int)(dword_603054 - 1);
                                                                                                                        v16 = -2087982142;
                                                                                                                        if ( dword_603058 < 10 || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
                                                                                                                          v16 = -477867459;
                                                                                                                        v28 = v16;
                                                                                                                      }
                                                                                                                      if ( v28 != -1002050507 )
                                                                                                                        break;
                                                                                                                      v29 = v52;
                                                                                                                      v28 = 1471710476;
                                                                                                                    }
                                                                                                                    if ( v28 != -987629196 )
                                                                                                                      break;
                                                                                                                    v53 = v31;
                                                                                                                    v28 = 183264728;
                                                                                                                  }
                                                                                                                  if ( v28 != -981997032 )
                                                                                                                    break;
                                                                                                                  v59 = v34;
                                                                                                                  v28 = 1934644251;
                                                                                                                }
                                                                                                                if ( v28 != -853256898 )
                                                                                                                  break;
                                                                                                                a3 = (char **)(unsigned int)(dword_603054 - 1);
                                                                                                                v10 = 1958488484;
                                                                                                                if ( dword_603058 < 10 || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
                                                                                                                  v10 = -1241653263;
                                                                                                                v28 = v10;
                                                                                                              }
                                                                                                              if ( v28 != -759088748 )
                                                                                                                break;
                                                                                                              *(_QWORD *)v55 = v29;
                                                                                                              a3 = (char **)140103415;
                                                                                                              v22 = -1358401961;
                                                                                                              if ( dword_603058 < 10 || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
                                                                                                                v22 = 140103415;
                                                                                                              v28 = v22;
                                                                                                            }
                                                                                                            if ( v28 != -744786104 )
                                                                                                              break;
                                                                                                            v38 = s[v31];
                                                                                                            v28 = -1679168360;
                                                                                                          }
                                                                                                          if ( v28 != -718028952 )
                                                                                                            break;
                                                                                                          v28 = -213314773;
                                                                                                        }
                                                                                                        if ( v28 != -506887986 )
                                                                                                          break;
                                                                                                        v31 = 0;
                                                                                                        v28 = -469992559;
                                                                                                        __isoc99_scanf("%s", v35, a3);
                                                                                                      }
                                                                                                      if ( v28 != -490420216 )
                                                                                                        break;
                                                                                                      a3 = (char **)2841694576LL;
                                                                                                      if ( v48 )
                                                                                                        a3 = (char **)2706221435LL;
                                                                                                      v28 = (signed int)a3;
                                                                                                    }
                                                                                                    if ( v28 != -484679360 )
                                                                                                      break;
                                                                                                    a3 = (char **)(unsigned int)(dword_603054 - 1);
                                                                                                    v14 = 550812935;
                                                                                                    if ( dword_603058 < 10 || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
                                                                                                      v14 = 253474089;
                                                                                                    v28 = v14;
                                                                                                  }
                                                                                                  if ( v28 != -477867459 )
                                                                                                    break;
                                                                                                  v46 = v45 < 64;
                                                                                                  a3 = (char **)2206985154LL;
                                                                                                  if ( dword_603058 < 10 || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
                                                                                                    a3 = (char **)1590869113;
                                                                                                  v28 = (signed int)a3;
                                                                                                }
                                                                                                if ( v28 != -469992559 )
                                                                                                  break;
                                                                                                __isoc99_scanf(
                                                                                                  "%s",
                                                                                                  v35,
                                                                                                  a3);
                                                                                                v31 = 0;
                                                                                                a3 = (char **)3788079310LL;
                                                                                                if ( dword_603058 < 10 || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
                                                                                                  a3 = (char **)1091618206;
                                                                                                v28 = (signed int)a3;
                                                                                              }
                                                                                              if ( v28 != -351376304 )
                                                                                                break;
                                                                                              v28 = -1682981725;
                                                                                            }
                                                                                            if ( v28 != -309679135 )
                                                                                              break;
                                                                                            v28 = 385821084;
                                                                                          }
                                                                                          if ( v28 != -213314773 )
                                                                                            break;
                                                                                          v41 = v31 + 1;
                                                                                          v28 = -853256898;
                                                                                        }
                                                                                        if ( v28 != -210664208 )
                                                                                          break;
                                                                                        v29 = v49;
                                                                                        v50 = v49;
                                                                                        a3 = (char **)2701513412LL;
                                                                                        if ( dword_603058 < 10
                                                                                          || (((_BYTE)dword_603054 - 1)
                                                                                            * (_BYTE)dword_603054 & 1) == 0 )
                                                                                        {
                                                                                          a3 = (char **)481625179;
                                                                                        }
                                                                                        v28 = (signed int)a3;
                                                                                      }
                                                                                      if ( v28 != -199559592 )
                                                                                        break;
                                                                                      *v40 = 0;
                                                                                      v28 = 2024088016;
                                                                                    }
                                                                                    if ( v28 != -197416524 )
                                                                                      break;
                                                                                    v30 = v56;
                                                                                    v28 = 1478643244;
                                                                                  }
                                                                                  if ( v28 != -194920207 )
                                                                                    break;
                                                                                  v45 = v31;
                                                                                  v28 = -1008576722;
                                                                                }
                                                                                if ( v28 != -172688243 )
                                                                                  break;
                                                                                v28 = -1780989165;
                                                                              }
                                                                              if ( v28 != 30189008 )
                                                                                break;
                                                                              v44 = s;
                                                                              a3 = (char **)325614949;
                                                                              if ( dword_603058 < 10
                                                                                || (((_BYTE)dword_603054 - 1)
                                                                                  * (_BYTE)dword_603054 & 1) == 0 )
                                                                              {
                                                                                a3 = (char **)4122279053LL;
                                                                              }
                                                                              v28 = (signed int)a3;
                                                                            }
                                                                            if ( v28 != 35266435 )
                                                                              break;
                                                                            v28 = -1002050507;
                                                                          }
                                                                          if ( v28 != 111496758 )
                                                                            break;
                                                                          v31 = v53 + 1;
                                                                          v28 = 1585728989;
                                                                        }
                                                                        if ( v28 != 140103415 )
                                                                          break;
                                                                        v28 = 1783499399;
                                                                      }
                                                                      if ( v28 != 165194735 )
                                                                        break;
                                                                      v52 = 2 * v51;
                                                                      a3 = (char **)2936503504LL;
                                                                      if ( dword_603058 < 10
                                                                        || (((_BYTE)dword_603054 - 1)
                                                                          * (_BYTE)dword_603054 & 1) == 0 )
                                                                      {
                                                                        a3 = (char **)35266435;
                                                                      }
                                                                      v28 = (signed int)a3;
                                                                    }
                                                                    if ( v28 != 165636912 )
                                                                      break;
                                                                    a3 = (char **)(unsigned int)(dword_603054 - 1);
                                                                    v12 = 762694599;
                                                                    if ( dword_603058 < 10
                                                                      || (((_BYTE)dword_603054 - 1)
                                                                        * (_BYTE)dword_603054 & 1) == 0 )
                                                                    {
                                                                      v12 = -1834653726;
                                                                    }
                                                                    v28 = v12;
                                                                  }
                                                                  if ( v28 != 174114970 )
                                                                    break;
                                                                  v47 = v29;
                                                                  v28 = 2008447103;
                                                                }
                                                                if ( v28 != 183264728 )
                                                                  break;
                                                                a3 = (char **)(unsigned int)(dword_603054 - 1);
                                                                v19 = 111496758;
                                                                if ( dword_603058 < 10
                                                                  || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
                                                                {
                                                                  v19 = 1585728989;
                                                                }
                                                                v28 = v19;
                                                              }
                                                              if ( v28 != 189818242 )
                                                                break;
                                                              a3 = (char **)(unsigned int)(dword_603054 - 1);
                                                              v6 = -1015938266;
                                                              if ( dword_603058 < 10
                                                                || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
                                                              {
                                                                v6 = -1578333348;
                                                              }
                                                              v28 = v6;
                                                            }
                                                            if ( v28 != 253474089 )
                                                              break;
                                                            v43 = v42 < 6;
                                                            a3 = (char **)550812935;
                                                            if ( dword_603058 < 10
                                                              || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
                                                            {
                                                              a3 = (char **)3943590992LL;
                                                            }
                                                            v28 = (signed int)a3;
                                                          }
                                                          if ( v28 != 283854908 )
                                                            break;
                                                          v58 = v57 != 0;
                                                          v28 = 2103827861;
                                                        }
                                                        if ( v28 != 325614949 )
                                                          break;
                                                        v28 = 30189008;
                                                      }
                                                      if ( v28 != 385821084 )
                                                        break;
                                                      a3 = (char **)(unsigned int)(dword_603054 - 1);
                                                      v26 = -309679135;
                                                      if ( dword_603058 < 10
                                                        || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
                                                      {
                                                        v26 = -1732387288;
                                                      }
                                                      v28 = v26;
                                                    }
                                                    if ( v28 != 397199458 )
                                                      break;
                                                    v28 = -1243245941;
                                                  }
                                                  if ( v28 != 481625179 )
                                                    break;
                                                  v28 = 1771563692;
                                                }
                                                if ( v28 != 550812935 )
                                                  break;
                                                v28 = 253474089;
                                              }
                                              if ( v28 != 738697886 )
                                                break;
                                              v37 = v36 < 64;
                                              v28 = 189818242;
                                            }
                                            if ( v28 != 762694599 )
                                              break;
                                            v28 = -1834653726;
                                          }
                                          if ( v28 != 873723531 )
                                            break;
                                          a3 = (char **)(unsigned int)(dword_603054 - 1);
                                          v23 = 2127761645;
                                          if ( dword_603058 < 10
                                            || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
                                          {
                                            v23 = -1395524712;
                                          }
                                          v28 = v23;
                                        }
                                        if ( v28 != 895115152 )
                                          break;
                                        a3 = (char **)(unsigned int)(dword_603054 - 1);
                                        v3 = -506887986;
                                        if ( dword_603058 < 10
                                          || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
                                        {
                                          v3 = -469992559;
                                        }
                                        v28 = v3;
                                      }
                                      if ( v28 != 977391758 )
                                        break;
                                      a3 = (char **)2175487371LL;
                                      if ( v37 )
                                        a3 = (char **)3550181192LL;
                                      v28 = (signed int)a3;
                                    }
                                    if ( v28 != 998079252 )
                                      break;
                                    v28 = -194920207;
                                  }
                                  if ( v28 != 1091618206 )
                                    break;
                                  v28 = 1852460924;
                                }
                                if ( v28 != 1241066884 )
                                  break;
                                a3 = (char **)&s1[v54];
                                v55 = &s1[v54];
                                v28 = -1843952179;
                              }
                              if ( v28 != 1278104886 )
                                break;
                              v9 = -718028952;
                              if ( v39 == 10 )
                                v9 = -1104384261;
                              v28 = v9;
                            }
                            if ( v28 != 1416478473 )
                              break;
                            a3 = (char **)(unsigned int)(dword_603054 - 1);
                            v18 = -1358463792;
                            if ( dword_603058 < 10 || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
                              v18 = 165194735;
                            v28 = v18;
                          }
                          if ( v28 != 1471710476 )
                            break;
                          v28 = -987629196;
                        }
                        if ( v28 != 1478643244 )
                          break;
                        v28 = 165636912;
                      }
                      if ( v28 != 1558414728 )
                        break;
                      a3 = (char **)(unsigned int)(dword_603054 - 1);
                      v15 = 325614949;
                      if ( dword_603058 < 10 || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
                        v15 = 30189008;
                      v28 = v15;
                    }
                    if ( v28 != 1585728989 )
                      break;
                    v31 = v53 + 1;
                    a3 = (char **)(unsigned int)(dword_603054 - 1);
                    v20 = 111496758;
                    if ( dword_603058 < 10 || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
                      v20 = 1636541262;
                    v28 = v20;
                  }
                  if ( v28 != 1590869113 )
                    break;
                  v28 = -1146236158;
                }
                if ( v28 != 1591698962 )
                  break;
                v28 = -484679360;
              }
              if ( v28 != 1636541262 )
                break;
              v28 = 998079252;
            }
            if ( v28 != 1768345936 )
              break;
            v28 = 165636912;
          }
          if ( v28 != 1771563692 )
            break;
          v29 = v50 ^ 0xB0004B7679FA26B3LL;
          v28 = 1471710476;
        }
        if ( v28 != 1783499399 )
          break;
        v56 = v30 + 1;
        v28 = -197416524;
      }
      if ( v28 != 1852460924 )
        break;
      a3 = (char **)(unsigned int)(dword_603054 - 1);
      v4 = -1799275846;
      if ( dword_603058 < 10 || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
        v4 = 1988968584;
      v28 = v4;
    }
    if ( v28 == 1934644251 )
      break;
    switch ( v28 )
    {
      case 1958488484:
        v31 = v41;
        v28 = -1241653263;
        break;
      case 1988968584:
        v36 = v31;
        a3 = (char **)(unsigned int)(dword_603054 - 1);
        v5 = -1799275846;
        if ( dword_603058 < 10 || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
          v5 = -1658420490;
        v28 = v5;
        break;
      case 2008447103:
        v48 = v47 < 0;
        v28 = -490420216;
        break;
      case 2013758019:
        memset(s, 0, 0x30uLL);
        memset(s1, 0, 0x30uLL);
        printf("Input:", 0LL);
        a3 = (char **)s;
        v35 = s;
        v28 = 895115152;
        break;
      case 2024088016:
        v28 = -2119479925;
        break;
      case 2103827861:
        a3 = (char **)(unsigned int)(dword_603054 - 1);
        v25 = -309679135;
        if ( dword_603058 < 10 || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
          v25 = 385821084;
        v28 = v25;
        break;
      case 2110558301:
        v28 = -1841026192;
        puts("Correct!");
        break;
      case 2127761645:
        v28 = -1395524712;
        break;
    }
  }
  return v59;
}

简化如下(团队里大佬简化的)

#include <stdint.h>
#include <iostream>

using namespace std;

uint64_t encrypt(uint64_t v29) {
	int v45;
	int64_t tmp;
	v45 = 0;
	while ( v45 < 64 ) {
		tmp = v29; 
		if ( tmp < 0 ) {
			v29 = 2 * v29;
			v29 = v29 ^ 0xB0004B7679FA26B3LL;
		} else {
			v29 = 2 * v29;
		}
		v45++;
	}
	return v29;
}

int main() {
	//只要加密后和下面的数据一致就成功 
	uint8_t unk_402170[0x30] = {
		0x96,0x62,0x53,0x43,0x6D,0xF2,0x8F,0xBC,0x16,0xEE,0x30,
		0x05,0x78,0x00,0x01,0x52,0xEC,0x08,0x5F,0x93,0xEA,0xB5,
		0xC0,0x4D,0x50,0xF4,0x53,0xD8,0xAF,0x90,0x2B,0x34,0x81,
		0x36,0x2C,0xAA,0xBC,0x0E,0x25,0x8B,0xE4,0x8A,0xC6,0xA2,
		0x81,0x9F,0x75,0x55
	};
	
	char str[49] = "hello";
	uint64_t v29;
	for (int i=0; i<48; i+=8) {
		v29 = *(uint64_t *)&str[i];
		cout << hex << encrypt(v29) << endl;
	}
	return 0;
}

开始分析吧,首先思路就是根据encrypt算法写出decrypt,然后把加密后的uint8带进去就可以了,代码怎么写呢?观察下encrypt,处理逻辑为v29为uint64,tmp为int64,算了我加注释,看下面:

uint64_t encrypt(uint64_t v29) {
	int v45;
	int64_t tmp;  //tmp有符号64bit整形,上面定义的v29为无符号64bit整形
	v45 = 0;
	while ( v45 < 64 ) {  //循环64次
		tmp = v29; //v29赋值给tmp
		if ( tmp < 0 ) {//这里关键了,这个是判断v29*2溢出的点,中位为8000000000000000,后面说。
			v29 = 2 * v29;//此处溢出了。溢出值为65bit最高位bit去掉,保留64位
			v29 = v29 ^ 0xB0004B7679FA26B3LL;//与hex异或运算v29值
		} else {
			v29 = 2 * v29;
		}
		v45++;
	}
	return v29;
}
注释到这样基本可以了,需要理清的重点就是tmp<0的话,为啥v29*2会溢出,还有溢出后的值是多少,需要查阅一些资料。不多说了跟这次题目无关

下面说decrypt怎么写。首先要知道,既然加密是分情况的,那解密必须也要分情况,首先如果溢出情况下,异或0xB0004B7679FA26B3LL此值,肯定为奇数,因为前面的v29=2*v29已经赋值为偶数了,所以我们从这个角度来写一个判断。原谅我C语言写不出来,用的是python:

def decrypt(Ev29):
	for i in range(64):#循环64次,跟加密一致
		if Ev29&1 ==0:#如果加密的int跟1与运算为1,说明是奇数,为0则为偶数,这里判断是为偶数的情况,也就是加密中未做异或运算的情况。
			Ev29 //=2#加密是乘2,那解密就是除2了

代码根据注释应该也很好理解,下面是重要的部分,也就是异或的运算怎么去解密,直接上代码:

		else:
			Ev29 ^=0xB0004B7679FA26B3#异或回去,现在的值是v29*2后溢出的异或值
			Ev29 >>=1#全部右移一位,等同于//2
			Ev29 +=0x8000000000000000#这里是还原原值,溢出后除2再加一个中位值也就是0x8000000000000000就为原来的值,相关知识点自行百度。
	return Ev29

到这里基本上差不多了,带上加密的int8,每8个一组,解密之后转字符串就行,最后解密的结果为:ff6{galfc6-09392-65c4-0259a-07abf1d3e857}8
这个看起来还不是flag,但是看着像了,考虑下大小端存储的问题,内存的11 22 33 44,读取成int之后为0x44332211,所以每8个倒序,最后的flag为:
flag{6ff29390-6c20-4c56-ba70-a95758e3d1f8}
到此劫持

发布了5 篇原创文章 · 获赞 7 · 访问量 1827

猜你喜欢

转载自blog.csdn.net/silencediors/article/details/102546053