浙江省第5届信息安全大赛2022-初赛
0x0 前言
第一题太简单就不写了,第二题不知道pycdc这样一个工具,果然只有踩过一个坑才能让自己一直了解更多
0x1 解字节码
exe直接用pyinstxtractor解出来
python3 把struct的头16个字节复制给re.pyc
uncompyle6解字节码,当时对着这个漏了加密的字节码逆了2小时…加密xxtea还猜对了还以为是默认加密,就是解不出来
可以看见最下面这里有一个报错,所以就准备自己解字节码算了
0x2 dis解字节码
一解发现真少了,很难受了,浪费那么多时间
这是我当时对着uncompyle6自己反编译的,所以没有encrypt
0x3 pycdc解字节码
草,当时完全不知道这个工具,直接反编译出代码了,题目难度直降
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,只能说还是题目了解少了,一个方向应该学透点工具了解多点,也不至于那么累了。