XCTF 攻防世界 FlagApp

这个题 就so库里面的算法比较难逆向出来 其它还是比较简单的

XCTF 攻防世界 FlagApp_第1张图片

看到这就可以去找一下 我们so库中的check 算法了

XCTF 攻防世界 FlagApp_第2张图片

重点看   v6 这里 _mm_load_si128  就是加载了 16个字节  也就是说我们这里是 有16个字节 做了比较    剩下的 xor  or and 就是同理 能看到的出来   然后我们看一下 

其实 第三个数据 就是和我们前16个字符 轮回异或  

第一个 和第二个 数据 就是 & 运算 我一开始一直在想怎么去 逆向推算 &运算  后来 我想了一下 1F 0E的 二进制  然后才恍然大悟

0E 的 是 ‭1110‬     1F的是‭00011111‬    其实也就是取出 前五位 还有 后三位      然后 我们后面  逆推回去算法就去就行

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "windows.h"
using namespace std;
unsigned int sss[26];
unsigned char ida_chars[] =
{
  0x96, 0x54, 0x14, 0x3F, 0x56, 0x2E, 0x6F, 0x75, 0x24, 0x46,
  0x4C, 0x2B, 0x5A, 0x97, 0x20, 0x85
};
int main()
{
	   sss[0] = 0x3E;
       sss[1] = 0x7D;
       sss[2] = 0x7E;
       sss[3] = 0x50;
       sss[4] = 0x7E;
       sss[5] = 0xE3u;
       sss[6] = 0xE3u;
       sss[7] = 0x3B;
       sss[8] = 0x22;
       sss[9] = 0x60;
       sss[10] = 0xC4u;
       sss[11] = 0xC0u;
       sss[12] = 0x14;
       sss[13] = 0x3F;
       sss[14] = 0x46;
       sss[15] = 0x4B;
       sss[16] = 0x61;
       sss[17] = 0xE;
       sss[18] = 0xD2u;
       sss[19] = 0x94u;
       sss[20] = 0xA5u;
       sss[21] = 0x84u;
       sss[22] = 0x76;
       sss[23] = 0x11;
       sss[24] = 0x58;
       sss[25] = 0x83u;
       sss[16] ^= 0xCD;
       for(int i=0;i<16;i++)
       {
           sss[i]^=ida_chars[i];
           //sss[i]=(((sss[i]>>5)&0x0E)|((sss[i]<<3)&0x1F));
           sss[i]=(((sss[i]>>5))|((sss[i]<<3)));
       }
       sss[16]=(sss[16]>>5|sss[16]<<3);
       sss[17] ^= 0x40;
       sss[17]=(sss[17]>>5|sss[17]<<3);
       sss[18] ^= 0xB4;
       sss[18]= (sss[18]>>5|sss[18]<<3);
       sss[19] ^= 0x38;
       sss[19]=(sss[19]>>5|sss[19]<<3);
       sss[20] ^= 0x4E;
       sss[20]= (sss[20]>>5|sss[20]<<3);
       sss[21]^=  0x2C;
       sss[21]=(sss[21]>>5|sss[21]<<3);
       sss[22]^=0x5A;
       sss[22]=(sss[22]>>5|sss[22]<<3);
       sss[23]^= 0x77;
       sss[23]= (sss[23]>>5|sss[23]<<3);
       sss[24] ^=0x77;
       sss[24]= (sss[24]>>5|sss[24]<<3);
       sss[25]  ^= 0x2C;
       sss[25]= (sss[25]>>5|sss[25]<<3);
       for(int i=0;i<26;i++)
        printf("%c",sss[i]);
    return 0;
}

代码有点垃圾。。。

你可能感兴趣的:(逆向之旅)