Polar Reverse(中等)
JunkCode
就一处花指令,比较简单

瞬间看出是XOR算法,用厨子写出即可

RevMethod

看到这个函数蒙了,不知道哪个是真正的flag了。
再次参考WPPolar靶场reverse方向通关题解-CSDN博客
又是没看仔细,这个比的是不同数组的值,我们按照它的规则找出来即可

逆一下子
利用ResourceHack修改,让flag按钮可以被点击即可

点击flag出现,c68d-d262-5b91-2541-1ba7-1f3d-8103-41c4,将中间的连接号去除就是flag
可以为师
和上一题一样的思路

第二行在前,第一行在后拼接即可
左右为难
写出脚本提取迷宫即可,是16列
最终路线:sssssdddddwwaawwdddwddsssddwwddssdss
maze='00000000000000000@00000111000000010011110101110001001000010101000100111001110110010000100000001001111110000000$00000000000000000' sum=0 for i in maze:print(i,end='')sum+=1if sum == 16:sum = 0print('\n')
混淆Code?(暂未解决)
第一处加密:

第二处:

Java_Tools
用jadx看
main类:
package main.java;import java.util.Scanner;/* loaded from: Java_project.jar:main/java/Test.class */
public class Test {public static void main(String[] args) {Scanner in = new Scanner(System.in);System.out.println("Welcome to Polar_Ctf!,come to play!");System.out.println("Please Input : ");String name = in.next();char[] Strings = name.toCharArray();Tools.Add_1(Strings, 3);Tools.Re(Strings);Tools.Judge(Strings);}
}
先调用Add1,然后是Re,Judge就是判断
package main.java;import java.util.ArrayList;/* loaded from: Java_project.jar:main/java/Tools.class */
public class Tools {public static int j = 6;public static void Re(char[] str) {for (int i = 0; i < (str.length / 2) - 1; i++) {char temp = str[i];str[i] = str[(str.length - i) - 1];str[(str.length - i) - 1] = temp;}}public static void Xor(char[] str) {for (int i = 0; i < str.length; i++) {str[i] = (char) (str[i] ^ j);}}public static void Add_1(char[] str, int x) {for (int i = 0; i < str.length; i++) {str[i] = (char) (str[i] + x);}}public static void Judge(char[] str) {ArrayList<Character> Result = new ArrayList<>();ArrayList<Character> Flag = new ArrayList<>();for (char c : str) {Character i = Character.valueOf(c);Result.add(Character.valueOf(i.charValue()));}String sttr = new String(str);if ("$gourZroohK".contains(sttr)) {System.out.println("You Are Right!MD5!");} else {System.out.println("You Are Wrong! please try it again!");}char[] Strings = "$gourZroohK".toCharArray();for (char c2 : Strings) {Flag.add(Character.valueOf(c2));}if (Result.equals(Flag)) {System.out.println("You Are Right!MD5!");} else {System.out.println("You Are Wrong! please try it again!");}}
}
分析judge函数可知,$gourZroohK是密文。Add是每个字符ASCII+3.Re应该是反转数组的意思
我们先反转再-3即可。
a='$gourZroohK'
b=''
c=a[::-1]
for i in c:b+=chr(ord(i)-3)
print(b)
PY_RE
给了两个PY文件,能清晰地看到judge函数的逻辑,即可清晰地知道密文的值,接下来就是主要看加密函数
这个是主要的函数:
for dict in Dict:if Input_Str[i] == str(dict):Input_Str[i] = Dict[dict]break
遍历字典的键,如果输入的数组有它,就把输入数组的换成键对应的值
简单来说,就是通过这样一个字典,实现了字符替换的加密,我们只需要根据字典,反带回去即可
根据思路,让豆包完善我的脚本如下:
# 构建字典:A-Z 对应 26-1
key = 'A'
value = 26
Dict = {}
for i in range(1, 27):Dict[key] = value # 直接赋值更简洁,setdefault在此场景没必要key = chr(ord(key) + 1)value -= 1
print("原字典:", Dict) # 输出 {'A':26, 'B':25, ..., 'Z':1}# 反转字典:26-1 对应 A-Z
mydict = {v: k for k, v in Dict.items()} # 用字典推导式更简洁
print("反转字典:", mydict) # 输出 {26:'A', 25:'B', ..., 1:'Z'}FLAG = ['H', 'E', 'L', 'L', 'O', '_', '_', 11, 2, 7, 19, 12, 13]
# 修正1:将前7个字符(除'_'外)转换为对应的数值(原代码用==是判断,而非赋值)
for i in range(7):if FLAG[i] != '_': # 只转换字母,跳过'_'FLAG[i] = Dict[FLAG[i]] # 'H'对应的值是19(因为H是第8个字母,26-7=19)flag = ''
for item in FLAG:# 修正2:循环逻辑错误,原代码会对每个未匹配项添加'_',导致重复if item in mydict:flag += mydict[item]else:flag += '_' # 只在完全未匹配时添加一个'_'print("最终FLAG:", flag) # 输出:HELLO_PYTHON
最后md5下即可
二层防御
先UPX脱壳
主函数很好看:
密文是allo_PWN n
int __fastcall main(int argc, const char **argv, const char **envp)
{_main();puts("Input :");gets(input);Check_Length();Strlen();Reverse(len);check();return 0;
}
__int64 __fastcall Reverse(int len)
{char v2; // [rsp+2Bh] [rbp-5h]int i; // [rsp+2Ch] [rbp-4h]for ( i = 1; len / 2 > i; ++i ){v2 = input[i];input[i] = input[len - i - 1];input[len - i - 1] = v2;}return Xor_8();
}
__int64 Xor_8(void)
{__int64 result; // raxint v1; // [rsp+Ch] [rbp-4h]v1 = 1;x1 = j;while ( 1 ){result = (len - 1);if ( result == v1 )break;input[v1] ^= x1;--input[v1++];}return result;
}
需要注意XOR_8函数的范围,首尾是没有的!
最后MD5一下即可
a='allo_PWN n'
b=''
for i in a[1:len(a)-1]:b+=chr((ord(i)+1)^8)
c='a'+b[::-1]+'n'
print(c)
猜猜我在哪
经过反编译,key取值只有01234五种情况,所以key可以用爆破的方式写了。以下是加密函数,加密后还需把o换成0.
--------------------待更新----------------------------
