-
-
[原创]攻防世界——Parallel Comparator
-
发表于: 2020-11-11 17:14 3478
-
这道题有个地方卡住了实在想不出来 参考了别人的wp后发现,他没把a当作个随机数看,而是一个个去试的:https://www.cnblogs.com/blackicelisa/p/12263659.html
分析这道题的代码:
根据上述结果,写代码,其中有二元数组 有点复杂 简化下:
执行后有这么多结果,因为那个随机数并不随机 每个值对应一个答案 用hex_to_string的时候vs报错 就没继续搞了 因为上面那篇文章指路108 复制下来拿到在线网站去翻译 得到了结果
去掉中间的‘/’即可
感觉我做的好复杂而且好多地方都很生硬
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#define FLAG_LEN 20
void
*
checking(void
*
arg) {
char
*
result
=
malloc(sizeof(char));
char
*
argument
=
(char
*
)arg;
*
result
=
(argument[
0
]
+
argument[
1
]) ^ argument[
2
];
/
/
加解密的地方
return
result;
}
int
highly_optimized_parallel_comparsion(char
*
user_string)
{
int
initialization_number;
int
i;
char generated_string[FLAG_LEN
+
1
];
generated_string[FLAG_LEN]
=
'\0'
;
while
((initialization_number
=
random()) >
=
64
);
int
first_letter;
first_letter
=
(initialization_number
%
26
)
+
97
;
pthread_t thread[FLAG_LEN];
char differences[FLAG_LEN]
=
{
0
,
9
,
-
9
,
-
1
,
13
,
-
13
,
-
4
,
-
11
,
-
9
,
-
1
,
-
7
,
6
,
-
13
,
13
,
3
,
9
,
-
13
,
-
11
,
6
,
-
7
};
char
*
arguments[
20
];
for
(i
=
0
; i < FLAG_LEN; i
+
+
) {
arguments[i]
=
(char
*
)malloc(
3
*
sizeof(char));
arguments[i][
0
]
=
first_letter;
/
/
这个要从
97
到
127
挨个试
arguments[i][
1
]
=
differences[i];
/
/
这个就是differences数组一个个的拿去和下面justastring进行计算
arguments[i][
2
]
=
user_string[i];
/
/
输入的flag
pthread_create((pthread_t
*
)(thread
+
i), NULL, checking, arguments[i]);
}
void
*
result;
int
just_a_string[FLAG_LEN]
=
{
115
,
116
,
114
,
97
,
110
,
103
,
101
,
95
,
115
,
116
,
114
,
105
,
110
,
103
,
95
,
105
,
116
,
95
,
105
,
115
};
for
(i
=
0
; i < FLAG_LEN; i
+
+
) {
pthread_join(
*
(thread
+
i), &result);
generated_string[i]
=
*
(char
*
)result
+
just_a_string[i];
free(result);
free(arguments[i]);
}
int
is_ok
=
1
;
for
(i
=
0
; i < FLAG_LEN; i
+
+
) {
if
(generated_string[i] !
=
just_a_string[i])
/
/
这里 这两个数必须相等,结合上面的函数可以总结出来:
/
/
just_a_string[j]
=
=
(just_a_string[j]
+
((first_letter
+
differences[j]) ^ argument[
2
]))
return
0
;
}
return
1
;
}
int
main()
{
char
*
user_string
=
(char
*
)calloc(FLAG_LEN
+
1
, sizeof(char));
fgets(user_string, FLAG_LEN
+
1
, stdin);
int
is_ok
=
highly_optimized_parallel_comparsion(user_string);
/
/
user_string就是要得flag
if
(is_ok)
printf(
"You win!\n"
);
else
printf(
"Wrong!\n"
);
return
0
;
}
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#define FLAG_LEN 20
void
*
checking(void
*
arg) {
char
*
result
=
malloc(sizeof(char));
char
*
argument
=
(char
*
)arg;
*
result
=
(argument[
0
]
+
argument[
1
]) ^ argument[
2
];
/
/
加解密的地方
return
result;
}
int
highly_optimized_parallel_comparsion(char
*
user_string)
{
int
initialization_number;
int
i;
char generated_string[FLAG_LEN
+
1
];
generated_string[FLAG_LEN]
=
'\0'
;
while
((initialization_number
=
random()) >
=
64
);
int
first_letter;
first_letter
=
(initialization_number
%
26
)
+
97
;
pthread_t thread[FLAG_LEN];
char differences[FLAG_LEN]
=
{
0
,
9
,
-
9
,
-
1
,
13
,
-
13
,
-
4
,
-
11
,
-
9
,
-
1
,
-
7
,
6
,
-
13
,
13
,
3
,
9
,
-
13
,
-
11
,
6
,
-
7
};
char
*
arguments[
20
];
for
(i
=
0
; i < FLAG_LEN; i
+
+
) {
arguments[i]
=
(char
*
)malloc(
3
*
sizeof(char));
arguments[i][
0
]
=
first_letter;
/
/
这个要从
97
到
127
挨个试
arguments[i][
1
]
=
differences[i];
/
/
这个就是differences数组一个个的拿去和下面justastring进行计算
arguments[i][
2
]
=
user_string[i];
/
/
输入的flag
pthread_create((pthread_t
*
)(thread
+
i), NULL, checking, arguments[i]);
}
void
*
result;
int
just_a_string[FLAG_LEN]
=
{
115
,
116
,
114
,
97
,
110
,
103
,
101
,
95
,
115
,
116
,
114
,
105
,
110
,
103
,
95
,
105
,
116
,
95
,
105
,
115
};
for
(i
=
0
; i < FLAG_LEN; i
+
+
) {
pthread_join(
*
(thread
+
i), &result);
generated_string[i]
=
*
(char
*
)result
+
just_a_string[i];
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2020-11-11 17:20
被大河向东流哇编辑
,原因:
赞赏
他的文章
看原图
赞赏
雪币:
留言: