首页
社区
课程
招聘
[原创]攻防世界——Parallel Comparator
发表于: 2020-11-11 17:14 3478

[原创]攻防世界——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;//这个要从97127挨个试
        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;//这个要从97127挨个试
        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 被大河向东流哇编辑 ,原因:
收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//