刷题记录reverse3
攻防世界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