• 攻防世界 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_}

  • 相关阅读:
    C语言堆栈入门——堆和栈的区别
    Unity时钟定时器插件——Vision Timer源码分析之一
    UNITY3D 2D物流流体插件下载|Liquid Physics 2D
    Unity3d插件Master Audio AAA Sound v3.5
    游戏行业的女性拥有强大的新盟友:Facebook
    Unity游戏设计与实现 南梦宫一线程序员的开发实例
    Unity4.6证书激活问题
    里诺全系列注册机+暗桩patch
    冰点还原8.53破解版
    NSE: known a priori estimate
  • 原文地址:https://www.cnblogs.com/DirWang/p/11574317.html
Copyright © 2020-2023  润新知