kanxue crackme 1

基本思路

打开该程序之后,输错会出现异常的字符串,依据这些字符串追踪到sub_402120函数,大致理一下该题的思路,该函数是一个接收消息的回调函数,当接受到消息时,将进入该函数。

1
(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)

包含四个参数,核心的是当wParam=1035时Crack成功,所以需要找到发送消息并且wParam=1035的位置,使得该语句能够被执行。
1
2
3
4
5
6
7
8
9
10
if ( (unsigned __int16)wParam == 1035 )
{
*(_OWORD *)v22 = xmmword_41DB98;
v25 = 0;
v23 = xmmword_41DBA8;
v24 = xmmword_41DBB8;
sub_4039D0(&v26, 0, 0x96u);
MessageBoxW(hWnd, v22, L"Successed", 0);
return 0;
}

步骤

一开始以为是SendMessageW函数进行消息的发送,但是查了所有对该函数的引用的位置,并没有发送wParam=1035的消息,发现最开始sub_402120函数会新开辟一个线程,执行的是StartAddress函数,因此一步一步跟进去查看发现在sub_401870函数中使用了PostMessageW发送了1035的消息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if ( v26 == 2 )                             // v3 0042 0050 0035 0031
{
LODWORD(v35) = 0x350031;
HIDWORD(v35) = &unk_420050; // 00420050
v28 = v3 + 4; // 比较在这 推出 v3 然后逆回去
v36 = 0;
v29 = 0;
while ( *((_WORD *)&v35 + v29) == *(_WORD *)v28 )// 比较进入
{
++v29;
v28 += 2;
if ( v29 >= 4 ) // 四次
{
if ( !sub_401740(v2, v3) ) // 这里一次判断
break;
v31 = 1035;
return PostMessageW(*(HWND *)(v2 + 4), 0x111u, v31, 0);// 正确
}
}
}

其中v3便是输入的字符串,其实前面经过两次相同的亦或,并将小写变为了大写。一个字符这里是两个字节,while判断的是第三到第六四个字符,因此依次为 15pb。由前面函数可知一共包含7位,现在差前两位和最后一位 XX15pbX。
这里sub_401740函数有一次判断,分析后这里是求出另外三位。判断核心在
1
2
3
4
5
6
7
8
9
10
11
12
13
v14 = &v20;
v15 = '1';
while ( *(_WORD *)v14 == *(_WORD *)((char *)v14 + v2 - (_DWORD)&v20) )// 前两位
{
v15 += 6;
v14 = (__int128 *)((char *)v14 + 2);
if ( v15 > '9' )
{
if ( *(_WORD *)v2 + *((_WORD *)v8 + 9) == 99 && *(_WORD *)v17 == *(_DWORD *)v18 + *((_WORD *)v8 + 6) )
return 1; // 最后一位
return 0;
}
}

v2是传入的字符串,v20是1-9 9个数字,因此即可得到第一位第二位依次是 12
核心在于 v18是尝试的次数,v8是将v20和v2从第v3个开始两个串拼接复制过去,因此当v3=1时,v8存放的是v20+”215pbX”
1
v8 = sub_4028D0((int)&v20, v2 + 2 * *(_DWORD *)v3);	//v3和v18一样,存放的是次数

这里v17是最后一位,前面有赋值,因此需要保证(_WORD )v2 + *((_WORD *)v8 + 9) == 99,即49+50,即v8+9 为2,表示v3=1,因此对应后面v17=1+7=8
所以Flag为 *
1215pb8***

router emulate-firmadyne strstr - 字符串匹配
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×