-
-
[原创]2019看雪ctf第一题解题思想
-
发表于: 2019-3-23 21:19 4016
-
前几天忙着复试没时间做,复试结束回学校,尝试了一下,做出来了。
shift+F12查看字符串出现的位置,如下图:
下一步,肯定查看“恭喜”,按x查看对它的引用,往上追溯。
这个函数是弹成功窗口
查看对这个函数的引用
传入参数a1是一个整型数组,关键的逻辑是strcmp(Str1, "KanXueCTF2019JustForhappy"),其中对于while循环,可以看出来是对aAbcdefghiabcde数组的映射,然后产生了str1数组,也就是产生了最后要比较的字符串。
再次查看引用
这个函数就是输入str,然后对str进行一些变换,成为v5整型数组。
至此,大致逻辑已经清楚,由于本事不高,算法逆不出来。下面上动态调试。
strcmp处下断点,直接调试程序。随便输入一些内容,比如ABCDEFGHIJKLMN,然后 查看str的内容
可以看到这串字符,这时候发现aAbcdefghiabcde数组中有这串字符。aAbcdefghiabcde的内容为abcdefghiABCDEFGHIJKLMNjklmn0123456789opqrstuvwxyzOPQRSTUVWXYZ,猜想是一种移位密码,于是接下来分别验证,得到了一个映射如下。
前面的是输入,后面的对应输出str。
根据映射关系,进行对应,得到sn
BOOL
sub_401770()
{
HANDLE hProcess;
/
/
ST5C_4
MessageBoxA(
0
,
"pass!"
,
"恭喜!"
,
0
);
hProcess
=
GetCurrentProcess();
return
TerminateProcess(hProcess,
0
);
}
BOOL
sub_401770()
{
HANDLE hProcess;
/
/
ST5C_4
MessageBoxA(
0
,
"pass!"
,
"恭喜!"
,
0
);
hProcess
=
GetCurrentProcess();
return
TerminateProcess(hProcess,
0
);
}
int
__cdecl sub_4017F0(
int
a1)
{
int
result;
/
/
eax
char Str1[
28
];
/
/
[esp
+
D8h] [ebp
-
24h
]
int
v3;
/
/
[esp
+
F4h] [ebp
-
8h
]
int
v4;
/
/
[esp
+
F8h] [ebp
-
4h
]
v4
=
0
;
v3
=
0
;
while
(
*
(_DWORD
*
)(a1
+
4
*
v4) <
62
&&
*
(_DWORD
*
)(a1
+
4
*
v4) >
=
0
)
{
Str1[v4]
=
aAbcdefghiabcde[
*
(_DWORD
*
)(a1
+
4
*
v4)];
+
+
v4;
}
Str1[v4]
=
0
;
if
( !strcmp(Str1,
"KanXueCTF2019JustForhappy"
) )
result
=
sub_401770();
else
result
=
sub_4017B0();
return
result;
}
int
__cdecl sub_4017F0(
int
a1)
{
int
result;
/
/
eax
char Str1[
28
];
/
/
[esp
+
D8h] [ebp
-
24h
]
int
v3;
/
/
[esp
+
F4h] [ebp
-
8h
]
int
v4;
/
/
[esp
+
F8h] [ebp
-
4h
]
v4
=
0
;
v3
=
0
;
while
(
*
(_DWORD
*
)(a1
+
4
*
v4) <
62
&&
*
(_DWORD
*
)(a1
+
4
*
v4) >
=
0
)
{
Str1[v4]
=
aAbcdefghiabcde[
*
(_DWORD
*
)(a1
+
4
*
v4)];
+
+
v4;
}
Str1[v4]
=
0
;
if
( !strcmp(Str1,
"KanXueCTF2019JustForhappy"
) )
result
=
sub_401770();
else
result
=
sub_4017B0();
return
result;
}
int
__thiscall sub_401890(CWnd
*
this)
{
struct CString
*
v1;
/
/
ST08_4
CWnd
*
v2;
/
/
eax
int
v3;
/
/
eax
int
v5[
26
];
/
/
[esp
+
4Ch
] [ebp
-
74h
]
int
i;
/
/
[esp
+
B4h] [ebp
-
Ch]
char
*
Str
;
/
/
[esp
+
B8h] [ebp
-
8h
]
CWnd
*
v8;
/
/
[esp
+
BCh] [ebp
-
4h
]
v8
=
this;
v1
=
(CWnd
*
)((char
*
)this
+
100
);
v2
=
CWnd::GetDlgItem(this,
1002
);
CWnd::GetWindowTextA(v2, v1);
v3
=
sub_401A30((char
*
)v8
+
100
);
Str
=
CString::GetBuffer((CWnd
*
)((char
*
)v8
+
100
), v3);
if
( !strlen(
Str
) )
return
CWnd::MessageBoxA(v8,
"请输入pass!"
,
0
,
0
);
for
( i
=
0
;
Str
[i];
+
+
i )
{
if
(
Str
[i] >
57
||
Str
[i] <
48
)
{
if
(
Str
[i] >
122
||
Str
[i] <
97
)
{
if
(
Str
[i] >
90
||
Str
[i] <
65
)
sub_4017B0();
else
v5[i]
=
Str
[i]
-
29
;
}
else
{
v5[i]
=
Str
[i]
-
87
;
}
}
else
{
v5[i]
=
Str
[i]
-
48
;
}
}
return
sub_4017F0((
int
)v5);
}
int
__thiscall sub_401890(CWnd
*
this)
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2021-3-6 17:56
被gxkyrftx编辑
,原因: 代码显示
赞赏
他的文章
看原图
赞赏
雪币:
留言: