0x00 说明

刷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文件夹中,关于隐藏点看如下图

详细介绍参考: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格式

header : DEX 文件头,记录了一些当前文件的信息以及其他数据结构在文件中的偏移量

string_ids : 字符串的偏移量

type_ids : 类型信息的偏移量

proto_ids : 方法声明的偏移量

field_ids : 字段信息的偏移量

method_ids : 方法信息(所在类,方法声明以及方法名)的偏移量

class_def : 类信息的偏移量

data : : 数据区

link_data : 静态链接数据区

这道题重点是 header、string_ids、type_ids

dex修复我的理解就是格式对应清楚就可以进行修复,具体的结构可以查看android源码

0x02 逻辑分析

1、查看apk

java层没有flag,但是指向了assets和META-INF文件夹

(1)assets/abc

这是dex header 大小是112,dex总大小是1395184,dex body大小是 1395072 = 1395184-112

基本上这道题的思路就出来了,按漏洞点的思路找到隐藏的dex

(2)META-INF/CERT.RSA

CERT.RSA的大小是很有问题的,这里应该是隐藏了代码,看大小应是dex body

按照漏洞点隐藏代码应该是追加在CERT.RSA尾部

CERT.RSA大小是1396394-1395072 = 1322(0x52A)

在0x52A附近可以找到如下线索

尾部发现:

KEY=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

2、dex修复还原

(1)dex header+body

将abc和decode_body拼接之后,发现文件无法进行反编译,原因是dex header中string_ids、type_ids值是0

修复前

修复后

(2)dex2jar

m3ll0t_yetFLag 不是正确的flag

/* access modifiers changed from: protected */

public void onCreate(Bundle bundle) {

throw new VerifyError("bad dex opcode");

}

说明onCreate方法有问题

CODE:00097390 # Source file: MainActivity.java

CODE:00097390 protected void com.example.hello.MainActivity.onCreate(

CODE:00097390 android.os.Bundle savedInstanceState)

CODE:00097390 this = v6

CODE:00097390 savedInstanceState = v7

CODE:00097390 0000 nop

CODE:00097392 .prologue_end

CODE:00097392 .line 15

CODE:00097392 0000 nop

CODE:00097394 0000 nop

CODE:00097396 0000 nop

CODE:00097398 .line 16

CODE:00097398 0000 nop

CODE:0009739A 0000 nop

CODE:0009739C 0000 nop

CODE:0009739E 0000 nop

CODE:000973A0 0000 nop

CODE:000973A2 0000 nop

CODE:000973A4 .line 17

CODE:000973A4 0000 nop

CODE:000973A6 0000 nop

CODE:000973A8 0000 nop

CODE:000973AA 0000 nop

CODE:000973AC 0000 nop

CODE:000973AE 0000 nop

CODE:000973B0 0000 nop

CODE:000973B2 .local name:'strb' type:'Ljava/lang/StringBuilder;'

CODE:000973B2 strb = v1

CODE:000973B2 .line 18

CODE:000973B2 0000 nop

CODE:000973B4 0000 nop

CODE:000973B6 0000 nop

CODE:000973B8 0000 nop

CODE:000973BA 0000 nop

CODE:000973BC 0000 nop

CODE:000973BE .line 19

CODE:000973BE 0000 nop

CODE:000973C0 0000 nop

CODE:000973C2 0000 nop

CODE:000973C4 0000 nop

CODE:000973C6 0000 nop

CODE:000973C8 0000 nop

CODE:000973CA 0000 nop

CODE:000973CC .line 20

CODE:000973CC 0000 nop

CODE:000973CE 0000 nop

CODE:000973D0 0000 nop

CODE:000973D2 0000 nop

CODE:000973D4 0000 nop

CODE:000973D6 0000 nop

CODE:000973D8 0000 nop

CODE:000973DA 0000 nop

CODE:000973DC 0000 nop

CODE:000973DE .line 21

CODE:000973DE 0000 nop

CODE:000973E0 0000 nop

CODE:000973E2 0000 nop

CODE:000973E4 0000 nop

CODE:000973E6 0000 nop

CODE:000973E8 0000 nop

CODE:000973EA 0000 nop

CODE:000973EC 0000 nop

CODE:000973EE .line 22

CODE:000973EE 0000 nop

CODE:000973F0 0000 nop

CODE:000973F2 0000 nop

CODE:000973F4 0000 nop

CODE:000973F6 .local name:'flag' type:'Ljava/lang/String;'

CODE:000973F6 flag = v0

CODE:000973F6 .line 23

CODE:000973F6 0000 nop

CODE:000973F8 0000 nop

CODE:000973FA 0000 nop

CODE:000973FC 0000 nop

CODE:000973FE 0000 nop

CODE:00097400 0000 nop

CODE:00097402 0000 nop

CODE:00097404 0000 nop

CODE:00097406 0000 nop

CODE:00097408 0000 nop

CODE:0009740A 0000 nop

CODE:0009740C 0000 nop

CODE:0009740E 0000 nop

CODE:00097410 0000 nop

CODE:00097412 0000 nop

CODE:00097414 0000 nop

CODE:00097416 0000 nop

CODE:00097418 0000 nop

CODE:0009741A 0000 nop

CODE:0009741C 0000 nop

CODE:0009741E 0000 nop

CODE:00097420 0000 nop

CODE:00097422 .line 24

CODE:00097422 0000 nop

CODE:00097422 Method End

CODE:00097422 # ---------------------------------------------------------------------------

(3)修复onCreate

onCreate的大小是 0x97423 - 0x97390 = 0x93 正好和 META-INF/y大小相似,将y填充到onCreate方法中

找到0x97390在dex中的位置

将y进行填充

dex2jar之后

最后得到根据代码获取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漏洞

最后于 2020-3-5 18:21

被neilwu编辑

,原因: 修正

上传的附件:

dex2-d2j.jar

(789.50kb,8次下载)

y

(0.14kb,8次下载)

dex1-d2j.jar

(789.12kb,8次下载)

encode_body

(1.33MB,9次下载)

decode_body

(1.33MB,8次下载)

abc

(0.11kb,8次下载)

dex字符串解密_[原创]通过CTF学习Android漏洞(炸弹引爆+dex修复)相关推荐

  1. dex字符串解密_十一、Dex加解密

    一.关于Applicationc对象创建过程后执行的第一个方法attachBaseContext的源码追踪 linux下的zygote进程fork出一个子进程,调用ActivityThread中的ma ...

  2. android 克隆攻击原理,通过CTF学习Android漏洞(炸弹引爆+dex修复)2015 RCTF / 攻防世界高手区 where...

    0x00 说明 刷android ctf题,感觉涉及的点不错,分享一下做题过程. 题目: 2015 RCTF / 攻防世界高手区 where 描述(提示): Where is the flag.(Th ...

  3. dex字符串解密_某Xposed微信群发工具dex解密分析

    jadx载入 寻找xposed_init文件中定义的xposed程序的入口,发现主体只有如下三个函数,那猜想真正的hook函数被加密存储了,执行时通过dexClassloader动态加载执行 publ ...

  4. 列表怎么有限的初始化为零_《零基础学习Android开发》第五课 类与面向对象编程1-1...

    视频:<零基础学习Android开发>第五课 类与面向对象编程1-1 类的定义.成员变量.构造方法.成员方法 一.从数据与逻辑相互关系审视代码 通过前面的课程,我们不断接触Java语言的知 ...

  5. dex字符串解密_Androguard补完计划——锁定字符串解密函数

    一.理论基础(我们先讲道理) 上回说到我们找到了dex中的加密字符串 提取加密字符串. 观众老爷们问:那么找到这些加密字符串有什么作用呢?该看不懂的还是看不懂啊... 那么今天我就来告诉大家,找到的这 ...

  6. startindex 不能大于字符串长度_「12」学习MySQL第二类函数:字符串函数

    前一篇文章总结了下MySQL中常用的数学函数,本文接下来的重点就是认识"字符串函数". 上图这匹漂亮的马儿就是通过各种字符(字母.括号.逗号.竖线等)画出来的.我不由自主地会去想下 ...

  7. mysql存储过程大于小于_mysql5.0存储过程操作符知识_函数方法[Mysql学习]

    mysql存储过程基本函数 一.字符串类 CHARSET(str) //返回字串字符集 CONCAT (string2  [,... ]) //连接字串 INSTR (string ,substrin ...

  8. python 工程结构加固_[原创]某企业级加固[四代壳]VMP解释执行+指令还原

    现在的VMP的比较常见了,应该也是稳定性满足要求了,今天来分析一波,如有不当还请各位大佬指正 实际上 libdexjni.so在不同的APP中体积会不一样,应该是硬编码写入字符串和指令导致的 1-VM ...

  9. CTF学习-密码学解题思路

    CTF学习-密码学解题思路 密码学持续更新 密码学概述 密码学的发展 第一个阶段是从古代到19世纪末-古典密码 (classical cryptography) 第二个阶段从20世纪初到1949年-近 ...

  10. CTF学习-web解题思路

    CTF学习-web题思路 持续更新 基础篇 1.直接查看源代码 2.修改或添加HTTP请求头 常见的有: Referer来源伪造 X-Forwarded-For:ip伪造 User-Agent:用户代 ...

最新文章

  1. 真「祖传代码」!你的 GitHub 代码已打包运往北极,传给 1000 年后人类
  2. 编写同时在PyTorch和Tensorflow上工作的代码
  3. C 语言编程 — 管道(Pipe)
  4. C#中Socket通信编程的异步实现
  5. php中静态方法的调用,php中静态方法和非静态方法如何相互调用?
  6. P2305 [NOI2014]购票
  7. LeetCode 154 寻找旋转排序数组中的最小值 II
  8. service.php,service.php
  9. Visual Studio最常用、最高效的快捷键
  10. UVALive - 3641 Leonardo's Notebook(polya计数)
  11. 10月19日 蒟蒻的流水账
  12. MySQL使用二进制日志来恢复数据
  13. 为什么产品经理总被吐槽是”水货“
  14. table导出excel php_php导出excel表格的方法分享(代码)
  15. pyqt5优秀项目python_【项目】PYQT5--Python/C++实现网络聊天室
  16. .net C#实现图像对比
  17. 富士通Fujitsu DPK750 Pro 打印机驱动
  18. Rancher+k3s+阿里云流水线详细配置教程
  19. rtx3060ti、rtx3060和rtx2080ti 参数对比哪个好 差距大不大
  20. word批量转换为html,批量Word转HTML – ConvertWordToHTML[Update: Word转换工具]

热门文章

  1. C++综合实例——个人银行账户管理程序
  2. EA建模-绘制活动图
  3. c语言中shift f12组合建,如何在word中将文本框组合快捷键是什么
  4. windows 图片和传真查看器不能旋转
  5. 美光称对华为恢复部分芯片出货 股价一度上涨10%
  6. 电池SOC仿真系列-基于GA-BP神经网络的电池SOC估算方法
  7. 深入理解配准任务中的STN
  8. [人工智能-综述-10]:模型评估 - 常见的模型评估指标与方法大全、汇总
  9. 用c语言表达圣诞节快乐的英文,双语:Merry Christmas 圣诞节快乐用英语怎么说
  10. Mac制作Windows 10 U盘启动盘