冬令营Day4:CTF移动安全解题与出题
CTF中的移动安全
平台
- 安卓
- iOS
类型
- 逆向
- PWN(组件漏洞、WebView漏洞、Native漏洞)
- Misc(流量包取证、抓包)
总体以逆向为主、考察一些安卓基本知识
一些移动安全的CTF
- 腾讯游戏安全技术竞赛(多以逆向为主)
- OGeek(OPPO的)
- Trend Micro CTF(比较切合实际)
- DEFCON、Google CTF、XCTF、强网杯等等
CTF逆向基础
CTF简介
主流的两种形式 -> 对抗赛和解题赛
- WEB
- 涉及常见的Web漏洞、诸如诸如、XSS、文件包括、代码执行、上传等漏洞
- Crypto密码学
- 考察各种加解密技术、现代加密技术或出题者自创的加密技术、主要考察密码学等技术
- Misc安全杂项
- 涉及流量分析、电子取证、数据分析、隐写等等,覆盖面比较广,主要考察选手的各种基础知识
- Reverse逆向工程
- 涉及到软件逆向、破解技术等等,要求有较强的反汇编扎实功底(但是现在基本不用学习汇编了,当然要功夫到家还是得学习),主要考察参赛选手的逆向分析功能
- PWN漏洞利用
- 攻破、取得权限,主要考察选手对漏洞的挖掘和利用能力,其中常见漏洞类型有栈溢出、堆溢出、格式化字符串等
逆向基础
- 即通过静态分析和动态调试等方法,理解程序逻辑从而达到修改程序行为,获取程序代码等目的
- 现实中一般用于软件破解,功能开发等方面
- CTF中就是getFlag啦
逆向
主要就是反编译反汇编
反逆向
混淆与加壳
逆向学习
-
基础编程知识、汇编语言
-
操作系统
-
常见算法
-
常见密码学算法
-
更多
- 更多架构
- MIPS、WASM、PPC、RISC、Arduino
- 其他平台
- IOT、固件逆向
- 其他语言
- Go、Haskell、Esolang
- 更多架构
常见的出题方式
Flag checker
- 比如直接检查Flag啊
- 或者密文检测啊等等
注册机
- 给定用户名、获取其对应的注册码
小游戏
- 扫雷、迷宫等等,通过通关或者触发特殊事件拿到Flag
逆向解题的一般流程
- 查看文件格式/架构(File命令)
- 用响应的反编译器/反汇编器打开
- 检查程序保护方法并去除(加壳、混淆等)
- 寻找程序关键逻辑(搜索关键字符串和函数调用等)
- 静态分析/动态分析,理解程序逻辑
- 逆向程序算法,实现脚本得到flag
CTF学习
- 阅读优质Writeup
- 以赛代练
- 知识基础+做题经验
CTF网站
- CTF Wiki
- CTFtime
- whitzard OJ
CTF工具
-
IDA
- 常用功能:
- 切换反编译、反汇编 -> tab / f5
- 字符串 -> shift + F12
- 切换控制流图 -> space
- 重命名(变量、函数、标签等)-> N
- 查找引用 -> X
- 修改类型 -> Y
- 切换十进制十六进制 -> H
- 切换数据/字符串 -> R
- 汇编窗口中:
- 切换代码为数据 -> D(data)
- 切换数据为代码 -> C(code)
- 定义函数 -> P
- 取消定义函数 -> U
- Ascii?反正有个 -> A
- arm/thumb切换 -> alt+G 0x0(arm)和0x1(thumb)
- 常用功能:
-
常用插件
LazyIDA
Keypatch
-
逆向注意
-
指针类型
-
大小端
-
函数调用约定
- X64: rdi, rsi, rdx, rcx, r8, r9 + stack
- X86: stack
- ARM: r0,r1,r2,r3+ stack
-
常见数据类型
- char, _BYTE
- _WORD
- _DWORD, int
- _QWORD, _int64
- 指针(长度根据架构决定)
-
结构体的恢复 如JNIEnv*
-
调试器:IDA、GDB
-
16进制编辑器:010Editor
-
这里通过了一道简单逆向题,晚上补一下和一些IDA的常用操作
https://zhidao.baidu.com/question/155072477.html
LSB与MSB编码
静态分析和动态分析
- 静态分析从可执行程序出发 , 逆向分析可执行程序的源代码或反汇编的伪汇 编代码,运用程序理解等技术手段,还原出目标程序的源代码,利 用对代码的分析理解程序的运行逻辑。动态分析利用调试器等工具跟踪软件的运行来理解程序。一般是通过观察程 序在运行过程中的状态,如寄存器内容,函数执行结果,内存使用 情况等等,分析函数功能,明确代码逻辑,理解程序行为。
- 静态分析是依靠程序的,动态分析是依靠输入的
- 静态分析是完全的可以依据这个来获取代码逻辑,但是在复杂系统里不易判断。动态分析是不完全的,即能够判断但是不能具体解析逻辑
静态分析
- 先猜代码,可以通过修改程序输入进行验证,猜不出来再进去详细逆向
- 在复杂程序中快速定位核心代码
- 关键字符串,寻找引用
- 函数大小排序
- 在已确认的函数的附近寻找其他有意义的函数
修改程序
修改程序逻辑
- 去除反调试
- 绕过check
- 修改函数的参数等以测试函数功能
patch的一些方法
- keyPatch
- IDA自带patch
- lazyIDA的功能
最后要应用patch
这里再用它进行一个简单的例子
反patch技术
- 自校验
- 检查程序的校验和,防止程序被patch或调试
- 安卓程序也可以通过检查apk签名
- 绕过自校验
- 识别自校验行为,在不影响程序逻辑的程序下跳过检验
- 修正错误的校验和
动态调试
- 获取某些关键值,如flag
- 跟踪一些变量的变化
- 绕过程序的某些限制
- 修改寄存器的值或者程序的运行流程,观察和测试代码行为等
安卓调试
- Java层
- ADB
- DDMS
- AS
- Native层
- IDA
ptrace
安卓反调试
安卓签名校验
-
APP签名校验在用于反调试之外,也是一种常用的APP安全保护方式
-
常见的校验方式
- 运行时对签名进行检查
- 将签名信息发送到远程服务器检查
注意:无论采用哪种签名校验方式,都依然可以通过hook、patch等方式绕过
检查Debuggable
- 可以通过我们可以通过
ApplicationInfo.FLAG_DEBUGGABLE
来检查应用是否可被调试
- 或者
adb shell dumpsys package $包名
检查调试状态
-
代码中
android.os.Debug.isDebuggerConnected()
检查是否被调试 -
或者jeb连接
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
反ptrace
-
对于native层的调试,可以从ptrace的原理入手进行反调试
-
ptrace自身
-
检查TracerPid
-
如果进程被debug,则TracePid为debug进程的Pid
-
如果TracePid非0,则代表处于被调试状态
-
-
检查特定的调试器
IDA:23946
Drozer:31415等等
基于时间的反调试(用的不多)
Dump内存
逆向中的加解密算法
- 逆向中常常会考察密码学算法
- 编码
- 通过解码编码信息得到原始信息
- 加密
- 加密传输信息,保证信息的安全性,通过密钥和密文可以还原原始信息
- 哈希
- 验证信息的唯一性,不是一种对称算法,是单向的
- 编码
逆向常用编码
16进制
- 识别
- 码表
- 一对二的对应关系
- hex解码
- ’-48‘ ’-55‘,
Base64/32
- 类似于64进制
- 每3个转化为4个
- 码表
- 识别 3->4 4<-3
分组密码
对称加密与非对称加密
几种常见加密
-
异或加密(单字节异或加密/多字节异或加密)
-
凯撒加密
-
AES
- 码表s_box循环结构
- 明显的循环结构
-
DES
- 密钥长度为64bit,但只有58bit
- 安全性较差,可被暴力破解
-
RC4
特征:长度为256byte的数组
-
TEA等
加密的相关题型
识别加密算法
- 搜索算法中的常量
- 根据算法结构判断
- 根据密钥长度/加密快长度等进行筛选
- 留意出题人对算法的修改(轮数、常量)
- 工具
找密文和密钥
寻找解密算法的实现
- 直接调用库
- 写脚本
- 网站
哈希
-
将任意长度的消息压缩到某一固定长度的信息摘要的函数
-
一般不可逆
-
很难找到哈希值相同
常见的哈希算法
- MD5
- SHA1
- SHA256
- CRC
CTF中哈希题型
进行哈希判断和爆破哈希值
密码学算法识别工具
- Signsrch
- PEiD插件 Krypto ANALyzer
安卓逆向技术
- 安卓架构图
- 安卓APK文件
- 安卓JNI
- 安卓APK结构
- 安卓应用四大组件
- 安卓组件注册
- 安卓组件实现
- 安卓相关工具
- 常用安卓反编译工具比较
- (这节基本都讲过了)
CTF安卓题目练习
考察逆向基本功
Java逆向
Native逆向
- 常见的反逆向技术
-
包名混淆
-
控制流混淆
-
常量加密
-
加壳
-
VM
-
动态代码加载(如DexClassLoader)
-
Java反射
-
自修改代码(dex或native)
-
反调试、反重打包、反模拟器
-
考察安卓机制
CTF安卓逆向出题
在视频里有时间整理