【偶尔一道 ctf】xctf adword mobile easy-apk
最近在学习 ctf,偶尔会做一些 ctf 题,打算记录下做题的步骤和思路,打算学习 ctf 的小白可以跟着一起动手学习。本题是安卓题目。
题目 apk 下载地址
https://adworld.xctf.org.cn/media/task/attachments/989ca07c3f90426fa05406e4369901ff.apk
下载完后,重命名为 easy-apk.apk。
使用 jeb 反编译,本次使用的是 jeb 3.19 ,网上有破解版本下载,也可以在公众号回复 jeb 获取
把 apk 文件拖到 jeb 窗口中进行反编译
反编译完成后,点击 MainActivity 查看主界面的代码逻辑。
反编译显示的代码默认是 smail 代码,可读性不高,先转换为 java 代码,点击下图所示图标,转换成 java 代码。
代码如下
代码中通过 EditText 的 getText() 方法获取了输入框的文字,然后进行 base64 编码后和 5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs= 进行比较,如果一致,则验证通过。猜想 flag 就是
5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs=
解码后的内容。
直接在网上找个在线解码 base64 的网站,发现解码后是乱码
再看看代码中的 base64 是怎样编码的,双击 Base64Encode 方法,查看相应代码。
可以看到这里是一个使用了自定义索引表的 base64 编码算法。
这里简单说下 base64 编码的原理,在参数传输的过程中经常遇到的一种情况:使用全英文的没问题,一旦涉及到中文就会出现乱码情况。与此类似,网络上传输的字符并不全是可打印的字符,比如二进制文件、图片等。Base64 的出现就是为了解决此问题,它是基于 64 个可打印的字符来表示二进制的数据的一种方法。base64 编码后的数据只会是下面索引表中的 64 个字符。
第一步,将待转换的字符串每三个字节分为一组,每个字节占 8bit,那么共有 24 个二进制位。
第二步,将上面的 24 个二进制位每 6 个一组,共分为 4 组。
第三步,在每组前面添加两个 0,每组由 6 个变为 8 个二进制位,总共 32 个二进制位,即四个字节。
第四步,这四个字节的值根据 Base64 编码对照表(上图)获得对应的值
如果字节数不足三个,则在后面补=号
例如二进制值为 1、2、3 的 3 个数据,转换成 base64 编码的过程如下
在题目中,该 base64 编码使用了自定义的索引表,如使用 v 代替 A,w 代替 B 。那么我们需要换回去,再进行正常的 base64 解码。
自定义编码后的值如下,
5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs=
如 r 字符为例,r 字符为自定义索引表的第4个字符,对照原来的索引表是 D,所以要把 r换成 D。其它字符同理,可以使用下面 python 代码进行转换,并求出 flag
最后:希望大家点赞评论加关注,想要获取限时免费网络安全资料的请加 V:gogquick
评论