CTF实战分析
我这里就拿国内一家安全公司出的一个入门级app的题目做分析要求如下: 1.有壳就脱壳 2.拿到此题的Flaghttps://ke.yijincc.com/files/default/2019/12-23/15393134f1a2276199.png首先拿到一个app用工具查一下 这里提示没有壳
那么我们安装一下看一下软件页面https://ke.yijincc.com/files/default/2019/12-23/154036416776187471.png
一打开就是如此 两个编辑框然后点击登陆就跳转到另一个页面提示”Waiting fot you!”
既然如此打开jadx-gui工具反编译一波 从java层入手
首先找到他的”AndroidManifest.xml” 里面有个”activity”标签里面就是他的活动页面的信息https://ke.yijincc.com/files/default/2019/12-23/154121100a97847756.png
可以看到这里有3个活动页面信息<action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/>有这两个属性的值上面的活动页面就是我们的入口页面(一开打软件所显示的页面信息)
既然如此我们之前看到过有个登陆的按钮在一启动的活动下 那么我们到此活动页面看一下按钮下的逻辑事件(“com.tencent.testvuln.MainActivity”)https://ke.yijincc.com/files/default/2019/12-23/154205d73732753363.png
来到这个类里面找到按钮点击事件 也就是onClick事件下
https://ke.yijincc.com/files/default/2019/12-23/154250aa23f3422552.png首先一个switch语句获取view.id 进入第一个分支也就是 case R.id.button1
然后接着判断我们输入的内容是不是为空 或者说输入的长度是否为0如果条件成立就进行一个弹窗提示我们输入的内容”不能为空”
然后定义两个string类型的变量接收我们输入的内容Obj是第一个编辑框的内容obj2是第二个编辑框的内容
然后startActivity跳转到另一个活动页面也就是”SecondActivity”并将我们输入的内容也传递过来然后在onCreate初始化函数进行判断
https://ke.yijincc.com/files/default/2019/12-23/15432194623d611827.png这一块儿的逻辑就很清晰了
if (Encryto.doRawData(this, stringExtra + stringExtra2).equals("VEIzd/V2UPYNdn/bxH3Xig=="))
所有的比较逻辑都是在这里了
调用一个Encryto类下的doRawData将this 以及stringExtra + stringExtra2).equals("VEIzd/V2UPYNdn/bxH3Xig=="传递进去
我们现在跟踪到doRawData方法https://ke.yijincc.com/files/default/2019/12-23/1543539a800f954109.png发现System.loadLibrary("JNIEncrypt"); 加载了这样一个so库此方法也是由native关键词所修饰的
那么打开此app的lib文件夹发现也只有一个so文件库
https://ke.yijincc.com/files/default/2019/12-23/154424876049771900.png拿出我们的ida工具反编译一波先https://ke.yijincc.com/files/default/2019/12-23/154450215e7e347781.png发现并没有java_ 静态注册的方法那么我们也只能找到JNI_OnLoad动态注册的位置https://ke.yijincc.com/files/default/2019/12-23/1545360e030f307397.png来到了https://ke.yijincc.com/files/default/2019/12-23/154602aad7e4236703.pngRegisterNatives就是注册的函数 他的第三个参数就是我们要找到的方法体第四个参数就是他注册的个数
https://ke.yijincc.com/files/default/2019/12-23/15462739144b104877.png
https://ke.yijincc.com/files/default/2019/12-23/154709d46489865997.png然后我们一步步跟踪到了这里发现采用了一个AES/ECB/PKCS5Padding的加密方式
Key勒就摆在面前的”thisisatestkey==”
然后我们来解密一波将VEIzd/V2UPYNdn/bxH3Xig==解密得出”aimagetencent”https://ke.yijincc.com/files/default/2019/12-23/15473356c39c486147.png
第三个页面这里会解密一个9YuQ2dk8CSaCe7DTAmaqAA==值https://ke.yijincc.com/files/default/2019/12-23/1548000c7239422699.png将9YuQ2dk8CSaCe7DTAmaqAA==解密得出”Cas3_0f_A_CAK3”https://ke.yijincc.com/files/default/2019/12-23/154844c963a8864749.png 图片看不了? 这道题so没有加密,降低了难度 学习大佬操作 学习永不停歇 楼主好强啊!学习了! 感谢楼主 感谢发布原创作品! Thanks~ 向楼主致敬! 谢谢分享