首页
社区
课程
招聘
第六题 至暗时刻
发表于: 2023-9-15 11:22 10387

第六题 至暗时刻

xym 活跃值
4
2023-9-15 11:22
10387
下载下来的exe短小精悍,ida打开基本就可以看清楚了,没有找到明显字符串,估计是加密了。调试跟踪一会就发现主程序逻辑在sub_140001630函数内,并成功找到了解密函数DecryStr_1400013B0。
读入的key前期并没有任何处理,只是前后分别拼接了一个字符串3201382652D139C0E22132DF1BC2212EA0991650A229B36436823D0B13D51E6677116575313142309154604431859253431473963507533496829080645035455771774602058076430276921790210013736267644383505517280构造成了一个很长的字符串。本来以前是大数,但是看第二个字符串只有0-9,又不太一致。最后还在前段加了一个kctf作为标记位。
后面的函数调用采用了直接使用系统调用号的方法,导致与系统挂钩。但在我的win7虚拟机中,NtAllocateVirtualMemory_140002BBA一直调用失败,只好把对应操作手工实现了一遍,浪费了很多时间。
由于后面操作一直不成功,只能采用静态分析的方式,发现程序只是申请了长度为5500的空间,把kctf开头的字符串写到起始位置,把unk_140008050开始的2347个字节的代码写入偏移为500的地方,然后NtQueueApcThread_140002E4E启动线程执行该代码,通过比较返回是否为“110”还是“120”来判断是否成功。
因此dump该代码段,重新构造exe执行该代码,发现该shellcode将代码中的所有0x17替换为0x00后,实现了一个数独矩阵的检测。sub_140001AA3检测数独是否成立。
下载下来的exe短小精悍,ida打开基本就可以看清楚了,没有找到明显字符串,估计是加密了。调试跟踪一会就发现主程序逻辑在sub_140001630函数内,并成功找到了解密函数DecryStr_1400013B0。
读入的key前期并没有任何处理,只是前后分别拼接了一个字符串3201382652D139C0E22132DF1BC2212EA0991650A229B36436823D0B13D51E6677116575313142309154604431859253431473963507533496829080645035455771774602058076430276921790210013736267644383505517280构造成了一个很长的字符串。本来以前是大数,但是看第二个字符串只有0-9,又不太一致。最后还在前段加了一个kctf作为标记位。
后面的函数调用采用了直接使用系统调用号的方法,导致与系统挂钩。但在我的win7虚拟机中,NtAllocateVirtualMemory_140002BBA一直调用失败,只好把对应操作手工实现了一遍,浪费了很多时间。
由于后面操作一直不成功,只能采用静态分析的方式,发现程序只是申请了长度为5500的空间,把kctf开头的字符串写到起始位置,把unk_140008050开始的2347个字节的代码写入偏移为500的地方,然后NtQueueApcThread_140002E4E启动线程执行该代码,通过比较返回是否为“110”还是“120”来判断是否成功。
因此dump该代码段,重新构造exe执行该代码,发现该shellcode将代码中的所有0x17替换为0x00后,实现了一个数独矩阵的检测。sub_140001AA3检测数独是否成立。
char __fastcall sub_140001AA3(__int64 a1)
{
  unsigned int v2; // ebx
  int v3; // ebx
  int v4; // edi
 
  v2 = 0;
  while ( (unsigned __int8)sub_14000193B(a1, v2) && (unsigned __int8)sub_1400019A7(a1, v2) )// 确保行和列不重复
  {
    if ( (int)++v2 >= 9 )
    {
      v3 = 0;
LABEL_6:
      v4 = 0;
      while ( (unsigned __int8)sub_140001A13(a1, (unsigned int)v3, (unsigned int)v4) )
      {
        v4 += 3;
        if ( v4 >= 9 )
        {
          v3 += 3;
          if ( v3 < 9 )
            goto LABEL_6;
          return 1;
        }
      }
      return 0;
    }
  }
  return 0;
}
char __fastcall sub_140001AA3(__int64 a1)
{
  unsigned int v2; // ebx
  int v3; // ebx
  int v4; // edi
 
  v2 = 0;
  while ( (unsigned __int8)sub_14000193B(a1, v2) && (unsigned __int8)sub_1400019A7(a1, v2) )// 确保行和列不重复
  {
    if ( (int)++v2 >= 9 )
    {
      v3 = 0;
LABEL_6:
      v4 = 0;
      while ( (unsigned __int8)sub_140001A13(a1, (unsigned int)v3, (unsigned int)v4) )
      {
        v4 += 3;
        if ( v4 >= 9 )
        {
          v3 += 3;
          if ( v3 < 9 )
            goto LABEL_6;
          return 1;
        }
      }
      return 0;
    }
  }
  return 0;
}
sub_14000193B检测每行,sub_1400019A7检测每列,sub_140001A13检测93*3的方阵。
sub_14000193B检测每行,sub_1400019A7检测每列,sub_140001A13检测93*3的方阵。
char __fastcall sub_14000193B(__int64 a1, unsigned int a2)
{
  int v2; // ebx
  signed int v5; // eax
  __int128 v7[2]; // [rsp+20h] [rbp-38h] BYREF
  int v8; // [rsp+40h] [rbp-18h]
 
  memset(v7, 0, sizeof(v7));
  v8 = 0;
  v2 = 0;
  while ( 1 )
  {
    v5 = GetXY_14000163B(a1, a2, (unsigned int)v2) - 1;
    if ( (unsigned int)v5 > 8 || *((_DWORD *)v7 + v5) )
      break;
    ++v2;
    *((_DWORD *)v7 + v5) = 1;
    if ( v2 >= 9 )
      return 1;
  }
  return 0;
}
char __fastcall sub_14000193B(__int64 a1, unsigned int a2)
{
  int v2; // ebx
  signed int v5; // eax
  __int128 v7[2]; // [rsp+20h] [rbp-38h] BYREF
  int v8; // [rsp+40h] [rbp-18h]
 
  memset(v7, 0, sizeof(v7));
  v8 = 0;
  v2 = 0;
  while ( 1 )
  {
    v5 = GetXY_14000163B(a1, a2, (unsigned int)v2) - 1;
    if ( (unsigned int)v5 > 8 || *((_DWORD *)v7 + v5) )
      break;

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//