好吧确实最近很忙不应该是一个不练习的借口……
为了备战校赛紧急特训java相关
[RoarCTF 2019]Easy Java
好像什么时候打过的题目……但是没继续研究下去
结合题目报错:
1
| java.io.FileNotFoundException:{help.docx}
|
下载出了一些小问题,用get传参有问题,改用post传参
可以下载了。说明这题的洞是任意文件下载。
说明可以通过post传参下载任意文件,然后下载/WEB-INF/web.xml
1 2 3 4 5
| /WEB-INF/web.xml /WEB-INF/classes/ /WEB-INF/lib/ /WEB-INF/src/ /WEB-INF/database.properties
|
下载完查看可以找到FlagController类和位置
然后构造payload
1
| filename=/WEB-INF/classes/com/wm/ctf/FlagController.class
|
这个类应该是一般打不开的,用jd-gui开可以得到反编译后的内容
可以找到string flag:
1
| String flag = "ZmxhZ3swNjAxYjMxYi0xYThhLTRmMmMtOWZmMi0wYjJmYTdmNTkyMTl9Cg=="
|
很明显base64解码就可以了
1
| flag{0601b31b-1a8a-4f2c-9ff2-0b2fa7f59219}
|
[BUU]Java逆向解密
下载jar包逆向出来伪代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| import java.util.ArrayList; import java.util.Scanner; public class Reverse { public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.println("Please input the flag :"); String str = s.next(); System.out.println("Your input is :"); System.out.println(str); char[] stringArr = str.toCharArray(); Encrypt(stringArr); } public static void Encrypt(char[] arr) { ArrayList<Integer> Resultlist = new ArrayList<>(); for (int i = 0; i < arr.length; i++) { int result = arr[i] + 64 ^ 0x20; Resultlist.add(Integer.valueOf(result)); } int[] KEY = { 180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65 }; ArrayList<Integer> KEYList = new ArrayList<>(); for (int j = 0; j < KEY.length; j++) KEYList.add(Integer.valueOf(KEY[j])); System.out.println("Result:"); if (Resultlist.equals(KEYList)) { System.out.println("Congratulations!"); } else { System.err.println("Error!"); } } }
|
重点关注加密逻辑:
encrypted = (char_ascii + 64) ^ 32
则解密:(encrypted ^ 32) - 64
可解:This_is_the_flag_!