安卓逆向从入门到入土之一道入门级的CTF题目

 首先当然是安装上,界面如下:

 

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~

 

posted @ 2019-05-17 15:19  2rSh0u  阅读(1025)  评论(0)    收藏  举报