CVVD首届车联网漏洞挖掘赛决赛-猜对密码算我输APP逆向
2021-首届CVVD车联网漏洞挖掘赛,唯一一道没出的APP,终于在某年某月突然想起来,求助逆向群大手子Yenkoc👴,Yenkoc👴很牛逼,一眼看出了在哪验证的密码,让我有了方向,出题人太狡猾了,搁这修改字符串,要不是被逼到没办法,Hook了一下才发现猫腻,特此记录。再次感谢Yenkoc👴大手子。Yyds了属于是
题目链接:https://pan.baidu.com/s/1ILLRwMhOKu4eSj5fqn2qDw
提取码:c2zc
如图,要求输入5位数密码,但是事实只能输四位,也就是说除了修改APK重新打包,要是里面加一些验证,我直接寄了,只能用其他办法出。
主体结构,其中PasscodeView负责将界面输入转换出密码字符串,之前一直没找到,还是得yenkoc👴。
这里有一些串初始化,其中要格外注意D 和 E和底下的getString操作
再往底下看
我们尝试Hook验证猜想
这里推荐大家一款很牛逼的Hook工具 曲境 https://github.com/Mocha-L/QuJing
这里我输入1234,则返回1234 String类型,验证猜想1,剩下就是获得D 和 E 。然后爆破密码了
先获取D,我们直接Hook Base64的decode方法,得到D未解码的串,注意这里输出是我故意base64编码过的,因为D本来就是Byte[]类型,而且是由很多不可见字符组成的
然后获取E,这里我寄了一万年,爆不出来,因为我一直以为E就是"flag{ttimasdf ♥ CICV}";,突然想到D 和 E是不是被修改过,返回去,HOOK前面这个位置。
返回下再进去查看调用结果
发现E被改动了,这下可以爆破了。
import org.bouncycastle.util.encoders.Base64;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
public class pin {
public static void main(String []args) throws NoSuchAlgorithmException, UnsupportedEncodingException {
byte[] D = Base64.decode("gJS0W9K9X3cG3r9yxQ19c7yivCqkEdauPde04kNMQEM=");
String E = "cicvtonggegege!!~";
for(int a = 0;a<=9;a++){
for(int b = 0;b<=9;b++){
for(int c = 0;c<=9;c++){
for(int d = 0;d<=9;d++){
for(int e = 0;e<=9;e++){
String v0 = a +""+ b +"" +c +""+d+""+e +"";
MessageDigest v3_1 = MessageDigest.getInstance("SHA-256");
v3_1.update(E.getBytes("GBK"));
v3_1.update(v0.getBytes(StandardCharsets.UTF_8));
boolean v3_2 = Arrays.equals(v3_1.digest(E.getBytes(StandardCharsets.UTF_8)), D);
if(v3_2 == true)
System.out.println("right" + v0);
}
}
}
}
}
}
}
得到密码38558
返回到这准备直接Hook出flag的方法
手机界面