zoukankan      html  css  js  c++  java
  • Reserve ctf SSE_KEYGENME VAX2学习

     最近的一场ctf比赛,让我去学习了这个

    首先附上我查看的一个很重要的资料

    打开ida查看代码

     发现主要判断函数再于这个check_login这个函数,然后点进去看看

    loc_94E:
    mov     [rbp+var_108], 1
    mov     [rbp+var_107], 1
    mov     [rbp+var_106], 1
    mov     [rbp+var_105], 1
    mov     [rbp+var_104], 1
    mov     [rbp+var_103], 1
    mov     [rbp+var_102], 1
    mov     [rbp+var_101], 1
    mov     [rbp+var_100], 1
    mov     [rbp+var_FF], 1
    mov     [rbp+var_FE], 1
    mov     [rbp+var_FD], 1
    mov     [rbp+var_FC], 1
    mov     [rbp+var_FB], 1
    mov     [rbp+var_FA], 1
    mov     [rbp+var_F9], 1
    movzx   edx, [rbp+var_100]
    movzx   eax, [rbp+var_FF]
    shl     rdx, 8
    or      rdx, rax
    movzx   eax, [rbp+var_FE]
    shl     rdx, 8
    or      rdx, rax
    movzx   eax, [rbp+var_FD]
    shl     rdx, 8
    or      rdx, rax
    movzx   eax, [rbp+var_FC]
    shl     rdx, 8
    or      rdx, rax
    movzx   eax, [rbp+var_FB]
    shl     rdx, 8
    or      rdx, rax
    movzx   eax, [rbp+var_FA]
    shl     rdx, 8
    or      rdx, rax
    movzx   eax, [rbp+var_F9]
    shl     rdx, 8
    or      rdx, rax
    movzx   eax, [rbp+var_108]
    movzx   ecx, [rbp+var_107]
    shl     rax, 8
    or      rax, rcx
    movzx   ecx, [rbp+var_106]
    shl     rax, 8
    or      rax, rcx
    movzx   ecx, [rbp+var_105]
    shl     rax, 8
    or      rax, rcx
    movzx   ecx, [rbp+var_104]
    shl     rax, 8
    or      rax, rcx
    movzx   ecx, [rbp+var_103]
    shl     rax, 8
    or      rax, rcx
    movzx   ecx, [rbp+var_102]
    shl     rax, 8
    or      rax, rcx
    movzx   ecx, [rbp+var_101]
    shl     rax, 8
    or      rax, rcx
    mov     qword ptr [rbp+var_130], rdx
    mov     qword ptr [rbp+var_130+8], rax
    vmovaps xmm0, [rbp+var_130]
    vmovaps [rbp+var_C0], xmm0
    lea     rax, p_box
    mov     [rbp+var_C8], rax
    mov     rax, [rbp+var_C8]
    vlddqu  xmm0, xmmword ptr [rax]
    vmovaps [rbp+var_B0], xmm0
    lea     rax, x_box
    mov     [rbp+var_D0], rax
    mov     rax, [rbp+var_D0]
    vlddqu  xmm0, xmmword ptr [rax]
    vmovaps [rbp+var_A0], xmm0
    vmovaps xmm0, [rbp+var_B0]
    vmovaps [rbp+var_20], xmm0
    vmovaps xmm0, [rbp+var_C0]
    vmovaps [rbp+var_10], xmm0
    vmovaps xmm0, [rbp+var_20]
    vmovaps xmm1, [rbp+var_10]
    vpsubb  xmm0, xmm0, xmm1
    vmovaps [rbp+var_B0], xmm0
    mov     rdx, [rbp+var_118]
    mov     rax, [rbp+var_F8]
    add     rax, rdx
    mov     [rbp+var_D8], rax
    mov     rax, [rbp+var_D8]
    vlddqu  xmm0, xmmword ptr [rax]
    vmovaps [rbp+var_90], xmm0
    vmovaps xmm0, [rbp+var_90]
    vmovaps [rbp+var_40], xmm0
    vmovaps xmm0, [rbp+var_B0]
    vmovaps [rbp+var_30], xmm0
    vmovaps xmm1, [rbp+var_30]
    vmovaps xmm0, [rbp+var_40]
    vpshufb xmm0, xmm0, xmm1
    vmovaps [rbp+var_80], xmm0
    vmovaps xmm0, [rbp+var_80]
    vmovaps [rbp+var_60], xmm0
    vmovaps xmm0, [rbp+var_A0]
    vmovaps [rbp+var_50], xmm0
    vmovaps xmm1, [rbp+var_60]
    vmovaps xmm0, [rbp+var_50]
    vxorps  xmm0, xmm1, xmm0
    vmovaps [rbp+var_80], xmm0
    mov     rdx, [rbp+ptr]
    mov     rax, [rbp+var_F8]
    add     rax, rdx
    mov     [rbp+var_E0], rax
    vmovaps xmm0, [rbp+var_80]
    vmovaps [rbp+var_70], xmm0
    vmovaps xmm0, [rbp+var_70]
    mov     rax, [rbp+var_E0]
    vmovups xmmword ptr [rax], xmm0
    add     [rbp+var_F8], 10h

    发现了这一串函数,一开始我在查找vpshufb这个指令的时候以为是国密加密,所以去看了很久,然后发现其实这个是打乱你原本字节顺序的函数,而打乱是根据你的第一个操作数打乱的,所以通过代码不难发现每次的第一个操作数都是同一个,所以打乱顺序都一样,记录下来,在解密就可以轻松解决

     1     char s1[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 0 };
     2     char flag[] = { 0x43,0x51,0x43,0x36,0x40,0x52,0x21,0x55,0x24,0x42,0x5b,0x68,0x7d,0x67,0x1f,0x7b,0x5d,0x7e,0x4e,0x0e,0x58,0x4,0x22,0x40,0x1e,0x14,0x16,0x2c,0x20,0x22,0x26,0x34 };
     3     char temp1[33]{ 0 };
     4     for (int i = 0; i < 2; i++)
     5     {
     6         for (int j = 0; j < 16; j++)
     7         {
     8             temp1[i * 16 + j] = flag[i * 16 + j] ^ s1[j];
     9         }
    10         cout << temp1 << endl;
    11     }
    12     
    13     cout << endl;
    14     cout << endl;
    15     cout << endl;
    16     cout << endl;
    17 
    18 
    19     int arr1[] = { 4, 0, 7, 15, 2, 6, 1, 9, 14, 13, 10, 5, 12, 3, 11, 8 };
    20     char arr2[33] = { 0 };
    21     for (int i = 0; i < 2; i++)
    22     {
    23         for (int j = 0; j < 16; j++)
    24         {
    25             arr2[i * 16 + j] = temp1[i * 16+ arr1[j]];
    26         }
    27         cout << arr2<<endl;
    28     }
  • 相关阅读:
    Redis设置过期时间
    javascript 进制转换(2进制、8进制、10进制、16进制之间的转换)
    123456---com.twoapp.fengkuangqiuqiu---疯狂球球
    123456---com.twoapp.taiKongLvXing---太空旅行
    123457---com.twoapp.shuXueYouXi---小学数学口算
    123456---com.twoapp.huanYingMotro--- 幻影摩托
    123456---com.twoapp.xiaoxiaofeixingyuan---小小飞行员
    123456---com.twoapp.xiaoxiaozuqiujiang---小小足球将
    123457---脑筋急转弯01--com.threeObj03.JiZhuanWan
    123457---小小数学家--com.twoapp.xiaoxiaoshuxuejia
  • 原文地址:https://www.cnblogs.com/pppyyyzzz/p/13941123.html
Copyright © 2011-2022 走看看