[MoeCTF 2021]大佬请喝coffee
题目链接:https://www.ctfer.vip/problem/3382
此题是NSS平台上的一题,所以最后的flag前缀是NSS有关的
下载附件后发现是一个class文件,就猜想到是java的逆向
将文件拖入到GUI后发现如下代码:
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class coffee {
public static void main(String[] paramArrayOfString) {
System.out.println("<--- moectf2021 --->");
System.out.println(" [coffee] Welcome to moectf2021.");
System.out.println("It will be quite ez for you. I guess.");
System.out.print("Input your flag : ");
String str = null;
try {
str = (new BufferedReader(new InputStreamReader(System.in))).readLine();
} catch (Exception exception) {
System.out.println("ERROR: Undefined Exception.");
}
if (str.length() != 9) {
System.out.println("QwQ. You are wrong.");
} else {
char[] arrayOfChar = str.toCharArray();
if (arrayOfChar[0] * 4778 + arrayOfChar[1] * 3659 + arrayOfChar[2] * 9011 + arrayOfChar[3] * 5734 + arrayOfChar[4] * 4076 + arrayOfChar[5] * 6812 + arrayOfChar[6] * 8341 + arrayOfChar[7] * 6765 + arrayOfChar[8] * 7435 == 5711942 && arrayOfChar[0] * 4449 + arrayOfChar[1] * 5454 + arrayOfChar[2] * 4459 + arrayOfChar[3] * 5800 + arrayOfChar[4] * 6685 + arrayOfChar[5] * 6120 + arrayOfChar[6] * 7357 + arrayOfChar[7] * 3561 + arrayOfChar[8] * 5199 == 4885863 && arrayOfChar[0] * 3188 + arrayOfChar[1] * 6278 + arrayOfChar[2] * 9411 + arrayOfChar[3] * 5760 + arrayOfChar[4] * 9909 + arrayOfChar[5] * 7618 + arrayOfChar[6] * 7184 + arrayOfChar[7] * 4791 + arrayOfChar[8] * 8686 == 6387690 && arrayOfChar[0] * 8827 + arrayOfChar[1] * 7419 + arrayOfChar[2] * 7033 + arrayOfChar[3] * 9306 + arrayOfChar[4] * 7300 + arrayOfChar[5] * 5774 + arrayOfChar[6] * 6588 + arrayOfChar[7] * 5541 + arrayOfChar[8] * 4628 == 6077067 && arrayOfChar[0] * 5707 + arrayOfChar[1] * 5793 + arrayOfChar[2] * 4589 + arrayOfChar[3] * 6679 + arrayOfChar[4] * 3972 + arrayOfChar[5] * 5876 + arrayOfChar[6] * 6668 + arrayOfChar[7] * 5951 + arrayOfChar[8] * 9569 == 5492294 && arrayOfChar[0] * 9685 + arrayOfChar[1] * 7370 + arrayOfChar[2] * 4648 + arrayOfChar[3] * 7230 + arrayOfChar[4] * 9614 + arrayOfChar[5] * 9979 + arrayOfChar[6] * 8309 + arrayOfChar[7] * 9631 + arrayOfChar[8] * 9272 == 7562511 && arrayOfChar[0] * 6955 + arrayOfChar[1] * 8567 + arrayOfChar[2] * 7949 + arrayOfChar[3] * 8699 + arrayOfChar[4] * 3284 + arrayOfChar[5] * 6647 + arrayOfChar[6] * 3175 + arrayOfChar[7] * 8506 + arrayOfChar[8] * 6552 == 5970432 && arrayOfChar[0] * 4323 + arrayOfChar[1] * 4706 + arrayOfChar[2] * 8081 + arrayOfChar[3] * 7900 + arrayOfChar[4] * 4862 + arrayOfChar[5] * 9544 + arrayOfChar[6] * 5211 + arrayOfChar[7] * 7443 + arrayOfChar[8] * 5676 == 5834523 && arrayOfChar[0] * 3022 + arrayOfChar[1] * 8999 + arrayOfChar[2] * 5058 + arrayOfChar[3] * 4529 + arrayOfChar[4] * 3940 + arrayOfChar[5] * 4279 + arrayOfChar[6] * 4606 + arrayOfChar[7] * 3428 + arrayOfChar[8] * 8889 == 4681110) {
System.out.println("Congratulations.");
System.out.println("Here is your flag : moectf{" + str + "}");
} else {
System.out.println("You still need learn more!");
System.out.println("Fighting!!!");
}
}
}
}
发现是一个z3
求解脚本:
from z3 import *
arrayOfChar0,arrayOfChar1,arrayOfChar2,arrayOfChar3,arrayOfChar4,arrayOfChar5,arrayOfChar6,arrayOfChar7,arrayOfChar8 = Ints("arrayOfChar0 arrayOfChar1 arrayOfChar2 arrayOfChar3 arrayOfChar4 arrayOfChar5 arrayOfChar6 arrayOfChar7 arrayOfChar8")
s = Solver()
s.add(arrayOfChar0 * 4778 + arrayOfChar1 * 3659 + arrayOfChar2 * 9011 + arrayOfChar3 * 5734 + arrayOfChar4 * 4076 + arrayOfChar5 * 6812 + arrayOfChar6 * 8341 + arrayOfChar7 * 6765 + arrayOfChar8 * 7435 == 5711942)
s.add(arrayOfChar0 * 4449 + arrayOfChar1 * 5454 + arrayOfChar2 * 4459 + arrayOfChar3 * 5800 + arrayOfChar4 * 6685 + arrayOfChar5 * 6120 + arrayOfChar6 * 7357 + arrayOfChar7 * 3561 + arrayOfChar8 * 5199 == 4885863)
s.add(arrayOfChar0 * 3188 + arrayOfChar1 * 6278 + arrayOfChar2 * 9411 + arrayOfChar3 * 5760 + arrayOfChar4 * 9909 + arrayOfChar5 * 7618 + arrayOfChar6 * 7184 + arrayOfChar7 * 4791 + arrayOfChar8 * 8686 == 6387690)
s.add(arrayOfChar0 * 8827 + arrayOfChar1 * 7419 + arrayOfChar2 * 7033 + arrayOfChar3 * 9306 + arrayOfChar4 * 7300 + arrayOfChar5 * 5774 + arrayOfChar6 * 6588 + arrayOfChar7 * 5541 + arrayOfChar8 * 4628 == 6077067)
s.add(arrayOfChar0 * 5707 + arrayOfChar1 * 5793 + arrayOfChar2 * 4589 + arrayOfChar3 * 6679 + arrayOfChar4 * 3972 + arrayOfChar5 * 5876 + arrayOfChar6 * 6668 + arrayOfChar7 * 5951 + arrayOfChar8 * 9569 == 5492294)
s.add(arrayOfChar0 * 9685 + arrayOfChar1 * 7370 + arrayOfChar2 * 4648 + arrayOfChar3 * 7230 + arrayOfChar4 * 9614 + arrayOfChar5 * 9979 + arrayOfChar6 * 8309 + arrayOfChar7 * 9631 + arrayOfChar8 * 9272 == 7562511)
s.add(arrayOfChar0 * 6955 + arrayOfChar1 * 8567 + arrayOfChar2 * 7949 + arrayOfChar3 * 8699 + arrayOfChar4 * 3284 + arrayOfChar5 * 6647 + arrayOfChar6 * 3175 + arrayOfChar7 * 8506 + arrayOfChar8 * 6552 == 5970432)
s.add(arrayOfChar0 * 4323 + arrayOfChar1 * 4706 + arrayOfChar2 * 8081 + arrayOfChar3 * 7900 + arrayOfChar4 * 4862 + arrayOfChar5 * 9544 + arrayOfChar6 * 5211 + arrayOfChar7 * 7443 + arrayOfChar8 * 5676 == 5834523)
s.add(arrayOfChar0 * 3022 + arrayOfChar1 * 8999 + arrayOfChar2 * 5058 + arrayOfChar3 * 4529 + arrayOfChar4 * 3940 + arrayOfChar5 * 4279 + arrayOfChar6 * 4606 + arrayOfChar7 * 3428 + arrayOfChar8 * 8889 == 4681110)
flag = []
if s.check() == sat:
ans=s.model()
flag.append(ans[arrayOfChar0])
flag.append(ans[arrayOfChar1])
flag.append(ans[arrayOfChar2])
flag.append(ans[arrayOfChar3])
flag.append(ans[arrayOfChar4])
flag.append(ans[arrayOfChar5])
flag.append(ans[arrayOfChar6])
flag.append(ans[arrayOfChar7])
flag.append(ans[arrayOfChar8])
for x in flag:
print(x,end=",")
求解得到的是一串数字,最后转为字符就行。
flag:NSSCTF{EXcalibur}

浙公网安备 33010602011771号