adb
adb介绍Android调试桥(adb)是一种功能多样的命令行工具,它可以让你与设备进行通信,adb命令可以用于执行各种设备操作(例如安装和调试应用),并提供对Unix shell(可用来再设备上运行各种命令)的访问权限,它是一种C/S架构的程序,包括以下三个组件:
1、客户端:主要用于发送命令,adb client在开发机器上运行,我们可以通过adb命令从命令行终端调用客户端,它主要的工作是解析像push、shell、install等命令的参数,做必要的预处理,然后转移为指令或数据,发送给adb server。
2、守护程序(adbd):是运行在Android设备(真机/模拟器)后台的一个进程,它是由init进程启动的,并且系统一开机就以及启动,它主要作用是出来来自adb server的命令行请求,然后获取对应Android设备的信息,再将结果返回给adb server。
3、服务器:是运行再开发机器上的一个后台进程,它有两个作用:1、检测usb端口感知设备的连接和拔出,以及模拟器实例的启动或停止;2、将adb client的请求通过usb或者tcp的方式发送到对 ...
题目3
CFF_100链接:https://github.com/ThunderJie/CTF-Practice/tree/master/CTF-Andorid%20Reverse/CFF2016-%E7%88%AC%E6%A5%BC%E6%A2%AF
解题思路:查看题目是需要我们点击到对应层数显示flag
setClickable()函数作用是设置控件点击无效,但是可以点击,颜色不会变灰色,也就是右边的按钮如果可以点击,那么就能够显示flag了
输入命令java -jar apktool_2.6.1.jar d CFF_100.apk对apk文件进行解包
找到setClickable函数
推测v5和v3即为true或false的标记位,v3一直为0x1,v5一直为0x0,因此考虑修改v5为0x1
再输入命令java -jar apktool_2.6.1.jar b CFF_100进行重打包
这里进行重打包时有问题,以我目前水平还是无法解决
DD-Androideasy and smali
DD-Android Easy链接:https://github.com/ThunderJie/CTF-Practice/tree/master/CTF-Andorid%20Reverse/DD%20-%20Android%20Easy解题思路:下载完成后发现是.zip格式,将后缀改为.apk格式,安装到模拟器中,发现是输入注册码的题目
用jeb打开分析
可以看出只要得到字符串i的值便可以得到flag
解密脚本:p = [-40, -62, 107, 66, -126, 103, -56, 77, 122, -107, -24, -127, 72, -63, -98, 64, -24, -5, -49, -26, 79, -70, -26, -81, 120, 25, 111, -100, -23, -9, 122, -35, 66, -50, -116, 3, -72, 102, -45, -85, 0, 126, -34, 62, 83, -34, 48, -111, 61, -9, -51, 114, 20, 81, -126, -18, 27, -115, -76, -11 ...
Androideasy&simplecheck
androideasy链接:https://github.com/ThunderJie/CTF-Practice/tree/master/CTF-Andorid%20Reverse/androideasy解题思路:文件下载后发现是zip格式,将后缀改为.apk然后用jeb打开进行分析
对于一般比较简单的题目,我们只需要找到函数的入口,即MainActivity中onCreate方法下的onClick点击事件,因为是找注册码(flag),那就肯定有一个按钮负责判断注册码是正确,这个按钮的点击事件是否正确,这个按钮的点击事件就是用onClick实现的,所以大部分这种题目直接找onClick就对了。我们双击之后可以看到以下代码,这里是smali代码。
java代码如下
这里是要调用MainActivity的check()函数来判断flag是否正确,我们直接定位到check()函数
分析函数内容,可以看出数组v0即是我们输入的注册码,根据if语句可以确定注册码的长度和s[]数组一样有31位,下面又有一个if语句判断即为我们的关键语句:s[i]==chars[i]^23 ...
Android常见风险2
安卓常见风险Android重打包风险风险:插入广告、扣费
防范措施:使用一些混淆工具,阻止反编译,加壳
敏感数据明文保存风险含义:对app来说重要的数据
防范措施:不能放在公共区域
组件越权风险防范措施
android:exported = "false"
WebView跨域访问风险安卓应用克隆漏洞原理分析及复现(CNVD-2017-36682)
ContentProvider目录遍历漏洞组件拒绝服务漏洞讲解安全审计工具Drozer的安装与使用下载地址:https://github.com/WithSecureLabs/drozer
出现这个图片即算成功(中间过程复杂,都可以询问gpt)
使用
Drozer代码阅读从drozer console connect命令中drozer.bat开始
drozer.bat
@echo offpython.exe "%~dp0drozer" %*
Android常见风险1
安卓常见风险Android重打包风险风险:插入广告、扣费
防范措施:使用一些混淆工具,阻止反编译,加壳
敏感数据明文保存风险含义:对app来说重要的数据
防范措施:不能放在公共区域
组件越权风险防范措施
android:exported = "false"
WebView跨域访问风险(明天再更,难度太大,一时难以理解)
Arm
Arm汇编工具网站谷歌官网:https://developer.arm.com/documentation-beta/
ARM汇编-opcode转换:http://armconverter.com
寻址方式1、立即数寻址:mov r0,#0x1
2、寄存器寻址:mov r0
3、寄存器间接寻址:ldr r0,[r1]
4、寄存器偏移寻址:mov r0,r1,[r1,#4]
5、寄存器基址变址寻址:ldr r0,[r1,#4]
6、多寄存器寻址:ldmia r0,{r1,r2,r3,r4}
7、相对寻址:bl label
8、堆栈寻址:stmfd sp!,{r1-r7,lr}
9、块拷贝寻址:stmia r0,{r1-r7}
跳转指令B label:直接跳,无条件,需要条件就B后面增加条件
BL:跳转之前,下一条指令地址保存到LR寄存器中,然后再调
MOV PC,LR:直接修改PC指针,实现跳转
LDR PC,0x?:和上一条一样,修改PC寄存器
传参参数小于等于4:用r0,r1,r2,r3
大于4:多出来的用栈
内联汇编方式asm(“指令” :输出 :输入 :变化寄存器);
方式asm ...
Smali
Smali汇编了解安卓虚拟机Dalvik虚拟机JIT(Just-In-Time Compile 即时编译),高频率使用代码空闲时间编译好并存储到内存
Art虚拟机AOT(Ahead-Of-Time 预先编译) 一次编译好,oat文件
头文件定义与接口实现(“<>”表示可选)
.class作用:定义类,包括包名和类名
格式:.class <访问权限> [关键修饰字] <完整类名> (“<>”表示可选)
.super作用:定义所属父类
格式:.super <父类完整类名>
.source作用:指定该smail代码所属java源文件
格式:.source <java源代码名称>
.implements作用: 声明实现接口类名称
格式:.implements <接口类名>
静态变量作用:相当于全局变量,跟类实例没关系,属于类
格式:.field <访问权限> static [修饰词] <字段名> : <变量类型>
.field <访问权限> stat ...
ELF
定义Linux平台的一种可执行文件格式,Executable and Linkable Format(可执行 和 可链接 格式 )
的文件
特点C/C++语言编译生成,动静态。x86汇编、arm汇编。执行速度快,逆行成本高。
生成方式//call ndk-build.cmd NDK_PROJECT_PATH=. NDK_APPLICATION_MK=jni\\Application.mk//Application.mk、 Android.mk、xx.c源文件gcc test.c -c test.o && gcc test.c -o test
Main.java
package com.pediy.test;public class Main { public static void main(String[] args) { String soPath = "so/libhello-jni.so"; ParseSo parseSo = new ParseSo(soPath); ...
Dex完整代码解析
DexFile.h/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND ...