cracking_game逆向分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiangshangbashaonian/article/details/81974042

cracking_game

 

载入IDA

Shift + f12  双击Bingo!....

 

双击通过Xref查找引用Bingo处(sub_4E0)

 

接着按下空格  切换成文本模式

 

 

那个应该是堆栈不平衡吧,我修改了下堆栈值就能f5

 

 

ida咋改堆栈值

 

 

 

代码向上翻  分析可知sub_4E0就是关键    但是发现不可以使用F5

 

Option àGeneralà勾选上Stack pointer

然后就可以看到多了一列绿色的

 

 

 

然后alt+k可以修改

 

原来数值是0x2C   改为0x0就可以

 

int __cdecl sub_4E0(int a1)

{

  int v1; // ST18_4

  int v2; // ST1C_4

  int v3; // ST20_4

  int v4; // ST24_4

  int v5; // ST28_4

  int v6; // ST2C_4

  int result; // eax

  int v8; // [esp-10h] [ebp-3Ch]

  int v9; // [esp-Ch] [ebp-38h]

  int v10; // [esp-Ch] [ebp-38h]

  int v11; // [esp-8h] [ebp-34h]

  int v12; // [esp-8h] [ebp-34h]

  int v13; // [esp-4h] [ebp-30h]

  int v14; // [esp-4h] [ebp-30h]

  int v15; // [esp+0h] [ebp-2Ch]

  int v16; // [esp+4h] [ebp-28h]

  int v17; // [esp+8h] [ebp-24h]

  int v18; // [esp+Ch] [ebp-20h]

  unsigned int v19; // [esp+10h] [ebp-1Ch]

  int *v20; // [esp+20h] [ebp-Ch]



  v20 = &a1;

  v19 = __readgsdword(0x14u);

  __printf_chk(1, &unk_A50, aCanYouSolveThi, v8, v9, v11, v13, v15, v16, v17, v18);

  __printf_chk(1, "Give me the flag please: ", v1, v2, v3, v4, v5, v6, v16, v17, v18);

  __isoc99_scanf("%x %x %x", &v16, &v17, &v18);

  if ( (((((((((((((((((((v17 + 1514584764) ^ 0x58E7773A) - 907520011) ^ 0x74A4134B) + 1299160922) ^ 0x2A3457E6)

                  + 1267464377) ^ 0xBB5D6AFF)

                + 1051920565) ^ 0x3C5A9BE1)

              - 1324494254) ^ 0x9D91B40F)

            - 1113157154) ^ 0x5D8ACD6E)

          + 1467566340) ^ 0x481EE77)

        - 754063826) ^ 0x5702EC35)

      + 1739736031) ^ 0x80CAFC7B | ((((((((((((((((((v18 ^ 0x63074EB7) - 257813895) ^ 0x3D898713) - 515561400) ^ 0xD4A1204D)

                                              - 309222932) ^ 0xDB034E6B)

                                            - 1757999315) ^ 0x85AEAF52)

                                          + 551686536) ^ 0xCDC4D471)

                                        + 1687331817) ^ 0x5BF4CECF)

                                      + 686778677) ^ 0x97C13118)

                                    - 1982126587) ^ 0x5B589A)

                                  + 1689812494) ^ 0xDF2FFB19 | (((((v16 + 929931831) ^ 0x5039B3AD) + 427557174) ^ 0x1363F241)

                                                              - 1960340062) )

    puts("Hmm...");

  else

    __printf_chk(

      1,

      "Bingo! The flag is flag{subflag0:subflag1:subflag2}`n",

      (((((((((((((((((((v17 + 1514584764) ^ 0x58E7773A) - 907520011) ^ 0x74A4134B) + 1299160922) ^ 0x2A3457E6)

                 + 1267464377) ^ 0xBB5D6AFF)

               + 1051920565) ^ 0x3C5A9BE1)

             - 1324494254) ^ 0x9D91B40F)

           - 1113157154) ^ 0x5D8ACD6E)

         + 1467566340) ^ 0x481EE77)

       - 754063826) ^ 0x5702EC35)

     + 1739736031) ^ 0x80CAFC7B,

      (((((((((((((((((((v17 + 1514584764) ^ 0x58E7773A) - 907520011) ^ 0x74A4134B) + 1299160922) ^ 0x2A3457E6)

                 + 1267464377) ^ 0xBB5D6AFF)

               + 1051920565) ^ 0x3C5A9BE1)

             - 1324494254) ^ 0x9D91B40F)

           - 1113157154) ^ 0x5D8ACD6E)

         + 1467566340) ^ 0x481EE77)

       - 754063826) ^ 0x5702EC35)

     + 1739736031) ^ 0x80CAFC7B,

      v10,

      v12,

      v14,

      ((((((((((((((((((v17 + 1514584764) ^ 0x58E7773A) - 907520011) ^ 0x74A4134B) + 1299160922) ^ 0x2A3457E6)

                + 1267464377) ^ 0xBB5D6AFF)

              + 1051920565) ^ 0x3C5A9BE1)

            - 1324494254) ^ 0x9D91B40F)

          - 1113157154) ^ 0x5D8ACD6E)

        + 1467566340) ^ 0x481EE77)

      - 754063826) ^ 0x5702EC35)

    + 1739736031,

      v16,

      v17,

      v18);

  result = 0;

  if ( __readgsdword(0x14u) != v19 )

    sub_A20();

  return result;

}

 

很明显,程序对输入的三个数,进行一系列的加减和异或

 

要使得if中条件都为0。结果才为flag。

只需要重新修改代码,将操作反向,计算一遍就可以了

 

计算代码:

int v0 = ((((((((((((((((((((0 ^ 0x80CAFC7B) - 1739736031)    ^0x5702EC35) + 754063826) ^ 0x481EE77 )- 1467566340) ^ 0x5D8ACD6E)+1113157154) ^ 0x9D91B40F)+1324494254) ^ 0x3C5A9BE1)-1051920565) ^ 0xBB5D6AFF)-1267464377) ^ 0x2A3457E6)-1299160922) ^ 0x74A4134B) +907520011) ^ 0x58E7773A)-1514584764);



int v1 = (((((((((((((((((((0 ^ 0xDF2FFB19) -1689812494) ^ 0x5B589A)+1982126587) ^ 0x97C13118)-686778677) ^ 0x5BF4CECF)-1687331817) ^ 0xCDC4D471)-551686536) ^ 0x85AEAF52)+1757999315) ^ 0xDB034E6B)+309222932) ^ 0xD4A1204D)+515561400) ^ 0x3D898713) +257813895) ^ 0x63074EB7);







int v2 = (((((0 + 1960340062) ^ 0x1363F241)- 427557174) ^ 0x5039B3AD)- 929931831);







  if ( (((((((((((((((((((v0 + 1514584764) ^ 0x58E7773A) - 907520011) ^ 0x74A4134B) + 1299160922) ^ 0x2A3457E6)                  + 1267464377) ^ 0xBB5D6AFF)                + 1051920565) ^ 0x3C5A9BE1)              - 1324494254) ^ 0x9D91B40F)            - 1113157154) ^ 0x5D8ACD6E)          + 1467566340) ^ 0x481EE77)        - 754063826) ^ 0x5702EC35)      + 1739736031) ^ 0x80CAFC7B | ((((((((((((((((((v1 ^ 0x63074EB7) - 257813895) ^ 0x3D898713) - 515561400) ^ 0xD4A1204D)                                              - 309222932) ^ 0xDB034E6B)                                            - 1757999315) ^ 0x85AEAF52)                                          + 551686536) ^ 0xCDC4D471)                                        + 1687331817) ^ 0x5BF4CECF)                                      + 686778677) ^ 0x97C13118)                                    - 1982126587) ^ 0x5B589A)                                      + 1689812494) ^ 0xDF2FFB19 | (((((v2 + 929931831) ^ 0x5039B3AD) + 427557174) ^ 0x1363F241)                                                                  - 1960340062) )



  {     

  printf("%x", v0);

  printf("%x", v1);

  printf("%x", v2); 

  }

根据v0,v1,v2的输入顺序进行排序

最后得到:

flag{e698830d:8dd70651:c1ecd292}

猜你喜欢

转载自blog.csdn.net/xiangshangbashaonian/article/details/81974042