一共有四道re题,两题apk,两题exe
apk本菜鸡完全不会,过了过了
然后就是
signal
这题就是一个 switch
用switch把操作分离,然后用一串数据来实现类似指令的效果,从而实现功能
首先找到输入字符串
char a[] = {
0x0A,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
0x03,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
0x20,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,
0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
0x0B,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,
0x03,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x21,0x00,0x00,0x00,
0x01,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,
0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
0x03,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
0x51,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x24,0x00,0x00,0x00,
0x01,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,
0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
0x02,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
0x36,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x41,0x00,0x00,0x00,
0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,
0x03,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x25,0x00,0x00,0x00,
0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
0x03,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
0x41,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
0x07,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,
0x07,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x32,0x00,0x00,0x00,
0x07,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x33,0x00,0x00,0x00,
0x07,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0xA7,0xFF,0xFF,0xFF,
0x07,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0xF1,0xFF,0xFF,0xFF,
0x07,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x84,0xFF,0xFF,0xFF,
0x07,0x00,0x00,0x00,0xC1,0xFF,0xFF,0xFF,0x07,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,
0x07,0x00,0x00,0x00,0x7A,0x00,0x00,0x00,0x90,0x20,0x40,0x00,0x00,0x00,0x00,0x00,
0x26,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x18,0x29,0x6E,0x00,0x26,0x00,0x00,0x00
};
然后是用int型的,其实也没多少个
然后把ida里的加密函数拷贝一下,稍微修改一下
int vm_operad(int *a,int a2)
{
int i = 0;
int v6 = 0;
int v7 = 0;
int v8 = 0;
int v9 = 0;
char v4[100] = {NULL};
char v3[100] = {NULL};
int v5 = 0;
while(1)
{
if(i >= a2)
break;
switch(a[i])
{
case 1:v4[v7] = v5;
++i;
++v7;
++v9;break;
case 2:v5 = a[i+1] + v3[v9]; i+=2;break;
case 3:v5 = v3[v9] - a[i+1]; i+=2;break;
case 4:v5 = a[i+1] ^ v3[v9]; i+=2;break;
case 5:v5 = a[i+1] * v3[v9]; i+=2;break;
case 6:i++;break;
case 7:v4[v8] == a[i+1]; v8++; i+= 2;break;
case 8:v3[v6] = v5; i++; v6++;break;
case 9:;;;break;
case 10:{
printf("string\n");
scanf("%s",v3);
i++;
};break;
case 11:v5 = v3[v9] - 1; i++;break;
case 12:v5 = v3[v9] + 1; i++;break;
default:;break;
}
printf("%d,%d\n",i,a[i]); //获得流程 存放到b数组中,因为这题不能逆推顺序
}
printf("\n\n\n\n\nv6 = %d\nv7=%d\nv8=%d\nv9=%d\n",v6,v7,v8,v9); //输出这些数组最后的值
return 1;
}
然后进行逆算法
int devm_operad(unsigned int *a,int a2)
{
int i;
int j = a2-1;
int v5;
int v6 = 15;
int v7 = 15;
int v8 = 15;
int v9 = 15;
unsigned char v4[100] = {NULL}; //不用unsigned 进行除法会有问题
unsigned char v3[100] = {NULL};
while(1)
{
if(j < 0)
break;
i = b[j];
if(i == 70)
{
printf("0");
printf("%s",v4);
}
switch(a[i])
{
case 1: v7--;v9--; v5 = v4[v7];break;
case 2: v3[v9] = v5 - a[i+1];break;
case 3: v3[v9] = v5 + a[i+1];break;
case 4: v3[v9] = a[i+1]^v5;break;
case 5: v3[v9] = v5/a[i+1];break;
case 6: break;
case 7: v8--; v4[v8] = a[i+1]; break;
case 8:v6--; v5 = v3[v6];break;
case 10: break;
case 11: v3[v9] = v5+1;break;
case 12: v3[v9] = v5-1;break;
default:;break;
}
j--;
printf("%d,%d\n",i,a[i]);
}
printf("%d %d %d %d\n",v6,v7,v8,v9);
printf("flag{%s}",v3); //直接打印值,完事
return 0;
}
然后是
joker
所以输入字符串为24位
wrong+omg 都是无效操作,恶心人的
然后是重点 代码段被简单加密了
整个代码段进行了 xor 0x41
od 断点下到这个循环做完//然后把内存dump下来,我不会,所以直接看着汇编翻译的
大致翻译成这样,就是取用户输入和hahahaha_do_you_find_me?进行异或运算
即用户输入[i] xor hahaha[i] = 403040[i] // 403040是一次+4位其他两个数组都是+1
然后最后是脑洞,这个是真的坑人
有个字符串d[] = 25 74 70 26 3A
代码里有个time(0) srand(),rand() 然后比较 (用户输入[0] != d[0]) == rand()
这段代码有用的就一个字符串
然后根据 最后一位是} 猜是xor操作//我没猜出来
char k = '}' xor 0x3A
for(int i = 0; i < 5; i++)
{
putchar(b[i]^a);
}
解决
wtcl