hgame Week2 Reverse WP:upx0 和 CRC16

upx0

听说是放错附件了所以这个并没有UPX壳。。。

IDA打开搜索字符串进入验证函数:image

顺了一遍发现这个加密是单向的,然后卡住(我太笨了T-T)

经过提醒发现可以直接用ascii码可见位直接爆破。

#include <stdio.h>
unsigned short ans[33];
char flag[33];
int main()
{
    ans[0] = 36200;
    ans[1] = 40265;
    ans[2] = 10770;
    ans[3] = 43802;
    ans[4] = 52188;
    ans[5] = 47403;
    ans[6] = 11826;
    ans[7] = 40793;
    ans[8] = 56781;
    ans[9] = 40265;
    ans[10] = 43274;
    ans[11] = 3696;
    ans[12] = 62927;
    ans[13] = 2640;
    ans[14] = 23285;
    ans[15] = 65439;
    ans[16] = 40793;
    ans[17] = 48395;
    ans[18] = 22757;
    ans[19] = 14371;
    ans[20] = 48923;
    ans[21] = 30887;
    ans[22] = 43802;
    ans[23] = 18628;
    ans[24] = 43274;
    ans[25] = 11298;
    ans[26] = 40793;
    ans[27] = 23749;
    ans[28] = 24277;
    ans[29] = 30887;
    ans[30] = 9842;
    ans[31] = 22165;
    int rot = 0;
    unsigned short rot1 = 0;
    char c = 0;
    for (int i = 0; i < 32; i++)
    {
        for (flag[i] = 33; flag[i] < 127; flag[i]++)
        {
            c = flag[i];
            rot = flag[i] << 8;
            for (int j = 0; j < 8; j++)
            {
                if ((rot & 0x8000) == 0)
                    rot *= 2;
                else
                    rot = (rot * 2) ^ 0x1021;
            }
            rot1 = (unsigned __int16)rot;
            if (rot1 == ans[i])
            {
                printf("%c", c);
            }
        }
    }
}

直接运行就可以出flag啦。

后来才发现这个根本不是什么加密算法,就是上学期我刚学过的 CRC-16 校验码,这种都是直接爆破就行了。

CRC16的算法原理:

  1. 根据CRC16的标准选择初值CRCIn的值;

  2. 将数据的第一个字节与CRCIn高8位异或;

  3. 判断最高位,若该位为 0 左移一位,若为 1 左移一位再与多项式Hex码异或;

  4. 重复3直至8位全部移位计算结束;

  5. 重复将所有输入数据操作完成以上步骤,所得16位数即16位CRC校验码。

CRC16_CCITT:

多项式 \(x^{16} + x^{12}+ x^5+1(0x1021)\),初始值\(0x0000\),低位在前,高位在后,结果与\(0x0000\)异或;

posted @ 2022-03-09 22:25  oneQuiz  阅读(60)  评论(0)    收藏  举报