


int __cdecl main(int argc, constchar **argv, constchar **envp){char v4; // [rsp+Fh] [rbp-91h]int v5; // [rsp+10h] [rbp-90h]int i; // [rsp+14h] [rbp-8Ch]int v7; // [rsp+18h] [rbp-88h]int v8[24]; // [rsp+20h] [rbp-80h]char s[24]; // [rsp+80h] [rbp-20h] BYREFunsigned __int64 v10; // [rsp+98h] [rbp-8h]v10 = __readfsqword(0x28u);v8[0] = 83;v8[1] = 116;v8[2] = 113;v8[3] = 96;v8[4] = 112;v8[5] = 99;v8[6] = 125;v8[7] = 78;v8[8] = 87;v8[9] = 103;v8[10] = 57;v8[11] = 110;v8[12] = 104;v8[13] = 82;v8[14] = 102;v8[15] = 106;v8[16] = 113;v8[17] = 32;v8[18] = 123;v8[19] = 125;v8[20] = 115;v8[21] = 104;v5 = 0;v4 = 1;puts("Mercy: What do you want to tell me?");scanf("%s", s);v7 = strlen(s);if ( v7 != 22 )puts("You Are Defented;");for ( i = 0; i < v7; ++i ){if ( v5 ) //因为V5 等于0,此处不执行{if ( v8[i] != (i ^ s[i]) ) //此处必须为假v4 = 0;v5 = 0;}else //V5等于0,执行此处代码块{if ( v8[i] != (i ^ s[i]) ) //此处必须为假v4 = 0;v5 = 1;}}if ( v4 ) //此处V4必须为真,说明上方条件必须为假puts("Heros never die~Victory~");elseputs("You Are Defented;");return 0;}
当v8[i] != (i ^ s[i]) 为假,即v8[i] = (i ^ s[i]) 成立时,下方if为真if ( v4 ) //此处V4必须为真,说明上方条件必须为假puts("Heros never die~Victory~");
v8 = [83,116,113,96,112,99,125,78,87,103,57,110,104,82,102,106,113,32,123,125,115,104]result=""for i in range(len(v8)):s=i^v8[i]result+=chr(s)print("flag=",result) //运行结果:flag= Susctf{I_n3ed_hea1ing}

要勇于学习,勇于编写代码,不要让纸老虎吓退 有时候存在垃圾代码,要明辨
异或加解密原理a^b=c 则a=b^c 本题涉及到逆向解题思路和工具,初学者可以去学习相关工具和概念,在干中学,不推荐学一堆知识再来解题,而是解题遇到不懂的及时查询,解决一切疑惑,就收获了知识。
文章来源:
四季读书网
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至23467321@qq.com举报,一经查实,本站将立刻删除;如已特别标注为本站原创文章的,转载时请以链接形式注明文章出处,谢谢!