欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

【攻防世界005】parallel-comparator-200

发布时间:2025/3/21 编程问答 37 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【攻防世界005】parallel-comparator-200 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

这是一个源码阅读题,涉及Linux多线程和随机函数的使用。

拿到题目,是如下的C代码,主函数读入密钥,highly_optimized_parallel_comparsion是校验函数,checking 是线程入口函数。

#include <stdlib.h> #include <stdio.h> #include <pthread.h>#define FLAG_LEN 20void * 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");elseprintf("Wrong!\n");return 0; }

通过阅读源码,可知key的长度是20。random函数没有指定种子,所以每次运行的结果都是一样的,通过在Linux上实现一个demo,我们可以得到 initialization_number 和 first_letter 的值,其中 first_letter 永远是 108。

highly_optimized_parallel_comparsion 函数末尾的循环是最终校验,要求 generated_string 和 just_a_string 这两个字符串要相等,just_a_string 的值是固定的,根据这行代码 generated_string[i] = *(char *)result + just_a_string[i] 我们可以推理得到线程返回值必须恒为0。

现在已经知道 checking 的返回值必须恒为0,通过阅读代码我们可以知道,argument[0] 永远是 108,argument[1] 是固定通过 differences 数组获得的,那么 argument[2] 可以很容易算出来,这个就是正确的key。

下面给出脚本:

differences = [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(20):x = 0 ^ (108 + differences[i])print(chr(x), end="") 《新程序员》:云原生和全面数字化实践50位技术专家共同创作,文字、视频、音频交互阅读

总结

以上是生活随笔为你收集整理的【攻防世界005】parallel-comparator-200的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。