首页
社区
课程
招聘
[原创]阿里EVIL_APK_3题解
发表于: 2014-10-2 20:10 12173

[原创]阿里EVIL_APK_3题解

2014-10-2 20:10
12173

闲来无事,今天小弟小小研究了下ALICTF_evalapk_3。虽然题目较简单,但还是学到了些东西,作为学习笔记。仅供小菜玩耍,大大直接忽略即可。限于本菜水平,难免会有疏漏错误之处,还请各位批评指正。
-----------------------------------------------------------------------------------
初看题目,要求构造一个html触发Toast弹出flag。本菜既不懂html,更不会js。先不管这个,看下apk。
反编译apk,发现apk被加个壳。使用ida尝试脱壳,脱壳顺利,dump出了dex文件。具体脱壳流程可以参看:http://www.52pojie.cn/thread-293648-1-1.html 帖子,写得很好很详细,这里就不赘述了。

拿到dex文件反编译,发现dex文件很简单。入口MainActivity主要功能就是加载html文件,然后跳转到webViewActivity。webviewActivity实现了JavaScriptInterface,其中有一个showToast方法,这个方法就是题目要求触发的方法。

仅从解题来说,已经完成了,showToast方法里面给出了Toast内容: "祥龙!"
那如何构造html触发这个方法呢?其实懂js与java的读者一下就知道如何构造了。由于本菜不懂,经过查找资料,以为是利用webview的漏洞,构造html触发,经过各种尝试,未果。感觉和webview漏洞没什么关系。

顺着这个思路,搜索了js与java交互,找到答案。其实就是普通的js调用java方法。简单学习了下js如何调用java方法,关键是:在js中获得java类。addJavascriptInterface方法第二个参数给出了类的别名,供js使用。

再看smali,发现别名是通过"BQ1$*[w6G_"字符串经过ListViewAutoScrollHelpern.decrypt_native得到,解密方法放在了so文件中。到这里思路就很多了,一种是直接分析so算法;二是通过添加logcat smali或者自建一个apk调用so得到;三是将别名赋值一个新值,即自定义别名。当然还有其他思路,就不一一列举了,我这里采用第三种方法。
直接在原smali中添加如图红色区域所示代码:

构造如下html文件:
<html>  
  <head>  
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  <script>
  </script>  
  </head>
  <body>
  <a onClick="window.ThomasKing.showToast()">showToast</a><br/> 
  </body>  
</html>
传入手机测试,弹出Toast。
当然,此题有很多其他解法,可以参看alictf2014 top3的writeup。我认为此题主要考选手脱壳吧。
----------
附件为比赛apk文件。
恭祝各位坛友国庆愉快!


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 3
支持
分享
最新回复 (9)
雪    币: 243
活跃值: (247)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习了,不懂java,不懂网页,等考过证了好好月一下
2014-10-3 21:30
0
雪    币: 23
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
飘过,不懂
2014-10-4 16:32
0
雪    币: 233
活跃值: (148)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
4
这题主要考察的应该是webkit的漏洞利用和脱壳,其实那个ListViewAutoScrollHelpern.decrypt_native可以完全不理会,发个不用修改dex的方法:

<html>  
  <head>  
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  <script>
          function findobj(){
                  for (var obj in window) {  
                if ("getClass" in window[obj]) {
                    return  window[obj]
                }  
            }  
          }
  </script>  
  </head>
  <body>
  hellowrold!
  <script type="text/javascript">
   var obj = findobj()
   obj.showToast()
  </script>
  </body>  
</html>
2014-10-5 15:46
0
雪    币: 370
活跃值: (1180)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
5
多谢大大指点!
2014-10-5 17:15
0
雪    币: 507
活跃值: (130)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
赞一个!大佬一出手,就知有木有!
2014-10-7 12:56
0
雪    币: 233
活跃值: (148)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
7
你俩别这样,我也是懂点皮毛,正好可以秀出一下
2014-10-8 16:04
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
想学习一下,mark
2019-10-23 20:43
0
雪    币: 122
活跃值: (536)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这个题貌似是F8或者是福利皮讲过,利用浏览器漏洞是可以过的
2019-10-25 10:33
0
雪    币: 200
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
提供个稍微简单的思路:
findAndHookMethod("android.webkit.WebView",lpparam.classLoader,"addJavascriptInterface",Object.class,String.class,new XC_MethodHook() {
                    @Override
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                        //打印出入参为:SmokeyBear
                        LogUtil.e("before addJavascriptInterface:" + param.args[1].toString());
                    }
            });

            findAndHookMethod("android.webkit.WebView",lpparam.classLoader,"loadUrl",String.class,new XC_MethodHook() {
                @Override
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                    //直接修改url,触发SmokeyBear的showToast方法
                    param.args[0] = "javascript:window.SmokeyBear.showToast()";
                }
            });
2021-1-11 20:25
0
游客
登录 | 注册 方可回帖
返回
//