第三届上海市大学生网络安全大赛-crackme

第三届上海市大学生网络安全大赛

Reverse-crackme:

题目描述:crackme

解题方法:把附件下载下来发现是一个.EXE文件,把它放进exeinfope.exe里面来查看一下他的信息

这里我们发现它是一个32位的有壳的程序,但这里显示的不是UPX壳,而是nsPack的壳,所以我们这里就用一个专门脱nspack的脱壳软件:

脱壳成功之后我们再把它放进exeinfope.exe里面去查看一下:

现在就可以发现没有壳了,然后我们把它放进32位的IDA里面去分析的源代码:

进去shift+f12,搜索字符串,找到关键信息(right),最后索引回去F5一下,反汇编它的核心代码:

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v4; // eax
  char Buffer[52]; // [esp+4h] [ebp-38h] BYREF

  memset(Buffer, 0, 50);
  printf("Please Input Flag:");
  gets_s(Buffer, 0x2Cu);
  if ( strlen(Buffer) == 42 )   //判断我们的输入是否为42
  {
    v4 = 0;
    while ( (Buffer[v4] ^ byte_402130[v4 % 16]) == dword_402150[v4] )  //这里将我们的输入进行一系列的转换,也是最关键的部分,转换后比较相同就输出right
    {
      if ( ++v4 >= 42 )
      {
        printf("right!\n");
        return 0;
      }
    }
    printf("error!\n");
    return 0;
  }
  else
  {
    printf("error!\n");
    return -1;
  }
}

这里我们分析完后是一个清晰的加密转换过程,只有将它逆向回去就可以得到我们的输入flag,我们先获取byte_402130函数里面的内容:

再找到dword_402150函数里的值:

解密python代码:

byte = 'this_is_not_flag'
down = [0x12,4,8,0x14,0x24,0x5C,0x4A,0x3D,0x56,0x0A,0x10,0x67,0,0x41,0,1,0x46,0x5A,0x44,
        0x42,0x6E,0x0C,0x44,0x72,0x0C,0x0D,0x40,0x3E,0x4B,0x5F,2,1,0x4C,0x5E,0x5B,0x17,
        0x6E,0x0C,0x16,0x68,0x5B,0x12,2,0x48,0x0E]
flag = ''
for i in range(0,42):
        flag += chr(ord(byte[i % 16]) ^ down[i])
print(flag)

注意再获取dword_402150函数里面的值的时候,要细心0也不能省去

最后得到flag:

flag{59b8ed8f-af22-11e7-bb4a-3cf862d1ee75}

posted @   张伟文  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示