首先当然是安装上,界面如下:
gda打开,定位到关键位置MainActivity下的checkPassword,如下:
java代码还是比较清晰的,但是本着学习smail的原则我们还是来看smail代码吧,首先开头不用多说:
.class:Lre/sdnisc2018/sdnisc_apk1/MainActivity; .method@3c5e public checkPassword(Ljava/lang/String;)V .prologue .insnsSize 45 (16-bit) .registers 5 [ v0 v1 v2 v3 v4 ]
通过getflag()函数,结果保存在v0:
invoke-direct {v3}, method@3c61 // Lre/sdnisc2018/sdnisc_apk1/MainActivity;->getFlag()Ljava/lang/String; move-result-object v0
通过StringBuffer类的reverse()方法对上面的结果进行处理,即对结果进行反转取代:
new-instance v1, class@0726 // Ljava/lang/StringBuffer; invoke-direct {v1, v0}, method@3b3a // Ljava/lang/StringBuffer;-><init>(Ljava/lang/String;)V invoke-virtual {v1}, method@3b3b // Ljava/lang/StringBuffer;->reverse()Ljava/lang/StringBuffer; move-result-object v0
然后再对结果进行base64解码:
new-instance v1, class@0725 // Ljava/lang/String; invoke-virtual {v0}, method@3b3c // Ljava/lang/StringBuffer;->toString()Ljava/lang/String; move-result-object v0 const/4 v2, #int 0 // #0 invoke-static {v0, v2}, method@3458 // Landroid/util/Base64;->decode(Ljava/lang/String;I)[B move-result-object v0
然后和输入进行比较,结果放在v4:
invoke-direct {v1, v0}, method@3b1b // Ljava/lang/String;-><init>([B)V invoke-virtual {v4, v1}, method@3b22 // Ljava/lang/String;->equals(Ljava/lang/Object;)Z move-result v4
如果相等,congratulation,不等则跳转,显示try again:
所以,我们要关注的是getflag()后的结果,定位到代码:
getflag()比较简单,就是获取0x7f0b0020位置的字符串:
得到字符串以后先反转,再base64解密,即可得到flag:
over~