CTF真题|EasyXor

四季读书网 2 0
CTF真题|EasyXor
题目描述:(基础题)
CTF真题|EasyXor 第1张
下载题目附件,发现是一个没有任何后缀的文件,可以用010Editor软件打开,发现其文件头为7F 45 4C 46,对应字符为.ELF,说明为Linux可执行文件,结合题目中说明为reverse题,接下来要进行逆向解题。
CTF真题|EasyXor 第2张
解题步骤与思路:
1、先检查是否存在壳,用到exeinfope查壳,如图:
CTF真题|EasyXor 第3张
最下面的脱壳信息中直接显示了编译器信息,表示没有检测到壳。
2、上一步检测到无壳,直接用ida打开,进行分析,利用ida生成伪代码(按F5键自动生成)如下:
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] BYREF  unsigned __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~");  else    puts("You Are Defented;");  return 0;}
对上面的伪代码进行分析,见代码注释,这一步一定要自己分析走一遍,这里要注意V5标志在这里其实毫无意义,更多的是出题者给出的垃圾信息,目的只有一个就是迷惑逆向工程师,浪费时间,绕晕答题者。
解题的核心是利用异或来加解密,原理是 a^b=c 则a=b^c(^符号表示异或)。
当v8[i] != (i ^ s[i]) 为假,即v8[i] = (i ^ s[i]) 成立时,下方if为真if ( v4 )                          //此处V4必须为真,说明上方条件必须为假 puts("Heros never die~Victory~");
因此,我们编写python代码:
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}
运行结果:
CTF真题|EasyXor 第4张
本题不算难,一定要看代码,然后理解解题过程。
总结:
1、技巧总结:
  • 要勇于学习,勇于编写代码,不要让纸老虎吓退
  • 有时候存在垃圾代码,要明辨
2、知识点总结:
  •  异或加解密原理a^b=c 则a=b^c
  • 本题涉及到逆向解题思路和工具,初学者可以去学习相关工具和概念,在干中学,不推荐学一堆知识再来解题,而是解题遇到不懂的及时查询,解决一切疑惑,就收获了知识。

抱歉,评论功能暂时关闭!