标签:DRC imp ctf 技术 you [] array ase alt
题目链接:https://pan.baidu.com/s/1es3pBrC6i9MPoyN22CQ1iw
提取码:85nh
拖进JEB进行分析
发现对name的前四位进行了md5加密,然后和"126E8F3A5FD52707AFE653E4BFECF723"进行比较。
可知那么的前四位为"AXCT"。
继续分析,
程序将name的后四位+password与“126E8F3A5FD52707AFE653E4BFECF723”传入encrypt函数,然后将返回字符串进行Base64加密再与"w73DrcK2GcKkw7nCv8KgwpbDrMOdw7TDqFTDjRAcJA=="进行比较。
查看encrypt函数,
看到255,256常量,可轻松判断出是RC4加密,现在我们知道了RC4加密的密钥与加密后的base64字符串,直接复制encrypt函数的代码写逆向脚本(最后用java,java的base64解码的值和别的语言可能不一样)。
import com.sun.org.apache.xml.internal.security.utils.Base64; public class Main{ public static void main(String[] args) { String flag; byte[] str1 = new byte[100]; String str2; try { str1 = Base64.decode("w73DrcK2GcKkw7nCv8KgwpbDrMOdw7TDqFTDjRAcJA=="); } catch (Exception e) { } str2 = new String(str1); flag = encrypt(str2,"126E8F3A5FD52707AFE653E4BFECF723"); System.out.println(flag); } public static String encrypt(String arg13, String arg14) { int v9; int v12 = 256; int[] v5 = new int[v12]; byte[] v3 = new byte[v12]; int v0; for(v0 = 0; v0 < v12; ++v0) { v5[v0] = v0; } v0 = 0; while(v0 < v12) { v3[v0] = ((byte)arg14.charAt(v0 % arg14.length())); v0++; } int v7 = 0; for(v0 = 0; v0 < 255; ++v0) { v7 = (v5[v0] + v7 + v3[v0]) % 256; v9 = v5[v0]; v5[v0] = v5[v7]; v5[v7] = v9; } v0 = 0; v7 = 0; char[] v2 = arg13.toCharArray(); char[] v4 = new char[v2.length]; int v10 = 0; while(v10 < v2.length) { v0 = (v0 + 1) % 256; v7 = (v5[v0] + v7) % 256; v9 = v5[v0]; v5[v0] = v5[v7]; v5[v7] = v9; v4[v10] = ((char)(v2[v10] ^ (((char)v5[(v5[v0] + v5[v7] % 256) % 256])))); v10++; } return new String(v4); } }
运行即可得到name的后四位和password,为"F{android_You_win}"。
标签:DRC imp ctf 技术 you [] array ase alt
原文地址:https://www.cnblogs.com/Fingerprint/p/10023637.html