当前位置:   article > 正文

[ctf.show.reverse] 36D杯 签到_36d杯misc签到

36d杯misc签到

36D一共4个逆向,难度差太远。

签到这个最简单。由于删除了符号表,所以上来就得先猜函数。

  1. int __cdecl main(int argc, const char **argv, const char **envp)
  2. {
  3. __int64 v3; // rdx
  4. __int64 v4; // rcx
  5. int v6; // [rsp+4h] [rbp-8Ch]
  6. unsigned int v7; // [rsp+8h] [rbp-88h]
  7. int v8; // [rsp+Ch] [rbp-84h]
  8. int v9[31]; // [rsp+10h] [rbp-80h] BYREF
  9. char v10[4]; // [rsp+8Ch] [rbp-4h] BYREF
  10. v9[0] = 0x66;
  11. v9[1] = 109;
  12. v9[2] = 99;
  13. v9[3] = 98;
  14. v9[4] = 127;
  15. v9[5] = 58;
  16. v9[6] = 85;
  17. v9[7] = 106;
  18. v9[8] = 57;
  19. v9[9] = 82;
  20. v9[10] = 122;
  21. v9[11] = 55;
  22. v9[12] = 81;
  23. v9[13] = 19;
  24. v9[14] = 51;
  25. v9[15] = 35;
  26. v9[16] = 67;
  27. v9[17] = 70;
  28. v9[18] = 41;
  29. v9[19] = 61;
  30. v9[20] = 41;
  31. v9[21] = 32;
  32. v9[22] = 127;
  33. v9[23] = 28;
  34. v9[24] = 38;
  35. v9[25] = 77;
  36. v9[26] = 49;
  37. v9[27] = 20;
  38. v9[28] = 80;
  39. v9[29] = 94;
  40. v9[30] = -24;
  41. sub_4007F8(v10, 0LL, 4LL);
  42. v7 = 0;
  43. v6 = 0;
  44. a_puts((__int64)aFlag);
  45. do
  46. {
  47. v8 = a_getc();
  48. v6 |= v8 ^ v7 ^ (v7 + (v7 ^ v9[v7]));
  49. v4 = v7++;
  50. }
  51. while ( v8 && v8 != 10 && v8 != -1 );
  52. if ( v6 )
  53. a_write((__int64)aFailed, 0LL, v3, v4);
  54. else
  55. a_write((__int64)aCorrect, 0LL, v3, v4);
  56. return 0;
  57. }

一上来一堆数字,这应该是加密后的flag

aFlag为FLAG:说明这个函数是puts之类的输出函数,对应后边的aFailed就应该也是输出可能是printf,不重要了。

v8 = XXX  这里在循环里最后还比较-1和10说明是getc类的。

恢复完这个流程就比较明白了:

flag输入每次一个字符,然与密文后作一堆运算最后或到v6上,那么如果让v6为0就必需每个字符的运算结果都为0,也就得到了校验公式

v8 = v7 ^ (v7 + (v7 ^ v9[v7]))

对应解码程序

  1. a = [102,109,99,98,127,58,85,106,57,82,122,55,81,19,51,35,67,70,41,61,41,32,127,28,38,77,49,20,80,94]
  2. for i in range(len(a)):
  3. print(chr(i^(i+(i^a[i]))), end='')
  4. #flag{A_s1mpLe&E4sy_RE_i5Nt_1t}

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/807581
推荐阅读
相关标签
  

闽ICP备14008679号