记一次Flag获取

题目链接http://ctf5.shiyanbar.com/qwctf/flag-checker.html
这是实验吧的一个题目很简单打开链接弹出一个input框输入正确的值就是flag,验证也很简单首先是输入长度必须是47后面全部是一些方程。通过解这个题目我巩固了栈,求逆波兰表达式,和逆波兰表达式求值。基础很重要决定记录下来。
思路:将判断表达式提取出来用&&来分割出方程,在经过方程长度排序,将方程已知未知数替换为数字最后得出结果。

代码

import java.util.ArrayList;
import java.util.List;

import org.omg.CosNaming.IstringHelper;


public class Main {

    public static int min(int a[]){
        int tmp=a[0];
        int res=0;
        for(int j=1;j<a.length;j++){
            if(tmp>a[j]){
                tmp=a[j];
                res=j;
            }
        }
        return res;
    }
    public static void main(String[] args) {
        String input = "a[11]-a[5]%a[1]*a[12]%a[14]-a[6]*a[7]-a[24]+a[10]%a[13]+a[2]*a[23]+a[21]+a[15]%a[3]%a[19]-a[20]*a[0]%a[17]+a[18]-a[22]+a[8]+a[4]-a[9]+a[25]+a[16]==-161&&a[14]+a[19]%a[20]-a[3]-a[4]+a[5]%a[23]%a[12]%a[21]-a[18]%a[24]%a[0]+a[6]*a[17]-a[7]*a[9]-a[10]+a[8]+a[22]*a[15]%a[16]-a[26]-a[1]%a[11]+a[2]+a[25]+a[13]==-42&&a[34]+a[27]+a[29]-a[10]*a[13]*a[20]%a[31]+a[2]*a[23]-a[0]*a[8]-a[6]*a[9]-a[19]%a[3]+a[15]%a[1]-a[25]-a[26]*a[16]%a[30]-a[17]+a[12]+a[5]-a[33]+a[21]+a[24]*a[14]+a[11]*a[32]-a[22]*a[4]+a[18]+a[28]-a[7]==-56&&a[20]+a[13]%a[4]-a[21]+a[16]-a[12]+a[11]%a[9]%a[3]%a[0]*a[8]%a[2]+a[5]%a[17]+a[15]-a[10]%a[18]-a[6]-a[1]-a[19]*a[7]%a[14]==-76&&a[6]%a[29]+a[4]+a[18]%a[22]+a[16]+a[30]-a[19]*a[21]+a[24]+a[5]-a[34]*a[13]+a[17]*a[11]-a[31]*a[23]+a[14]+a[28]+a[20]-a[10]+a[32]+a[33]%a[12]*a[26]+a[2]%a[15]*a[1]+a[27]*a[25]-a[3]%a[7]%a[8]*a[9]-a[0]+a[35]==-129&&a[1]*a[3]*a[5]%a[6]-a[2]%a[0]+a[4]-a[7]==18&&a[19]+a[20]+a[4]+a[0]-a[17]-a[8]-a[2]*a[7]+a[18]-a[14]-a[3]-a[5]+a[10]-a[11]+a[6]*a[1]%a[13]%a[15]*a[12]-a[9]-a[16]==-36&&a[6]-a[1]+a[4]+a[0]%a[5]%a[2]-a[3]==21&&a[1]-a[5]%a[4]%a[8]%a[3]-a[10]-a[0]%a[7]%a[9]%a[6]-a[2]==-157&&a[9]%a[5]-a[11]+a[7]-a[0]%a[10]*a[4]%a[3]+a[1]-a[6]%a[8]+a[2]==99&&a[1]+a[4]%a[0]%a[3]*a[7]%a[6]-a[8]-a[2]+a[5]==127&&a[8]+a[34]%a[10]%a[4]%a[16]+a[25]+a[15]-a[31]-a[2]*a[3]-a[27]*a[13]%a[23]%a[1]+a[17]*a[26]+a[5]%a[30]+a[35]%a[36]+a[22]%a[7]%a[29]-a[21]+a[28]*a[18]-a[37]+a[38]+a[11]%a[20]+a[9]-a[32]-a[0]*a[14]+a[33]*a[12]+a[24]-a[19]+a[6]==4&&a[2]-a[1]-a[3]+a[0]==-12&&a[6]%a[25]%a[17]+a[24]-a[23]+a[15]%a[31]*a[13]+a[29]-a[12]%a[0]*a[11]-a[27]+a[5]-a[2]-a[10]%a[28]*a[14]-a[8]+a[7]*a[22]+a[26]+a[3]%a[21]+a[32]-a[20]*a[4]+a[30]+a[18]*a[16]-a[9]%a[1]%a[19]==132&&a[17]-a[11]+a[1]-a[0]%a[5]*a[12]%a[13]+a[4]%a[14]-a[10]-a[15]%a[8]%a[7]+a[6]-a[2]%a[16]+a[9]+a[3]==128&&a[28]+a[19]*a[9]+a[26]%a[5]-a[22]+a[3]%a[4]+a[12]%a[0]+a[25]%a[2]%a[13]-a[15]+a[23]%a[21]*a[27]%a[20]%a[16]%a[11]+a[24]%a[7]-a[6]*a[1]-a[14]+a[18]+a[10]%a[8]-a[17]==-43&&a[11]*a[2]%a[19]*a[6]-a[14]+a[32]*a[1]%a[28]-a[3]%a[27]-a[4]+a[13]+a[24]%a[12]-a[10]+a[23]-a[15]%a[0]%a[31]%a[16]-a[17]*a[7]%a[21]%a[20]%a[25]*a[8]+a[22]*a[18]%a[5]-a[26]+a[33]+a[9]%a[30]%a[29]==87&&a[11]*a[17]%a[16]-a[18]%a[13]+a[10]+a[0]%a[5]-a[23]+a[15]*a[21]%a[20]+a[9]+a[7]-a[19]*a[2]-a[24]+a[1]*a[14]+a[6]%a[4]%a[8]%a[3]-a[22]-a[12]==-130&&a[1]-a[3]-a[6]*a[9]%a[13]-a[18]+a[2]*a[12]*a[7]%a[0]-a[16]+a[17]-a[4]*a[5]%a[14]+a[10]*a[11]*a[15]%a[8]==-123&&a[14]-a[26]-a[21]+a[34]%a[15]+a[9]+a[19]%a[13]+a[36]+a[18]%a[11]*a[12]%a[30]+a[29]+a[31]%a[17]-a[5]*a[24]*a[20]%a[8]%a[22]-a[4]-a[25]%a[10]-a[6]-a[3]-a[0]*a[23]%a[35]+a[28]%a[16]%a[32]%a[2]+a[33]-a[1]*a[27]%a[7]==-75&&a[31]%a[38]+a[23]%a[33]-a[10]*a[3]+a[5]+a[35]-a[20]%a[27]*a[13]+a[30]%a[14]*a[1]%a[6]+a[37]%a[4]-a[26]*a[21]-a[7]-a[36]-a[16]*a[0]+a[28]*a[34]*a[42]*a[41]%a[9]-a[15]+a[19]*a[24]+a[11]*a[17]+a[39]%a[32]+a[43]+a[18]*a[2]-a[12]-a[25]-a[29]-a[22]+a[8]*a[40]==123&&a[4]*a[3]%a[2]%a[0]-a[5]+a[1]==48&&a[25]-a[30]+a[16]-a[37]-a[21]*a[36]*a[4]%a[11]+a[32]-a[29]%a[34]-a[2]+a[20]%a[1]+a[10]-a[33]+a[0]%a[19]-a[22]+a[8]+a[13]%a[31]+a[17]%a[24]%a[7]+a[26]-a[3]%a[14]%a[12]*a[5]%a[18]-a[23]*a[6]%a[28]+a[15]-a[35]+a[27]%a[9]==21&&a[2]-a[4]+a[3]%a[0]+a[1]==83&&a[7]*a[21]*a[12]%a[3]-a[17]-a[38]+a[23]+a[6]%a[28]%a[27]%a[14]%a[39]+a[13]+a[32]+a[40]-a[4]-a[8]%a[11]%a[25]*a[31]+a[20]*a[24]%a[29]%a[34]*a[30]%a[33]%a[5]-a[26]*a[18]%a[2]+a[10]+a[36]*a[9]%a[37]*a[19]-a[15]*a[1]%a[35]%a[22]%a[16]-a[0]==75&&a[27]*a[29]*a[11]%a[8]-a[24]*a[16]+a[10]%a[2]%a[7]*a[6]+a[23]+a[0]+a[4]*a[22]-a[30]+a[12]-a[17]%a[5]%a[1]*a[15]-a[19]*a[20]-a[3]-a[9]-a[13]+a[25]*a[18]%a[14]+a[26]%a[28]*a[21]==19&&a[45]-a[9]%a[42]-a[0]+a[44]%a[20]*a[13]-a[38]%a[36]*a[17]+a[24]+a[31]+a[28]-a[7]%a[16]*a[39]*a[25]*a[1]%a[14]*a[41]-a[18]-a[4]-a[3]%a[10]+a[23]%a[12]+a[37]*a[29]%a[2]+a[30]-a[22]+a[32]%a[34]+a[33]+a[8]%a[26]*a[11]*a[15]%a[40]%a[5]%a[19]-a[21]+a[43]%a[6]*a[35]+a[27]==-76&&a[7]+a[9]+a[1]-a[11]*a[5]*a[3]%a[12]-a[13]-a[4]-a[6]+a[8]%a[2]%a[0]%a[10]==-84&&a[0]-a[1]==-6&&a[2]-a[6]%a[8]+a[7]-a[4]-a[1]%a[3]+a[9]-a[5]+a[0]==50&&a[44]-a[24]+a[25]%a[30]%a[41]*a[3]-a[23]+a[20]*a[38]+a[15]-a[43]+a[8]-a[29]*a[9]+a[27]+a[33]-a[39]*a[18]%a[0]+a[7]-a[6]-a[42]-a[2]+a[31]+a[4]-a[32]*a[40]-a[22]+a[13]+a[34]%a[17]*a[14]%a[37]+a[36]-a[10]*a[5]%a[11]*a[19]+a[12]+a[16]%a[35]*a[21]+a[28]-a[26]-a[1]==-44&&a[9]%a[3]%a[7]%a[0]%a[4]-a[2]-a[11]-a[12]+a[6]-a[5]%a[10]+a[8]-a[1]==-187&&a[8]%a[7]+a[6]-a[14]-a[4]%a[17]+a[11]-a[12]%a[5]%a[2]+a[15]-a[9]%a[10]*a[13]%a[0]-a[18]+a[19]+a[16]-a[3]-a[1]==-7&&a[12]%a[3]+a[15]-a[0]-a[11]+a[13]+a[4]*a[2]%a[1]-a[10]-a[5]+a[9]+a[6]%a[7]*a[8]%a[14]==-22&&a[4]+a[16]+a[10]+a[5]-a[7]-a[11]-a[9]%a[13]-a[1]-a[12]%a[2]*a[14]%a[8]%a[6]+a[3]-a[15]%a[0]==97&&a[0]*a[1]%a[11]*a[14]%a[10]+a[5]+a[7]%a[13]-a[4]%a[19]-a[15]-a[8]%a[18]%a[21]%a[12]%a[17]-a[3]%a[9]-a[6]+a[20]+a[16]+a[22]-a[2]==112&&a[0]==102&&a[2]+a[0]-a[1]==91&&a[5]*a[4]%a[12]+a[18]+a[27]+a[22]+a[21]-a[10]-a[25]-a[20]%a[7]+a[14]%a[17]%a[23]+a[19]*a[13]%a[26]-a[1]*a[3]%a[8]+a[24]-a[6]+a[16]+a[0]-a[9]-a[15]%a[2]-a[11]==163&&a[8]*a[10]*a[4]*a[21]%a[26]*a[6]%a[14]+a[22]*a[5]+a[18]-a[25]-a[7]-a[11]+a[23]-a[9]*a[15]-a[2]+a[28]%a[17]*a[1]%a[0]-a[3]%a[16]-a[12]*a[20]+a[29]+a[27]%a[24]%a[19]-a[13]==-46&&a[21]-a[36]-a[16]+a[28]-a[3]%a[1]+a[35]-a[8]-a[30]+a[29]%a[19]+a[39]-a[2]+a[24]*a[11]%a[34]%a[15]%a[38]%a[12]-a[33]+a[20]%a[14]-a[18]-a[31]+a[5]%a[10]+a[7]+a[4]%a[26]*a[23]+a[27]-a[6]*a[37]%a[17]*a[25]%a[9]%a[22]-a[0]*a[13]%a[32]==184&&a[38]*a[34]%a[30]-a[31]+a[26]-a[27]-a[16]%a[0]-a[18]%a[24]%a[29]%a[12]+a[20]-a[15]*a[7]+a[17]-a[13]-a[36]-a[25]%a[8]*a[22]+a[6]-a[35]%a[39]+a[9]%a[3]%a[10]%a[19]*a[37]+a[40]%a[28]+a[41]-a[2]*a[23]*a[4]%a[1]-a[32]%a[14]%a[11]*a[21]%a[5]+a[33]==167&&a[13]-a[6]%a[5]-a[0]%a[9]+a[21]+a[23]+a[18]%a[17]%a[16]%a[7]-a[20]%a[1]*a[15]%a[19]%a[8]*a[2]%a[22]-a[14]%a[11]%a[10]*a[4]%a[3]+a[12]==155&&a[23]+a[26]%a[17]%a[20]*a[39]-a[7]-a[0]-a[27]*a[15]+a[25]%a[18]%a[16]%a[42]%a[32]+a[6]*a[14]-a[2]-a[36]+a[35]+a[29]+a[34]-a[31]-a[5]+a[41]%a[3]*a[13]*a[10]%a[12]-a[21]*a[38]%a[24]-a[46]+a[33]%a[4]%a[11]*a[40]%a[44]+a[28]-a[22]%a[30]+a[8]-a[19]-a[1]*a[43]*a[37]%a[45]+a[9]==183&&a[22]%a[18]+a[12]*a[23]-a[41]*a[17]+a[15]-a[5]%a[25]-a[14]%a[16]-a[3]+a[36]+a[1]-a[42]+a[26]%a[39]%a[10]+a[28]%a[27]-a[7]-a[30]-a[19]%a[2]+a[32]%a[0]-a[6]+a[11]-a[13]%a[35]*a[29]-a[4]*a[24]*a[37]%a[40]+a[31]%a[33]*a[38]-a[21]+a[8]*a[34]%a[20]*a[9]==39&&a[6]%a[0]*a[9]%a[2]%a[4]%a[10]-a[14]+a[13]%a[11]-a[8]%a[5]+a[7]+a[12]+a[1]-a[3]==163&&a[13]-a[15]+a[23]*a[17]*a[27]%a[8]-a[14]%a[22]-a[29]*a[5]%a[25]+a[4]%a[10]-a[19]%a[7]%a[12]%a[11]+a[20]+a[31]+a[18]+a[21]*a[30]%a[1]%a[28]+a[0]%a[26]+a[6]%a[24]%a[3]-a[2]-a[16]-a[9]==147";
        String[] split = input.split("&&");
        int tmp[]=new int[47]; 
        int sort[]=new int[47];
        int output[]=new int[48];
        for(int i=0;i<split.length;i++){
            tmp[i]=split[i].length();
            int index = split[i].indexOf("==");
            String s1 = split[i].substring(index+2);
            if(s1.charAt(0)=='-') {
                split[i]=split[i].substring(0, index)+"+"+s1.substring(1)+"==0";
            }
            else{
                split[i]=split[i].substring(0, index)+"-"+s1.substring(0)+"==0";
            }
            //System.out.println(split[i].substring(index+2));
        }
        for(int i=0;i<47;i++) {
            int res = min(tmp);
            sort[i]=res;
            tmp[res]=65536;
        }
        for(int i=0;i<47;i++){
            String s=split[sort[i]];
            int index = s.indexOf("a["+i+"]");
            if(index==0) {
                split[sort[i]]=s.substring(index+("a["+i+"]").length(), s.indexOf("=="))+"=="+"-a["+i+"]";
            }
            else if(s.charAt(index-1)=='-') {
                split[sort[i]]=s.substring(0,index-1)+s.substring(index+("a["+i+"]").length(), s.indexOf("=="))+"=="+"a["+i+"]";
            }
            else {
                split[sort[i]]=s.substring(0,index-1)+s.substring(index+("a["+i+"]").length(), s.indexOf("=="))+"=="+"-a["+i+"]";
            }
        }
        output[0]=102;
        for(int i=1;i<47;i++){
            int res;
            for(int j=0;j<i;j++){
                split[sort[i]]=split[sort[i]].replaceAll("a\\["+j+"\\]", output[j]+"");
            }
            String[] strings = split[sort[i]].split("==");
            //System.out.println(strings[0]+"\n"+strings[1]);
            if(strings[1].charAt(0)=='-') {
                //System.out.println(strings[0]);
                if(strings[0].charAt(0)=='-'||strings[0].charAt(0)=='+'){
                    res=0-calculate("0"+strings[0]);
                }
                else {
                    res=0-calculate(strings[0]);
                }
            }
            else {
                res=calculate(strings[0]);
            }

            output[i]=res;
        }

        for(int i=0;i<47;i++) {
            System.out.print((char)output[i]);
        }

    }
    private static int calculate(String string) {
        //String[] operators= string.split("[\\+\\-\\%\\*]");
        //String[] operands = string.split("[0-9]+");
        String s="";
        List<String> output =new ArrayList<String>();
        Stack<String> stack = new Stack<String>(100);
        //int k=0;
        //int l=1;

        String digit="";
        for(int i=0;i<string.length();i++) {
            char c = string.charAt(i);
            if(isOper(c)) {
                output.add(digit);
                digit="";
                if(!stack.isEmpty()) {
                    while(!stack.isEmpty()&&isHigh(stack.getTop().charAt(0),c)) {
                        output.add(stack.pop());
                    }
                    stack.push(c+"");
                }
                else {
                    stack.push(c+"");
                }
            }
            if(c>='0'&&c<='9'){
                digit+=c;
            }
        }
        output.add(digit);

        while(!stack.isEmpty()) {
            output.add(stack.pop());
        }
        for(int i=0;i<output.size();i++) {
            s=s+output.get(i)+" ";
        }
        for(int i=0;i<output.size();i++) {
            String s1 = output.get(i);
            if(isOper(s1.charAt(0))) {
                String v2=stack.pop();
                String v1 = stack.pop();
                stack.push(twoOperators(v1,v2,s1));
            }
            else {
                stack.push(s1);
            }
        }

        return Integer.parseInt(stack.pop());
    }
    //判断是否为操作符
    static boolean isOper(char c) {
        if ((c== '+')||(c== '-')||(c== '%')||(c== '*'))
        return true;
        return false;
    }
    //判断操作符的优先级
    //top_op为栈顶操作符
    //InfixExp_op为当前读入操作符
    //如果栈顶操作符优先级高,则弹出栈顶操作符
    //如果栈顶操作符优先级低,则压入当前读入操作符
    static boolean isHigh(char top_op,char InfixExp_op){
        if ((top_op== '+')&&(InfixExp_op== '+')) return true;
        if ((top_op== '+')&&(InfixExp_op== '-')) return true;
        if ((top_op== '-')&&(InfixExp_op== '+')) return true;
        if ((top_op== '-')&&(InfixExp_op== '-')) return true;
        if ((top_op== '%')&&(InfixExp_op== '+')) return true;
        if ((top_op== '%')&&(InfixExp_op== '-')) return true;
        if ((top_op== '%')&&(InfixExp_op== '%')) return true;
        if ((top_op== '%')&&(InfixExp_op== '*')) return true;
        if ((top_op== '*')&&(InfixExp_op== '+')) return true;
        if ((top_op== '*')&&(InfixExp_op== '-')) return true;
        if ((top_op== '*')&&(InfixExp_op== '*')) return true;
        if ((top_op== '*')&&(InfixExp_op== '%')) return true;

        return false;
    }
    static String twoOperators(String operator1, String operator2, String o){
        String result = "";
        int o1 = Integer.parseInt(operator1);
        int o2 = Integer.parseInt(operator2);
        int count = 0;
        if(o.equals("+")){
            count=o1+o2;
        }else if(o.equals("%")){
            count=o1%o2;
        }
        else if(o.equals("*")){
            count=o1*o2;
        }
        else if(o.equals("-")){
            count=o1-o2;
        }
        return result+count;
    }
    private static class Stack<E> {
        private Object[] arr;
        private int top=-1;
        private int len;
        public Stack(int len) {
            this.len =len;
            arr =new Object[len];
        }
        public void push(E e) {
            if(top==len-1) {
                return;
            }
            arr[++top]=e;
        }
        public E pop() {
            if(top==-1){
                return null;
            }
            Object e = arr[top--];
            return (E)e;
        }
        public boolean isEmpty() {
            if(top==-1)
                return true;
            return false;
        }
        public E getTop() {
            return (E)arr[top];
        }
    }
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值