这是一道apk,安卓方面的题,使用手机下载下来,点击运行,要输入东西,输入后但是找不到提交键,只有右下角点击就会直接退出,不知道是设计的问题还是专门来考我们的。。。。
接着我就直接用JADX进行反编译,一共有五个Java模块,一个一个的看发觉有用的有三个。
分别是MainActivity、Check、Format
MainActivity是主函数:
先是从onCreate开始,其中有button(可以估计是出题人忘了添加按键),这个函数操作我觉得没用(实际不影响结果)
然后就是跳转到onClick,判断你输入的数不能小于35大于39,然后就是调用Format模块中的Form截取下标(5,38),接下来还判断不能小于32
要是要得到正确答案,又要调用Check模块中的check,其实当中是反复调用,几乎都使用了一遍Check,要返回true。
最后感觉只是规定长度,总长度在(0,35-39),因为去掉flag{},刚好就是(5,38),长度还要大于32,就只能是38
没有信息了,然后就使用IDA打开so文件进行分析(要用apktool反编译,so在生成的文件夹/lib/选择你的IDA对应版本文件的so打开)
找到一长串显眼的字符串,可以明显得到第二个字符串是base64加密,调用同一函数,那第一个字符串估计也是base64加密
1.标准base64只有64个字符(英文大小写、数字和+、/)以及用作后缀等号;
2.base64是把3个字节变成4个可打印字符,所以base64编码后的字符串一定能被4整除(不算用作后缀的等号);
3.等号一定用作后缀,且数目一定是0个、1个或2个。这是因为如果原文长度不能被3整除,base64要在后面添加\0凑齐3n位。为了正确还原,添加了几个\0就加上几个等号。显然添加等号的数目只能是0、1或2;
然后分析得到字符串还进行了反转,终于得到全部的信息,于是
我们可以在线base64解密,然后倒着输入得到flag
我们也可以直接编程得到最后flag。
注意:要把最后一个点改成等于。
import java.util.Base64;
public class WantAShell {
public static String s="dHR0dGlldmFodG5vZGllc3VhY2VibGxlaHNhdG5hd2k=";
// //String to byte
// byte[] s=s.getBytes();
// //byte to String
// String s = new String(bytes);
//加密
// public static byte[] encoder() {
// //String to byte
// byte[] s1=s.getBytes();
// s1=Base64.getEncoder().encode(s1);
// return s1;
// }
//解密
public static byte[] decoder() {
//String to byte
byte[] s1=s.getBytes();
s1=Base64.getDecoder().decode(s1);
return s1;
}
public static void main(String[] args) {
//byte to String
String s2=new String(decoder());
char[] chars = s2.toCharArray();
String result = "";
int size=s2.length();
for(int i=size-1;i>=0 ;i--) {
result += chars[i];
}
System.out.println(s2);
System.out.println(result);
}
}
Flag为flag{iwantashellbecauseidonthaveitttt}