攻防世界-parallel-comparator-200 细读程序,详细分析_攻防世界parallel-comparator-200详解-CSDN博客
借鉴博客
下载文件可以看见是一个c代码文件
#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;
arguments[i][1] = differences[i];
arguments[i][2] = user_string[i];
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])
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);
if (is_ok)
printf("You win!\n");
else
printf("Wrong!\n");
return 0;
}
代码内容
我们从后面往前推
我们要win——isok!=0——highly_optimized_parallel_comparsion返回不为0——generated_string[i] == just_a_string[i]
在这里,我们去看代码可以发现,generated_string[i] == just_a_string[i]和这个关联的有个result
?
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])
return 0;
}
generated_string[i] = *(char *)result + just_a_string[i];
(generated_string[i] != just_a_string[i])——》可以得到result=0
到这里线索就断开了
我们往前看
void * checking(void *arg) {
char *result = malloc(sizeof(char));
char *argument = (char *)arg;
*result = (argument[0]+argument[1]) ^ argument[2];
return result;
}
这里有个check函数
里面有个result,会不会相同呢?
这里有关于arguement数组操作
我们继续往下看
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;
arguments[i][1] = differences[i];
arguments[i][2] = user_string[i];
pthread_create((pthread_t*)(thread+i), NULL, checking, arguments[i]);
}
这里就给出了argument的数据
第一个就是一个97-122的随机数字(小写字母ASCII)
第二个就是给出的数组
第三个就是我们输入的字符串
我们要求得输入的字符串
这个字符串怎么求呢?
*result = (argument[0]+argument[1]) ^ argument[2];
在这个式子中,result我们已知,argument 0 和1 我们也可以知道
argument2我们就可以求得了,就是argument0是97-122,所以我们要爆破一下
difference=[0, 9, -9, -1, 13, -13, -4, -11, -9, -1, -7, 6, -13, 13, 3, 9, -13, -11, 6, -7]
just_a_string=[115, 116, 114, 97, 110, 103, 101, 95, 115, 116, 114, 105, 110, 103, 95, 105, 116, 95, 105, 115]
for i in range(26):
flag=''
frist_letter = 97+i
for j in range(len(difference)):
user_string = ((frist_letter + difference[j]) ^0)
flag+=chr(user_string)
print(flag,"first_letter=",frist_letter)
最后就这个108像个人样,我们交一下(试错嘛)
然后就
下班!嘿嘿嘿