mozhucy's blog.

qctf-mips

字数统计: 396阅读时长: 1 min
2018/07/15 Share

题目分析

  • 分析代码,首先是第一个函数(简单异或,操作以后和一个长度为5的字符串作比较
  • 比较通过后,进入下一个函数,再次处理后27字符,后发现函数根据i&1的返回值分开了执行顺序,即奇偶分开加密
  • 两端代码极其相似(一开始我弄没做出来,看了好久才发现= =)
  • 实际上这两个操作是一个可逆的高低位互换(高二低六)
  • 放出
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "ida.h"
    int main(){
    unsigned char a[32] = {81,124,106,123,103,82, 253, 22, 164, 137, 189, 146, 128, 19, 65,
    84, 160, 141, 69, 24, 129, 222, 252, 149, 240,
    22, 121, 26, 21, 91, 117, 31};
    int i,j,x,y;
    for(i=5;i<32;i++){
    if((i&1)!=0){
    a[i] = ((a[i]<<2)&0xff)|((a[i]>>6)&0xff);
    }
    else{
    a[i] = ((a[i]>>2)&0xff)|((a[i]<<6)&0xff);
    }
    }
    for(i=0;i<32;i++){
    a[i]^=(32-i);
    }
    for(i=0;i<32;i++){
    printf("%c",a[i]);
    }
    }

mips总结

  • 一般的mips最好还是对照着汇编耐心分析(这种需要硬怼汇编的题一定要有耐心啊,无论是这种还是vm,主要是分析稍微繁琐,但是思路都不会没有的
  • 指令中类似于$v0, 0($v0)的,括号中为基址,外面的数字为偏移
  • lw <=相反=> sw
  • 其余还要记住一些算法的特征常量
  • 耐心怼还是最重要的
CATALOG
  1. 1. 题目分析
  2. 2. mips总结