热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android获取assets绝对路径_通过CTF学习Android漏洞(炸弹引爆+dex修复)

本文为看雪论坛优秀文章看雪论坛作者ID:neilwu0x00说明刷AndroidCTF题,感觉涉及的点不错,分享一下做题过程。题目
f14140a4-491e-eb11-8da9-e4434bdf6706.jpeg本文为看雪论坛优秀文章看雪论坛作者ID:neilwu0x00 说明

刷Android CTF题,感觉涉及的点不错,分享一下做题过程。

题目:

2015 RCTF / 攻防世界高手区 where

描述(提示):

Where is the flag.(The flag should include RCTF{})

hint: where is body

hint2: the KEY is visible strings, -k -nosalt

涉及的漏洞点:

1、炸弹引爆

2、dex修复

0x01 漏洞简析

>>>>

1. 炸弹引爆

“炸弹引爆”,先将恶意代码作为炸弹,隐藏在手机设备之中,然后再使用引爆器来点燃隐藏炸弹。
这道题的隐藏点是/META-INFO文件夹中,关于隐藏点看如下图:fb4140a4-491e-eb11-8da9-e4434bdf6706.png详细介绍参考:https://www.blackhat.com/ldn-15/summit.html#what-can-you-do-to-an-apk-without-its-private-key-except-repacking

>>>>

2. dex修复

dex修复首先要了解dex格式:064240a4-491e-eb11-8da9-e4434bdf6706.jpeg

header : DEX 文件头,记录了一些当前文件的信息以及其他数据结构在文件中的偏移量string_ids : 字符串的偏移量type_ids : 类型信息的偏移量proto_ids : 方法声明的偏移量field_ids : 字段信息的偏移量method_ids : 方法信息(所在类,方法声明以及方法名)的偏移量class_def : 类信息的偏移量data : :数据区link_data : 静态链接数据区这道题重点是 header、string_ids、type_idsdex修复我的理解就是格式对应清楚就可以进行修复,具体的结构可以查看Android源码。0x02 逻辑分析

>>>>

1. 查看apk

154240a4-491e-eb11-8da9-e4434bdf6706.pngjava层没有flag,但是指向了assets和META-INF文件夹。

(1)assets/abc

204240a4-491e-eb11-8da9-e4434bdf6706.png这是dex header 大小是112,dex总大小是1395184,dex body大小是 1395072 = 1395184-112
基本上这道题的思路就出来了,按漏洞点的思路找到隐藏的dex。

(2)META-INF/CERT.RSA

2c4240a4-491e-eb11-8da9-e4434bdf6706.pngCERT.RSA的大小是很有问题的,这里应该是隐藏了代码,看大小应是dex body。
按照漏洞点隐藏代码应该是追加在CERT.RSA尾部,CERT.RSA大小是1396394-1395072 = 1322(0x52A)。
在0x52A附近可以找到如下线索:334240a4-491e-eb11-8da9-e4434bdf6706.png尾部发现:3a4240a4-491e-eb11-8da9-e4434bdf6706.pngKEY=Misc@inf0#fjhx11
DEX=
aes-128-cbc
根据题目的提示,DEX=之后的信息应该是dex body,需要是openssl进行解密获得真正的body。

openssl enc -d -aes-128-cbc -in body -out decrypted -k 'Misc@inf0#fjhx11' -nosalt解密前:encode_body
解密后:decode_body

(3)META-INF/y

暂时看不出用处 大小是 0x93:454240a4-491e-eb11-8da9-e4434bdf6706.png

>>>>

2.dex修复还原

(1)dex header+body

将abc和decode_body拼接之后,发现文件无法进行反编译,原因是dex header中string_ids、type_ids值是0。
修复前:534240a4-491e-eb11-8da9-e4434bdf6706.png修复后:5d4240a4-491e-eb11-8da9-e4434bdf6706.png

(2)dex2jar

634240a4-491e-eb11-8da9-e4434bdf6706.pngm3ll0t_yetFLag 不是正确的flag:

/* access modifiers changed from: protected */ public void onCreate(Bundle bundle) { throw new VerifyError("bad dex opcode"); }说明onCreate方法有问题:

CODE:00097390 # Source file: MainActivity.javaCODE:00097390 protected void com.example.hello.MainActivity.onCreate(CODE:00097390 android.os.Bundle savedInstanceState)CODE:00097390 this = v6CODE:00097390 savedInstanceState = v7CODE:00097390 0000 nopCODE:00097392 .prologue_endCODE:00097392 .line 15CODE:00097392 0000 nopCODE:00097394 0000 nopCODE:00097396 0000 nopCODE:00097398 .line 16CODE:00097398 0000 nopCODE:0009739A 0000 nopCODE:0009739C 0000 nopCODE:0009739E 0000 nopCODE:000973A0 0000 nopCODE:000973A2 0000 nopCODE:000973A4 .line 17CODE:000973A4 0000 nopCODE:000973A6 0000 nopCODE:000973A8 0000 nopCODE:000973AA 0000 nopCODE:000973AC 0000 nopCODE:000973AE 0000 nopCODE:000973B0 0000 nopCODE:000973B2 .local name:'strb' type:'Ljava/lang/StringBuilder;'CODE:000973B2 strb = v1CODE:000973B2 .line 18CODE:000973B2 0000 nopCODE:000973B4 0000 nopCODE:000973B6 0000 nopCODE:000973B8 0000 nopCODE:000973BA 0000 nopCODE:000973BC 0000 nopCODE:000973BE .line 19CODE:000973BE 0000 nopCODE:000973C0 0000 nopCODE:000973C2 0000 nopCODE:000973C4 0000 nopCODE:000973C6 0000 nopCODE:000973C8 0000 nopCODE:000973CA 0000 nopCODE:000973CC .line 20CODE:000973CC 0000 nopCODE:000973CE 0000 nopCODE:000973D0 0000 nopCODE:000973D2 0000 nopCODE:000973D4 0000 nopCODE:000973D6 0000 nopCODE:000973D8 0000 nopCODE:000973DA 0000 nopCODE:000973DC 0000 nopCODE:000973DE .line 21CODE:000973DE 0000 nopCODE:000973E0 0000 nopCODE:000973E2 0000 nopCODE:000973E4 0000 nopCODE:000973E6 0000 nopCODE:000973E8 0000 nopCODE:000973EA 0000 nopCODE:000973EC 0000 nopCODE:000973EE .line 22CODE:000973EE 0000 nopCODE:000973F0 0000 nopCODE:000973F2 0000 nopCODE:000973F4 0000 nopCODE:000973F6 .local name:'flag' type:'Ljava/lang/String;'CODE:000973F6 flag = v0CODE:000973F6 .line 23CODE:000973F6 0000 nopCODE:000973F8 0000 nopCODE:000973FA 0000 nopCODE:000973FC 0000 nopCODE:000973FE 0000 nopCODE:00097400 0000 nopCODE:00097402 0000 nopCODE:00097404 0000 nopCODE:00097406 0000 nopCODE:00097408 0000 nopCODE:0009740A 0000 nopCODE:0009740C 0000 nopCODE:0009740E 0000 nopCODE:00097410 0000 nopCODE:00097412 0000 nopCODE:00097414 0000 nopCODE:00097416 0000 nopCODE:00097418 0000 nopCODE:0009741A 0000 nopCODE:0009741C 0000 nopCODE:0009741E 0000 nopCODE:00097420 0000 nopCODE:00097422 .line 24CODE:00097422 0000 nopCODE:00097422 Method EndCODE:00097422 # ---------------------------------------------------------------------------

(3)修复onCreate

onCreate的大小是 0x97423 - 0x97390 = 0x93 正好和 META-INF/y大小相似,将y填充到onCreate方法中。
找到0x97390在dex中的位置:764240a4-491e-eb11-8da9-e4434bdf6706.png将y进行填充:7d4240a4-491e-eb11-8da9-e4434bdf6706.pngdex2jar之后:874240a4-491e-eb11-8da9-e4434bdf6706.png最后得到根据代码获取flag:

public String seed = "m3ll0t_yetFLag"; /* access modifiers changed from: protected */public void onCreate(Bundle bundle) { super.onCreate(bundle); setContentView((int) R.layout.activity_main); StringBuilder sb = new StringBuilder(this.seed); sb.replace(0, 1, "h"); sb.replace(5, 6, "2"); sb.replace(10, 11, "f"); sb.replace(7, 8, "G"); Toast.makeText(this, "flag is " + sb.toString(), 0).show();}0x03 总结1、简单修复dex header
2、简单修复onCreate
3、修复过程中的文件在附件中
4、了解一个Android漏洞8d4240a4-491e-eb11-8da9-e4434bdf6706.png- End -974240a4-491e-eb11-8da9-e4434bdf6706.jpeg

看雪ID:neilwu

https://bbs.pediy.com/user-590753.htm 

*本文由看雪论坛 neilwu 原创,转载请注明来自看雪社区。9c4240a4-491e-eb11-8da9-e4434bdf6706.jpeg

推荐文章++++

a54240a4-491e-eb11-8da9-e4434bdf6706.png

* 为了理解反汇编引擎而写的X86/X64反汇编引擎

* 捆绑包驱动锁首病毒分析

* **游戏逆向分析笔记

* 对宝马车载apps协议的逆向分析研究

* x86_64架构下的函数调用及栈帧原理

好书推荐ad4240a4-491e-eb11-8da9-e4434bdf6706.png

﹀﹀﹀b44240a4-491e-eb11-8da9-e4434bdf6706.png公众号ID:ikanxue官方微博:看雪安全商务合作:wsc@kanxue.combb4240a4-491e-eb11-8da9-e4434bdf6706.gif



推荐阅读
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 本文介绍了在Java中gt、gtgt、gtgtgt和lt之间的区别。通过解释符号的含义和使用例子,帮助读者理解这些符号在二进制表示和移位操作中的作用。同时,文章还提到了负数的补码表示和移位操作的限制。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
author-avatar
陶玲英漂亮_607
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有