-
-
[原创]第六题 追凶者也_pw
-
发表于:
2018-12-12 00:05
2962
-
运行效果。

IDA加载
快速定位错误位置。
无奈之际发现存在另外的线程。
进入跳转的函数,发现别有洞天。4147F0 开始计算是否正确。计算成功后对对话框的提示字符串进行异或计算,生成正确的字符串。
输入参数为字符串指针和长度。下列函数中初始化9字节的内存(3*3)
检查输入个数是否为偶数,按照2个字节一组对4147D0进行操作。操作函数401380。
输入: 413725860
输出: 123456780
进一步分析401380. A1 取值 wdsa. A2取值1234567890. A1想不想打游戏的前后左右操作。A2的值在4147D0中计算索引位置。该位置分解为横纵俩个坐标(3*3)。分析法发现 w 将当前 位置值向上移动, s 是向下移动,d向右移动, a向左移动。
结果就是完成七巧板控制。0可以与周围任意交换。
所以结论是:d6d8s7s4a1w2a5w6
七巧板应该还有其他的解,程序中已经限定20个字符,10个操作。这可能也就是唯一解了。当然应该也可以爆破。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | int __cdecl W_CHECKsub_401040( HWND hDlg)
{
void *v1;
signed int i;
signed int v4;
CHAR String;
int v6;
int v7;
int v8;
int v9;
__int16 v10;
char v11;
strcpy (aTryAgain_0, "try again!" );
strcpy (aFail_0, "fail" );
String = 0;
v6 = 0;
v7 = 0;
v8 = 0;
v9 = 0;
v10 = 0;
v11 = 0;
GetDlgItemTextA(hDlg, 1001, &String, 20);
v4 = 0;
for ( i = 0; i < 20; ++i )
v4 += *(&String + i);
if ( v4 > 0 && v4 < 4132 )
{
v1 = malloc (v4);
sub_401020();
j___free_base(v1);
}
return MessageBoxA(0, aTryAgain_0, aFail_0, 0);
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 | void __stdcall StartAddress( LPVOID lpThreadParameter)
{
while ( 1 )
{
EnterCriticalSection(&CriticalSection);
if ( dword_4147FC == 1 )
{
sub_401C10();
dword_4147FC = 0;
}
LeaveCriticalSection(&CriticalSection);
}
}
|
[注意]看雪招聘,专注安全领域的专业人才平台!
最后于 2018-12-12 00:06
被scpczc编辑
,原因: