hgame Week2 Reverse WP:upx0 和 CRC16
upx0
听说是放错附件了所以这个并没有UPX壳。。。
IDA打开搜索字符串进入验证函数:
顺了一遍发现这个加密是单向的,然后卡住(我太笨了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的算法原理:
根据CRC16的标准选择初值CRCIn的值;
将数据的第一个字节与CRCIn高8位异或;
判断最高位,若该位为 0 左移一位,若为 1 左移一位再与多项式Hex码异或;
重复3直至8位全部移位计算结束;
重复将所有输入数据操作完成以上步骤,所得16位数即16位CRC校验码。
CRC16_CCITT:
多项式 \(x^{16} + x^{12}+ x^5+1(0x1021)\),初始值\(0x0000\),低位在前,高位在后,结果与\(0x0000\)异或;

浙公网安备 33010602011771号