0x01.迷宫概念

迷宫问题具有以下特征:

  • 在内存中放置一个“地图”
  • 将用户输入限制为几个字符。
  • 通常只有一个迷宫入口和一个迷宫出口

放置的地图可以由可显示的字符(例如#*)组成(这非常明显,字符串的基本视图知道这是一个迷宫。),还可以使用不可见的十六进制值来表示。该地图可以直接组成很长的字符串,也可以一一排列。如果是逐行排列的,由于迷宫一般较大,所以用来按线(注意,不按排列)按顺序排列,每行对应一个特定的行号,需要确定该行还原迷宫贴图的编号。安排迷宫的功能将重复很多次。
参考:https://ctf-wiki.github.io/ctf-wiki/reverse/maze/maze/

0x02.例题-maze

1,查壳
image.png
2,用IDA反汇编分析源代码

  1. __int64 __fastcall main(__int64 a1, char **a2, char **a3)
  2. {
  3. signed __int64 v3; // rbx
  4. signed int v4; // eax
  5. bool v5; // bp
  6. bool v6; // al
  7. const char *v7; // rdi
  8. __int64 v9; // [rsp+0h] [rbp-28h]
  9. v9 = 0LL;
  10. puts("Input flag:");
  11. scanf("%s", &s1, 0LL);
  12. if ( strlen(&s1) != 24 || strncmp(&s1, "nctf{", 5uLL) || *(&byte_6010BF + 24) != '}' )
  13. {
  14. LABEL_22:
  15. puts("Wrong flag!");
  16. exit(-1);
  17. }
  18. v3 = 5LL;
  19. if ( strlen(&s1) - 1 > 5 )
  20. {
  21. while ( 1 )
  22. {
  23. v4 = *(&s1 + v3);
  24. v5 = 0;
  25. if ( v4 > 'N' )
  26. {
  27. v4 = (unsigned __int8)v4;
  28. if ( (unsigned __int8)v4 == 'O' )
  29. {
  30. v6 = sub_400650((_DWORD *)&v9 + 1);
  31. goto LABEL_14;
  32. }
  33. if ( v4 == 'o' )
  34. {
  35. v6 = sub_400660((int *)&v9 + 1);
  36. goto LABEL_14;
  37. }
  38. }
  39. else
  40. {
  41. v4 = (unsigned __int8)v4;
  42. if ( (unsigned __int8)v4 == '.' )
  43. {
  44. v6 = sub_400670(&v9);
  45. goto LABEL_14;
  46. }
  47. if ( v4 == '0' )
  48. {
  49. v6 = sub_400680((int *)&v9);
  50. LABEL_14:
  51. v5 = v6;
  52. goto LABEL_15;
  53. }
  54. }
  55. LABEL_15:
  56. if ( !(unsigned __int8)sub_400690((__int64)asc_601060, SHIDWORD(v9), v9) )
  57. goto LABEL_22;
  58. if ( ++v3 >= strlen(&s1) - 1 )
  59. {
  60. if ( v5 )
  61. break;
  62. LABEL_20:
  63. v7 = "Wrong flag!";
  64. goto LABEL_21;
  65. }
  66. }
  67. }
  68. if ( asc_601060[8 * (signed int)v9 + SHIDWORD(v9)] != '#' )
  69. goto LABEL_20;
  70. v7 = "Congratulations!";
  71. LABEL_21:
  72. puts(v7);
  73. return 0LL;
  74. }

这里要注意:刚刚反汇编出来的源代码,有些地方给出的数字可能看不出有什么含义,记得按“R”将它转化为字符,比如这里的“O”,“o”,“.”,“0”刚开始都只是给出了他们对应的ASCLL码

参考:https://www.cnblogs.com/Mayfly-nymph/p/11444758.html
https://blog.csdn.net/qq_43786458/article/details/102227259?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task