攻防世界|攻防世界 reverse babymips

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

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

【攻防世界|攻防世界 reverse babymips】
[5:]部分处理:
1 void f_5-end_004007f0(char *op_str) 2 3 { 4size_t lens; 5int iVar1; 6uint i; 7 8i = 5; 9while (lens = strlen(op_str), i < lens) { 10if ((i & 1) == 0) {//偶数时 11op_str[i] = (byte)((uint)((int)op_str[i] << 0x1a) >> 0x18) | op_str[i] >> 6; //高2位右移6位成为低2位,低6位左移2位成为高6位相当于一字节循环左移2位 12} 13else {//奇数时 14op_str[i] = op_str[i] >> 2 | (byte)((uint)((int)op_str[i] << 0x1e) >> 0x18); //高6位右移2位成为低6位,低2位左移6位成为高2位相当于循环右移2位 15} 16i = i + 1; 17} 18iVar1 = strncmp(op_str + 5,PTR_ARRAY_00410d04,0x1b); 19if (iVar1 == 0) { 20puts("Right!"); 21} 22else { 23puts("Wrong!"); 24} 25return; 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): 5t = part2[i-5] 6if i&1==0:#偶数时&1 为0 7part2[i-5]=(t&0x3)<<6|(t&0xfc)>>2#低2位左移6位,高6位右移2位相当于循环右移2位 8else: 9part2[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)): 14flag+=chr(temp[i]^0x20 -i) 15 print(flag)




qctf{ReA11y_4_B@89_mlp5_4_XmAn_}

转载于:https://www.cnblogs.com/DirWang/p/11574317.html

    推荐阅读