signin
将apk安装到手机中,adb install Sign_in.apk。
观察界面,一个输入框,一个login按钮。初步估计需要输入一串正确的数字,就可以login。
使用androidKiller反编译apk文件。发现无法反编译出java源码。
于是改成JEB来打开apk文件,反编译出java源码。
然后对源码进行分析如下:
首先,看onCreate()方法中,从输入框中取出用户输入的文字,然后调用checkPassword()函数。
然后,在checkPassword()函数中,将该输入与new String(Base64.decode(new
StringBuffer(this.getFlag()).reverse().toString(), 0)))
进行比较。如果二者相等则打印Congratulations !,若不相等则打印Try again.
弄清以上逻辑之后,重点应该分析new
String(Base64.decode(new StringBuffer(this.getFlag()).reverse().toString(),
0)))
。我们来看一下getFlag()函数。
插播一条getString()和toString()的区别:
https://blog.csdn.net/piaopiaoxiaoshuaige/article/details/79658134
2131427360是一个ID,应该对应于一串字符串。于是在R中进行搜索,得到如下图所示。该串字母对应toString。
在androidKiller中进行工程搜索,搜索toString。得到如下结果。
new String(Base64.decode(new StringBuffer(this.getFlag()).reverse().toString(), 0)))
于是可以变成new String(Base64.decode(new StringBuffer(991YiZWOz81ZhFjZfJXdwk3X1k2XzIXZIt3ZhxmZ).reverse().toString(), 0)))
。
先对字符串做反转得到ZmxhZ3tIZXIzX2k1X3kwdXJfZjFhZ18zOWZiY199,再对其进行base64解码,得到flag{Her3_i5_y0ur_f1ag_39fbc_}。
提交到练习平台中,就对啦!
一个小疑问:将flag输入到输入框中点击login并不会显示Congratulations !目前还没明白为什么。猜测跟new String()会创建一个对象,而String()才是生成一个字符串相关。等之后解决了这个问题再来更新一下。
安卓-mobile1(gctf)
将apk安装后,界面显示如下:
依旧是一个输入框,一个按钮。接着,我们去反编译一下,分析源码。
在R.class中查看得到ID – 2131099678对应失败,ID – 2131099675对应成功。查看if条件语句,当MainActivity.this.checkSN(MainActivity.this.edit_userName.trim(),
MainActivity.this.edit_sn.getText().toString().trim())
为真时,会执行到成功分支。接下来我们看看checkSN()这个函数。由上图可知,paramString1对应“Tenshine”,paramString2对应输入框输入的字符串。
对这个函数进行分析之后,得到输入的字符串长度为22,且是“flag{****************}”
的形式。中间是16个字符。针对paramString1分析,先对其取MD5值,为“b9c77224ff234f27ac6badf83b855c76”,然后从第1个字符开始,每隔一个字符取一个组成新的字符串“bc72f242a6af3857”。最后,将“flag{bc72f242a6af3857}”与输入的字符串做比较,两者相等则返回真。因此,得到本题的flag为“flag{bc72f242a6af3857}”。
安卓-mobile2(gctf)
将zip后缀名改为apk并重命名
使用apktool对该apk进行反编译,得到如下提示
结合使用jeb等工具进行反编译的出错提示可知,androidmanifest.xml文件出现了问题。猜测该文件有玄机。
于是,使用010editor打开amdroidmanifest.xml文件,发现类似于flag的字样fl4g,于是将其拼为:flag{8d6efd232c63b7d2}