当前位置:   article > 正文

DASCTF-Strangeprograme_ok

strangeprograme

比赛没写出来,学会了新东西

__________________________________________

进来就发现了flag

DASCTF{I'am Fake But Why Look Like real?}

fake flag,但是but look real????

可以看见它的下面还有数据段

查看他下面数据段的引用

反编译不成功,拆测可能还存在SMC

而且这个数据段也十分可疑

回调

这种fake flag 小心还存在 hook 和tls,

一直找了star 函数

这个tls回调好隐蔽,我找不到

但是我跟着师傅们学到了一个新方法

附加进程

这样的话,比如这道题,在输入之前,我们都是正常运行的代码,系统检查不到动调

我们先在电脑上运行这个程序

dug里面选择attch

我下的断点是在这里,因为这里比较了0x100

很可疑

F7跟进就到了一个新的地方!

桃花源记是吧

而且这一段正巧是我们的DASCTF!

重编译一下

正常了!

一直从开头选到这里,好麻烦啊,我的天,有没有什么简单的方法 

  1. __int64 __cdecl sub_41D250(char *Str)
  2. {
  3. __int64 v1; // rax
  4. __int64 v3; // [esp-8h] [ebp-24Ch]
  5. int j; // [esp+D0h] [ebp-174h]
  6. size_t i; // [esp+F4h] [ebp-150h]
  7. char *v6; // [esp+100h] [ebp-144h]
  8. int v7; // [esp+124h] [ebp-120h] BYREF
  9. int v8; // [esp+128h] [ebp-11Ch]
  10. int v9; // [esp+12Ch] [ebp-118h]
  11. int v10; // [esp+130h] [ebp-114h]
  12. char v11[260]; // [esp+13Ch] [ebp-108h] BYREF
  13. int savedregs; // [esp+244h] [ebp+0h] BYREF
  14. sub_4114D8(&unk_4250F3);
  15. v11[0] = -7;
  16. v11[1] = 77;
  17. v11[2] = 43;
  18. v11[3] = -68;
  19. v11[4] = 19;
  20. v11[5] = -35;
  21. v11[6] = 19;
  22. v11[7] = 98;
  23. v11[8] = -55;
  24. v11[9] = -4;
  25. v11[10] = -1;
  26. v11[11] = -119;
  27. v11[12] = 125;
  28. v11[13] = 79;
  29. v11[14] = -55;
  30. v11[15] = 15;
  31. v11[16] = 99;
  32. v11[17] = 29;
  33. v11[18] = 109;
  34. v11[19] = 82;
  35. v11[20] = 80;
  36. v11[21] = -3;
  37. v11[22] = 65;
  38. v11[23] = -29;
  39. v11[24] = 51;
  40. v11[25] = 118;
  41. v11[26] = 40;
  42. v11[27] = -105;
  43. v11[28] = 56;
  44. v11[29] = 54;
  45. v11[30] = -7;
  46. v11[31] = 107;
  47. v11[32] = -112;
  48. v11[33] = 57;
  49. v11[34] = 20;
  50. v11[35] = -125;
  51. v11[36] = 44;
  52. v11[37] = -30;
  53. v11[38] = 44;
  54. v11[39] = 31;
  55. memset(&v11[40], 0, 216);
  56. v7 = 0;
  57. v8 = 0;
  58. v9 = 0;
  59. v10 = 0;
  60. if ( j_strlen(Str) == 40 )
  61. {
  62. v6 = Str + 4;
  63. v7 = *Str;
  64. v8 = *(Str + 1);
  65. sub_411541(&v7, &unk_422100);
  66. *Str = v7;
  67. *(Str + 1) = v8;
  68. for ( i = 2; i < j_strlen(Str) >> 2; i += 2 )
  69. {
  70. sub_411541(&v7, &unk_422100);
  71. *Str = v7;
  72. *v6 = v8;
  73. *&Str[4 * i] ^= *Str;
  74. *&Str[4 * i + 4] ^= *v6;
  75. }
  76. for ( j = 0; j < 40; ++j )
  77. {
  78. HIDWORD(v1) = j;
  79. if ( Str[j] != v11[j] )
  80. {
  81. LODWORD(v1) = 1;
  82. goto LABEL_12;
  83. }
  84. }
  85. LODWORD(v1) = 0;
  86. }
  87. else
  88. {
  89. LODWORD(v1) = 1;
  90. }
  91. LABEL_12:
  92. v3 = v1;
  93. sub_41130C(&savedregs, &unk_41D5CC);
  94. return v3;
  95. }
  1. int __cdecl sub_41D6F0(unsigned int *a1, _DWORD *a2)
  2. {
  3. int result; // eax
  4. unsigned int i; // [esp+DCh] [ebp-2Ch]
  5. int v4; // [esp+E8h] [ebp-20h]
  6. unsigned int v5; // [esp+F4h] [ebp-14h]
  7. unsigned int v6; // [esp+100h] [ebp-8h]
  8. sub_4114D8(&unk_4250F3);
  9. v6 = *a1;
  10. v5 = a1[1];
  11. v4 = 0;
  12. for ( i = 0; i < 0x10; ++i )
  13. {
  14. v6 += (a2[1] + (v5 >> 5)) ^ (v4 + v5) ^ (*a2 + 16 * v5);
  15. v5 += (a2[3] + (v6 >> 5)) ^ (v4 + v6) ^ (a2[2] + 16 * v6);
  16. v4 -= 1640531527;
  17. }
  18. *a1 = v6;
  19. result = 4;
  20. a1[1] = v5;
  21. return result;
  22. }

很明显,我们看见了tea加密

首先先把这个tea加密给完成了

经典的tea加密,没有很改

  1. void __cdecl dec(unsigned int* a1, unsigned int* a2,int rounds, unsigned long int delta)
  2. {
  3. unsigned int i;
  4. int sum;
  5. unsigned int v4;
  6. unsigned int v5;
  7. v5 = *a1;
  8. v4 = a1[1];
  9. sum = 0;
  10. for (i = 0; i < rounds; ++i)
  11. {
  12. sum -= delta;
  13. }
  14. for (i = 0; i < rounds; ++i)
  15. {
  16. sum += delta;
  17. v4 -= (a2[3] + (v5 >> 5)) ^ (sum + v5) ^ (a2[2] + 16 * v5);
  18. v5 -= (a2[1] + (v4 >> 5)) ^ (sum + v4) ^ (*a2 + 16 * v4);
  19. }
  20. *a1 = v5;
  21. a1[1] = v4;
  22. }

然后我们跳回去

V11是我们的密文了

记得程序要运行到这里啊

不然数据都是错的

0xBC2B4DF9, 0x6213DD13, 0x89FFFCC9, 0x0FC94F7D, 0x526D1D63, 0xE341FD50, 0x97287633, 0x6BF93638,  0x83143990, 0x1F2CE22C

 

先tea,在异或,异或的是

我们输入的密文的第一个和第二个

然后tea解密

最后tea了一次!

理一下

程序先开始tea一下(只tea了开头)

然后循环再tea开头,再异或

最后对比

密文结果就是前面看见的那个数据段!

  1. int main(void) {
  2. int rounds=16;
  3. unsigned long long int delta= 0x61C88647;
  4. unsigned int last[10] = {
  5. 0xBC2B4DF9, 0x6213DD13, 0x89FFFCC9, 0x0FC94F7D, 0x526D1D63, 0xE341FD50, 0x97287633, 0x6BF93638,
  6. 0x83143990, 0x1F2CE22C
  7. };
  8. unsigned int key[4] = {
  9. 0x12345678, 0x09101112, 0x13141516, 0x15161718
  10. };
  11. for (int i = 8; i > 0; i -= 2)
  12. {
  13. last[i] ^= last[0];
  14. last[i + 1] ^= last[1];
  15. dec(last, key,rounds,delta);
  16. }
  17. dec(last, key,rounds,delta);
  18. cout << (char*)last;
  19. }

需要好好学习的一道题!

 

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

闽ICP备14008679号