SHCTF-2017:crackme

时间:2019-06-17
本文章向大家介绍SHCTF-2017:crackme,主要包括SHCTF-2017:crackme使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

下载附件,附件为exe的可执行文件,第一步查壳。

发现为nsPack壳,可采用脱壳机或者手动脱壳的方式进行脱壳。

在此采用手动脱壳的方式,增加自己对脱壳流程的理解,并熟练相关操作。

将程序拖入OD

发现pushfd和pushad两句关键句。

F8单步执行到call语句,ESP变化,在ESP上右键,添加断点。

F9执行程序

执行到popfd,且下一条命令为一个很长距离的跳转。

F8单步执行到如下位置

00401336 为程序的OEP

利用PETools获取转存

利用 ImportREC 修复

脱壳后的程序能够正确运行

对脱壳后的程序进行查壳

查询结果壳已经脱掉,脱壳操作完毕。

将程序拖入IDA分析

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int result; // eax
  int v4; // eax
  char Buf; // [esp+4h] [ebp-38h]
  char Dst; // [esp+5h] [ebp-37h]

  Buf = 0;
  memset(&Dst, 0, 0x31u);
  printf("Please Input Flag:");
  gets_s(&Buf, 0x2Cu);
  if ( strlen(&Buf) == 42 )
  {
    v4 = 0;
    while ( (*(&Buf + v4) ^ byte_402130[v4 % 16]) == dword_402150[v4] )
    {
      if ( ++v4 >= 42 )
      {
        printf("right!\n");
        goto LABEL_8;
      }
    }
    printf("error!\n");
LABEL_8:
    result = 0;
  }
  else
  {
    printf("error!\n");
    result = -1;
  }
  return result;
}

在while语句中,对输入字符串进行异或运算,利用异或运算特殊的可逆性。将byte_402130与dword_402150进行异或,即可得到正确答案。

byte_402130处需要模16 循环取值。

编写python脚本

string_1 = "this_is_not_flag"
string_2 = [0x12, 4, 8, 0x14, 0x24, 0x5c, 0x4a, 0x3d, 0x56, 0xa, 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, 0xc, 0x16, 0x68, 0x5b, 0x12, 0x48, 0x0e]
flag = ""
for i in range(42):
    flag += chr(string_2[i] ^ ord(string_1[i % 16]))
print(flag)

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

解题完毕!

收获:熟悉手动脱壳操作,解题完毕后,在网上查找资料学习各种加壳的手动脱壳流程。

部分资料:https://www.bilibili.com/video/av9251496/

原文地址:https://www.cnblogs.com/MuZiShiYe/p/11041951.html