2018/11/26-AXCTF-安卓

黄沙百战穿金甲,不破楼兰终不还。这篇文章主要讲述2018/11/26-AXCTF-安卓相关的知识,希望能为你提供帮助。
 
  题目链接:https://pan.baidu.com/s/1es3pBrC6i9MPoyN22CQ1iw 
提取码:85nh

拖进JEB进行分析

2018/11/26-AXCTF-安卓

文章图片

发现对name的前四位进行了md5加密,然后和"126E8F3A5FD52707AFE653E4BFECF723"进行比较。
 
2018/11/26-AXCTF-安卓

文章图片

可知那么的前四位为"AXCT"。
继续分析,
2018/11/26-AXCTF-安卓

文章图片

程序将name的后四位+password与“126E8F3A5FD52707AFE653E4BFECF723”传入encrypt函数,然后将返回字符串进行Base64加密再与"w73DrcK2GcKkw7nCv8KgwpbDrMOdw7TDqFTDjRAcJA=="进行比较。
查看encrypt函数,
2018/11/26-AXCTF-安卓

文章图片

看到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}"。
【2018/11/26-AXCTF-安卓】 



    推荐阅读