这题是使用c++写的,因为无符号表,ida对c++的解析不是很友好,可以去了解一下c++的string类型的结构,对解题很有帮助,推荐看这篇文章链接: https://bbs.pediy.com/thread-230312.htm.
程序先将长度为17位的输入分为7位和10位两部分
再输入一个数要求满足一定条件
直接爆破
最后得到data=99038
观察程序,发现我们的输入被分成两组后,在分别做一个异或,最后比较,第二组的加密程序似乎是一个RC4,但无所谓,直接找到异或的数值
直接动调找到异或和比较的数据,写脚本解密
mips程序
用ghidra或者ida都可以,个人习惯ida
关键函数
这里我简单推到后发现v4恒等于0?
满足结果时a1和a2的前14位相同,直接将前14位输入发现可以
flag{Ninja Must Die}
double ff(double a,double b){
double c
=
pow
(a,b
-
1
);
return
c
/
exp(a);
}
int
main()
{
int
i
=
0
;
while
(
1
){
double v17
=
0.0
;
double v18
=
0.0
;
double v19
=
(double)i
+
1.0
;
do{
v17
=
v17
+
ff(v18,v19)
*
0.001
;
v18
=
v18
+
0.001
;
}
while
(v18<
=
100.0
);
double v20
=
(
int
)(v17
+
v17
+
3.0
);
if
(v20
=
=
0x13B03
){
printf(
"success!! %d\n"
,i);
break
;
}
else
{
printf(
"n0!! %d\n"
,i);
}
i
+
+
;
}
int
j
=
0
;
for
(;j<
12379
;j
+
+
){
double v16
=
0.0
;
double v21
=
0
;
double v22
=
(double)j
+
1.0
;
do{
v16
=
v16
+
ff(v21,v22)
*
0.001
;
v21
=
v21
+
0.001
;
}
while
(v21<
=
100.0
);
if
((
int
)(v16
+
v16
+
3.0
)
=
=
0x5a2
){
printf(
"success!! %d\n"
,j);
break
;
}
else
{
printf(
"n0!! %d\n"
,j);
}
}
printf(
"%d"
,i
*
12379
+
j);
return
0
;
}
double ff(double a,double b){
double c
=
pow
(a,b
-
1
);
return
c
/
exp(a);
}
int
main()
{
int
i
=
0
;
while
(
1
){
double v17
=
0.0
;
double v18
=
0.0
;
double v19
=
(double)i
+
1.0
;
do{
v17
=
v17
+
ff(v18,v19)
*
0.001
;
v18
=
v18
+
0.001
;
}
while
(v18<
=
100.0
);
double v20
=
(
int
)(v17
+
v17
+
3.0
);
if
(v20
=
=
0x13B03
){
printf(
"success!! %d\n"
,i);
break
;
}
else
{
printf(
"n0!! %d\n"
,i);
}
i
+
+
;
}
int
j
=
0
;
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2021-4-8 12:46
被N1ptune编辑
,原因: