easyeasy-200(LCTF)-Bugku

参考博客:

https://blog.csdn.net/weixin_42109012/article/details/89304713
https://www.cnblogs.com/sweetbaby/p/10922967.html

安卓逆向,做了一下午+一晚上,收获颇多,在此记录一下解题过程,希望能帮助到像我一样的逆向萌新(虽然没人看),也方便自己后期查看

JEB 反编译,查看 MainActivity,发现如下图三个比较重要的部分

先看第一部分

要求输入的字符串的长度要在 35-39 之间,然后会调用 Format().form 函数,而 Format 长这个样子

可以看到,form 函数是要返回字符串[5,38]的部分,所以要输入字符串的长度必须要大于 38,否则就会出错。结合 “字符串的长度要在 35-39 之间”,那么长度可能会是 38 或者 39

接着看 Check().check 函数,Check 长这个样子

这个函数看不太懂但问题不大,最明显的就是它会调用 checkPipes 来判断路径是否存在,若两个路径中存在任何一个就会被赋值为 ture 并返回,而当两个路径都不存在时赋值为 false。接下来调用 native 层函数并传入 emulator,结果为真返回 false,反之调用 native 层函数 checkPasswd 并传入 pass。不是很懂但个人水平有限也就只能分析到这里了,总之就是想要得到 flag 的话就需要调用 checkPasswd 函数

接下来用 apktool 反编译,这里我用的是 ApkToolBox,吾爱破解论坛可以下载(下载地址),反编译后找到 \lib\armeabi-v7a 目录下的 so 文件拖入 IDA 分析

找到刚才所说的 checkPasswd 函数,也就是 Java_com_example_ring_wantashell_Check_checkPasswd,查看伪代码

先看第一部分,简单分析一下

这一部分简单来讲就是将我们的输入内容进行了一个倒置的操作,继续往下看

其实我也看不太懂 sub_6ED0 都干了些啥,但根据函数内三个变量的样子合理猜测这是个赋值的操作。总之 secret 变量内存放的就是我们输入的内容在经过一系列变换后(包括倒置以及encrypt)的亚子

正常来讲,在 IDA 中双击这个值就能看到它的值。但是这里不一样,它是位于 bss 段的数据,并没有值,所以在这里要选中 secret,按 X,可以看到有一个 520C 函数也引用过这个值,点开会发现下图的东西

首先根据后面的一串字符推测某个过程进行了 base64 加密,然后意识到数据末尾的 . 是不会在 base64 编码后的结果里出现的,因此删去,又因为 base64 是把 3 个字节变成 4 个可打印字符,所以 base64 编码后的字符串一定能被 4 整除,但是去掉末尾的 . 后发现剩下的位数不能被 4 整除,因此使用一个 = 补全。所以说 secret 的值应为 "dHR0dGlldmFodG5vZGllc3VhY2VibGxlaHNhdG5hd2k="

接着看 encrypt 函数,可以看到一些很明显的 base64 加密的特征

以及图中圈出的 dword_1D09C 的值就是我们上文截图中看到的存储 base64 索引表的

所以可以确定 encrypt 进行的就是 base64 加密

于是将 secret 进行 base64 解密得到 "ttttievahtnodiesuacebllehsatnawi"

然后进行翻转得到:flag{iwantashellbecauseidonthaveitttt}

posted @ 2021-09-25 23:45  Moominn  阅读(286)  评论(0编辑  收藏  举报