浙江省赛2022初赛


浙江省第5届信息安全大赛2022-初赛

0x0 前言

第一题太简单就不写了,第二题不知道pycdc这样一个工具,果然只有踩过一个坑才能让自己一直了解更多

0x1 解字节码

1

exe直接用pyinstxtractor解出来

2

python3 把struct的头16个字节复制给re.pyc

3

uncompyle6解字节码,当时对着这个漏了加密的字节码逆了2小时…加密xxtea还猜对了还以为是默认加密,就是解不出来

4

可以看见最下面这里有一个报错,所以就准备自己解字节码算了

0x2 dis解字节码

5

一解发现真少了,很难受了,浪费那么多时间

6

这是我当时对着uncompyle6自己反编译的,所以没有encrypt

0x3 pycdc解字节码

7

8

草,当时完全不知道这个工具,直接反编译出代码了,题目难度直降

0x4 解密

#include <stdio.h>
#include <stdint.h>
#define DELTA 0x4E253839
#define MX (((z>>6^y<<3) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e])))

void btea(uint32_t* v, int n, uint32_t const key[4])
{
    uint32_t y, z, sum;
    unsigned p, rounds, e;
    if (n > 1)            /* Coding Part */
    {
        rounds = 6 + 52 / n;
        sum = 0;
        z = v[n - 1];
        do
        {
            sum += DELTA;
            e = (sum >> 2) & 3;
            for (p = 0; p < n - 1; p++)
            {
                y = v[p + 1];
                z = v[p] += MX;
            }
            y = v[0];
            z = v[n - 1] += MX;
        } while (--rounds);
    }
    else if (n < -1)      /* Decoding Part */
    {
        n = -n;
        rounds = 6 + 52 / n;
        sum = rounds * DELTA;
        y = v[0];
        do
        {
            e = (sum >> 2) & 3;
            for (p = n - 1; p > 0; p--)
            {
                z = v[p - 1];
                y = v[p] -= MX;
            }
            z = v[n - 1];
            y = v[0] -= MX;
            sum -= DELTA;
        } while (--rounds);
    }
}


int main()
{
    uint32_t v[2] = { 0x2b137363,0x353a5534 };
    uint32_t const k[4] = { 4,3,2,1 };
    int n = 2; //n的绝对值表示v的长度,取正表示加密,取负表示解密
    // v为要加密的数据是两个32位无符号整数
    // k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位
    btea(v, -n, k);
    printf("解密后的数据:%x %x\n", v[0], v[1]);
    return 0;
}

这里就放一个魔改完的,对着pycdc很好就能发现,delta改了,右6左3,MX最后没有异或z n固定为2

0x5 总结

emmm,只能说还是题目了解少了,一个方向应该学透点工具了解多点,也不至于那么累了。


文章作者: Blue
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Blue !
评论
  目录