关于一道CTF题目的逆向分析(二)
老规矩,我们拿到一个apk依旧是先分析它的java代码
再来看一下so库
先看一下getFlag()
动态调试一波flag
qekfz@q2^x/t^fn0mF^6/^rb
qanqntfg^E`hq|
再回头看下java代码会发现就是让输入的文本使用Native方法Encrypt加密后等于上面哪个字符串
那我现在再来看一下Encrypt函数是什么东西
光是看这个伪代码,其实这里已经很明显了的,但是我打算跑起来试试,这样更加直观嘛
第一次调用在 public String getSecret(String string)
str = ((env)->GetStringUTFChars)();
传值:KE3TLNE6M43EK4GM34LKMLETG
返回:JD2SKMD5L32DJ3FL23KJLKDSF
这就明白了,--i str取地址--,就是对应的ASCII码值的上一位
encrypt("KE3TLNE6M43EK4GM34LKMLETG").substring(5, 8) = MD5
(再说咯,java层的getSecret函数调用了MessageDigest.getInstance(),这里里面的算法就那么两个个md5,sha,不是就会报错NoSuchAlgorithmException,其实猜也很好猜)
那现在我们也就清楚了encrypt做了什么事了,本着简单的重复操作都应该交给代码的思想,剩下的也就交给idea写段小代码解决
于是乎我们得到了:rflag{Ar3_y0u_go1nG_70_scarborough_Fair}
看样子像是flag,但是试了一下居然给我失败。。。无语了
只要祭出frida大法来看看参数为什么不对
emmm 多了一个q导致算出来的md5不一样。。。
回头检查了 一下,发现在分析native的时候查看寄存器的时候多看了上一位并没什么卵用,地址也不对的q,肯爹东西,为什么让两个字符串靠的如此之近。。。,还偏偏手贱 a 错了。。。
所以flag应该是:flag{Ar3_y0u_go1nG_70_scarborough_Fair}
还是附上apk下载地址,喜欢的小伙伴点个赞,或者自己去尝试一下
https://www.lanzous.com/iay0oud