rev_babyrev
Targetflag[i - 1] = flag[i] ^ flag[i - 1];
}
if(memcmp(flag, checkflag, 31))
{
printf("Wrong!");
}
else
{
printf("Conrect!");
}
由此、可以得到逆向计算逻辑如下
[C] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
char flag[33] = { 0 };
flag[0] = 'I';
unsigned char checkflag[] = {
0x1A, 0x14, 0x3C, 0x13, 0x22, 0x2F, 0x15, 0x49,
0x4D, 0x20, 0x61, 0x62, 0x1B, 0x26, 0x30, 0x2A,
0x19, 0x07, 0x05, 0x0D, 0x16, 0x01, 0x09, 0x14,
0x07, 0x02, 0x1D, 0x4C, 0x08, 0x78, 0x35
};
for (int i = 1; i < 32; i++)
{
flag[i] = checkflag[i - 1] ^ flag[i - 1];
}
printf("%s\n", flag);
得到flag
程序校验
总结一下,这个程序的逆向逻辑其实很简单,难点在于脱upx壳,不过在IDA下调试也不难。另一个难点是64位程序编译时用了大量的xmm寄存器及指令,不常见,但仔细看一下,并不难理解。

浙公网安备 33010602011771号