攻防世界reverse

answer_to everthing

文件无法在我的电脑上运行
拖入exe,无壳,拖入64位IDA,main函数F5反汇编
在这里插入图片描述
跟进not_the_flag
在这里插入图片描述
翻译一下
在这里插入图片描述
题干提示
在这里插入图片描述
了解到sha1加密
在这里插入图片描述

第一遍试的大写不正确,第二遍改成小写后正确
故flag为flag{80ee2a3fe31da904c596d993f7f1de4827c1450a}

re1-100

拖入exe后拖入64位IDA
找到主函数F5反汇编
在这里插入图片描述
在这里插入图片描述
前面是对&bufParentRead[1]的开头十个赋值,后面&bufParentRead[31]是对倒数十个赋值,但是后面顺序又乱掉了:strncmp(bufParentRead, “{daf29f59034938ae4efd53fc275d81053ed5be8c}”, 42uLL)
看见{daf29f59034938ae4efd53fc275d81053ed5be8c}这一串就猜测肯定跟flag有点关系
所以中间一定有改变,跟踪一下中间的confuseKey(bufParentRead, 42)函数:
在这里插入图片描述
前面比较多东西,但是这次我忽然看到后面的关键了,如截图所示,把字符串分成四份,按3、4、1、2、的顺序重新打乱,而且按照主函数最后混乱代码那里{daf29f59034938ae4efd53fc275d81053ed5be8c}也的确是符合4和1的新顺序,所以之前的函数顺序就是简单的1、2、3、4、:
{53fc275d81053ed5be8cdaf29f59034938ae4efd}
最后的flag为53fc275d81053ed5be8cdaf29f59034938ae4efd

parallel-comparator-200

这道题附件直接就是源码
分析代码:

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';

   //随机化函数值取值大于64 传值给initialization_number 
    while ((initialization_number = random()) >= 64);
    
    int first_letter;
    /*initialization_number 得到于64的随机值,取余运算,initialization_number % 26)余数肯定是在0~25范畴,
    然后加97,我数学不好,97+0~97+25,应该是97~122的范围内 */
    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];
    /*malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针,这里我们主要关注是 arguments数组,
    知道了arguments1,2,3分别对应first_letter,differences,user_string,同时使用pthread_create函数,
    并调用了checking方法,返回结果是(argument[0]+argument[1]) ^ argument[2] 的result    */
    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 循环返回的result结果 ,
    将generated_string赋值,即generated_string=(first_letter+differencs[i]) ^ user_string[i]+just_a_string[i] 
    */
    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;
    /*generated_string和just_a_string比较,
    即(first_letter+differencs[i]) ^ user_string[i]+just_a_string[i] ==just_a_string 返回1*/
    for (i = 0; i < FLAG_LEN; i++) {
        if (generated_string[i] != just_a_string[i])
            return 0;
    }

    return 1;
}

看highly_optimized_parallel_comparsion函数
有3个循环。
1:随机化函数值取值大于64 传值给initialization_number ,initialization_number 得到于64的随机值,取余运算,initialization_number % 26)余数肯定是在025范畴,然后加97,我数学不好,97+097+25,应该是97~122的范围内。
malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针,这里我们主要关注是 arguments数组,知道了arguments1,2,3分别对应first_letter,differences,user_string,同时使用pthread_create函数,并调用了checking方法,返回结果是(argument[0]+argument[1]) ^ argument[2] 的result
2:第二个for ,是上面for 循环返回的result结果 ,将generated_string赋值,即generated_string=(first_letter+differencs[i]) ^ user_string[i]+just_a_string[i]
3:第三个forgenerated_string和just_a_string比较,即(first_letter+differencs[i]) ^ user_string[i]+just_a_string[i] !=just_a_string ,则 return 0是异常中断。通过 return 1 表示返回1,正常。
那我们就知道( first_letter+differencs[i]) ^ user_string[i]+just_a_string[i] !=just_a_string,那么只能是0+just_a_string[i] ==just_a_string才能正常,所以( first_letter+differencs[i]) ^ user_string[i]=0。异或a^ b=c,可以推出a^ c=b,所以first_letter+differences[i])^0=user_string[i]
只要知道first_letter+differences[i])^0的值 就得到了正确的flag
脚本:

just_letter =[115, 116, 114, 97, 110, 103, 101, 95, 115, 116, 114, 105, 110, 103, 95, 105, 116, 95, 105, 115]
differences = [0, 9, -9, -1, 13, -13, -4, -11, -9, -1, -7, 6, -13, 13, 3, 9, -13, -11, 6, -7]

first_letter = 97
for j in range(26): #0~25
    result = ''
    first_letter += 1
    for i in range(len(differences)):
        result+=chr((first_letter+differences[i])^0)
    print(result,"--",(first_letter+differences[i]))

在这里插入图片描述
flag为lucky_hacker_you_are