下载下来的exe短小精悍,ida打开基本就可以看清楚了,没有找到明显字符串,估计是加密了。调试跟踪一会就发现主程序逻辑在sub_140001630函数内,并成功找到了解密函数DecryStr_1400013B0。
读入的key前期并没有任何处理,只是前后分别拼接了一个字符串
3201382652D139C0E22132DF1BC2212EA0991650A229B36436823D0B13D51E6
和
677116575313142309154604431859253431473963507533496829080645035455771774602058076430276921790210013736267644383505517280
构造成了一个很长的字符串。本来以前是大数,但是看第二个字符串只有
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前期并没有任何处理,只是前后分别拼接了一个字符串
3201382652D139C0E22132DF1BC2212EA0991650A229B36436823D0B13D51E6
和
677116575313142309154604431859253431473963507533496829080645035455771774602058076430276921790210013736267644383505517280
构造成了一个很长的字符串。本来以前是大数,但是看第二个字符串只有
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检测
9
个
3
*
3
的方阵。
sub_14000193B检测每行,sub_1400019A7检测每列,sub_140001A13检测
9
个
3
*
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
;
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!