三道不同平台Reverse题目带你入逆向坑

发表于:2018-09-03 10:11:12 来源:  合天网安实验室 阅读数(0人)

Re100


下载下来 发现没有后缀


DA载入 发现是apk文件






直接载入jeb分析


找到关键代码 右键反编译这个类(或者可以按快捷键Tab)




先判断我们输入的字符串(记作input)长度是否小于5 若成立 则输出“try again!” 不成立的话将input进行逆序 然后md5加密 接着进行base64编码 最后与 “NzU2ZDJmYzg0ZDA3YTM1NmM4ZjY4ZjcxZmU3NmUxODk=“进行比较 若相同 则输入正确








得到}321nimda{galflj


逆序一次得到jlflag{admin123}


ransomware


0x01:PEiD查壳 无壳 运行之后也没中毒 无毒




0x02: 运行一下看看 可用的只有一个输入框和一个按钮(Decrypt)


这里可以通过Restorator进行分析


随意输入123456789 点击Decrypt 弹出对话框


看到关键点


一个是触发的MessageBox (通过下API断点), 一个是关键字符串 Wrong,The password is error, 两种方法都可以定位到关键代码 (通过搜索ASCII字符串), 下边采用API断点进行定位




0x03:


先载入Olydbg分析一波


右键任意空白处或者直接(Ctrl + N)






或者在命令栏中输入bp GetDlgItemTextA,bp MessageBoxA, 下好断点之后 , 直接F9运行, 随意输入12456789, 程序会中断到这里




选中堆栈窗口buffer这一行 右键数据窗口中跟随




接着 调试执行到返回(快捷键Ctrl + F9)




这时可以看到数据窗口出现了我们的input 123456789




接着F7 然后F8单步向下分析即可




具体分析结果:1.程序先判断我们的输入是否等于18


2.关键代码就是地址00AE12A3 这个call






OD分析不方便叙述,还是用IDA吧


0x04:


可以直接shift+F12找关键字符串, 也可以像下边这样




双击DialogBoxFunc




接着F5 进行分析






所以我们只需byte_404000[]提取出来 与0xCC进行异或就可以得到flag


有一个简单的办法 就是选中所有数据 shift + E 即可




提取出的直接是C代码






最后得到flag{1_dO_n0t_wAnna_cry}


第三道(ELF文件):


cracking_game


载入IDA, Shift + f12 双击Bingo!....




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




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








代码向上翻 分析可知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;
}
				   	

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


那么我们只需要将+换成- 逆向操作就好了


计算代码:


					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}


题目下载链接:


第一道:https://pan.baidu.com/s/1bPZnjEXFODiZEAmegjYcPg 密码: 9yjv


第二道:https://pan.baidu.com/s/1Qy_uL1H9LvChcFejAkGmlA 密码: ti5n


第三道:https://pan.baidu.com/s/1mBlcZ5AwQ9GiIsmbbn3c5w 密码: 2mu4


相关新闻

大家都在学

课程详情

信息安全意识教育

课程详情

小白入门之旅

课程详情

信息安全基础