记一次Flag获取

xiaoxiao2021-02-27  328

题目链接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]; } } }
转载请注明原文地址: https://www.6miu.com/read-2693.html

最新回复(0)