题目链接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];
}
}
}