攻防世界 reverse babymips

babymips   XCTF 4th-QCTF-2018

mips,ida中想要反编译的化需要安装插件,这题并不复杂直接看mips汇编也没什么难度,这里我用了ghidra,直接可以查看反编译。

 1 void FUN_004009a8(void)
 2 
 3 {
 4   int iVar1;
 5   int i;
 6   byte input [36];
 7   
 8   setbuf(stdout,(char *)0x0);
 9   setbuf(stdin,(char *)0x0);
10   printf("Give me your flag:");
11   scanf("%32s",input);
12   i = 0;
13   while (i < 0x20) {
14     input[i] = input[i] ^ 0x20U - (char)i;   //这里将输入进行异或(0x20-i)
15     i = i + 1;
16   }
17   iVar1 = strncmp((char *)input,_fdata,5);   //前5字节输入转换后为 "Q|j{g" 
18 if (iVar1 == 0) {
19   f_5-end_004007f0((char *)input); //转换后的结果进行下一步处理
20 }
21 else {
22   puts("Wrong");
23 }
24 return;
25 }

[5:]部分处理:

 1 void f_5-end_004007f0(char *op_str)
 2 
 3 {
 4   size_t lens;
 5   int iVar1;
 6   uint i;
 7   
 8   i = 5;
 9   while (lens = strlen(op_str), i < lens) {
10     if ((i & 1) == 0) {    //偶数时
11       op_str[i] = (byte)((uint)((int)op_str[i] << 0x1a) >> 0x18) | op_str[i] >> 6;//高2位右移6位成为低2位,低6位左移2位成为高6位  相当于一字节循环左移2位
12     }
13     else {//奇数时
14       op_str[i] = op_str[i] >> 2 | (byte)((uint)((int)op_str[i] << 0x1e) >> 0x18);//高6位右移2位成为低6位,低2位左移6位成为高2位  相当于循环右移2位
15     }
16     i = i + 1;
17   }
18   iVar1 = strncmp(op_str + 5,PTR_ARRAY_00410d04,0x1b);
19   if (iVar1 == 0) {
20     puts("Right!");
21   }
22   else {
23     puts("Wrong!");
24   }
25   return;
26 }

wp:

 1 part1=b'Q|j{g'
 2 part2='52 fd 16 a4 89 bd 92 80 13 41 54 a0 8d 45 18 81 de fc 95 f0 16 79 1a 15 5b 75 1f'
 3 part2=list(bytes.fromhex(part2))
 4 for i in range(5,len(part2)+5):
 5     t = part2[i-5]
 6     if i&1==0:   #偶数时&1 为0
 7         part2[i-5]=(t&0x3)<<6|(t&0xfc)>>2   #低2位左移6位,高6位右移2位  相当于循环右移2位
 8     else:
 9         part2[i-5]=(t&0x3f)<<2|(t&0xc0)>>6  #低6位左移2位,高2位右移6位  相当于循环左移2位
10 
11 temp=list(part1)+part2
12 flag=''
13 for i in range(len(temp)):
14     flag+=chr(temp[i]^0x20 -i)
15 print(flag)

qctf{ReA11y_4_B@89_mlp5_4_XmAn_}

猜你喜欢

转载自www.cnblogs.com/DirWang/p/11574317.html
今日推荐