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啦

逆向

主要就是反编译反汇编

反逆向

混淆与加壳

逆向学习

  • 基础编程知识、汇编语言

  • 操作系统

  • 常见算法

  • 常见密码学算法

    image-20200116131047726

  • 更多

    • 更多架构
      • MIPS、WASM、PPC、RISC、Arduino
    • 其他平台
      • IOT、固件逆向
    • 其他语言
      • Go、Haskell、Esolang

常见的出题方式

Flag checker

  • 比如直接检查Flag啊
  • 或者密文检测啊等等

注册机

  • 给定用户名、获取其对应的注册码

小游戏

  • 扫雷、迷宫等等,通过通关或者触发特殊事件拿到Flag

逆向解题的一般流程

  1. 查看文件格式/架构(File命令)
  2. 用响应的反编译器/反汇编器打开
  3. 检查程序保护方法并去除(加壳、混淆等)
  4. 寻找程序关键逻辑(搜索关键字符串和函数调用等)
  5. 静态分析/动态分析,理解程序逻辑
  6. 逆向程序算法,实现脚本得到flag

CTF学习

  • 阅读优质Writeup
  • 以赛代练
  • 知识基础+做题经验

CTF网站

CTF工具

  • strace&ltrace

  • 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的常用操作image-20200116105034079

    https://zhidao.baidu.com/question/155072477.html

    LSB与MSB编码

静态分析和动态分析

  • 静态分析从可执行程序出发 , 逆向分析可执行程序的源代码或反汇编的伪汇 编代码,运用程序理解等技术手段,还原出目标程序的源代码,利 用对代码的分析理解程序的运行逻辑。动态分析利用调试器等工具跟踪软件的运行来理解程序。一般是通过观察程 序在运行过程中的状态,如寄存器内容,函数执行结果,内存使用 情况等等,分析函数功能,明确代码逻辑,理解程序行为。
  • 静态分析是依靠程序的,动态分析是依靠输入的
  • 静态分析是完全的可以依据这个来获取代码逻辑,但是在复杂系统里不易判断。动态分析是不完全的,即能够判断但是不能具体解析逻辑

静态分析

  • 先猜代码,可以通过修改程序输入进行验证,猜不出来再进去详细逆向
  • 在复杂程序中快速定位核心代码
    • 关键字符串,寻找引用
    • 函数大小排序
    • 在已确认的函数的附近寻找其他有意义的函数

修改程序

修改程序逻辑

  • 去除反调试
  • 绕过check
  • 修改函数的参数等以测试函数功能

patch的一些方法

  • keyPatch
  • IDA自带patch
  • lazyIDA的功能

最后要应用patch

这里再用它进行一个简单的例子

反patch技术

  1. 自校验
    • 检查程序的校验和,防止程序被patch或调试
    • 安卓程序也可以通过检查apk签名
  2. 绕过自校验
    • 识别自校验行为,在不影响程序逻辑的程序下跳过检验
    • 修正错误的校验和

动态调试

  • 获取某些关键值,如flag
  • 跟踪一些变量的变化
  • 绕过程序的某些限制
  • 修改寄存器的值或者程序的运行流程,观察和测试代码行为等

安卓调试

  • Java层
    • ADB
    • DDMS
    • AS
  • Native层
    • IDA

ptrace

安卓反调试

安卓签名校验

  • APP签名校验在用于反调试之外,也是一种常用的APP安全保护方式

  • 常见的校验方式

    1. 运行时对签名进行检查
    2. 将签名信息发送到远程服务器检查

    注意:无论采用哪种签名校验方式,都依然可以通过hook、patch等方式绕过

检查Debuggable

  • 可以通过我们可以通过ApplicationInfo.FLAG_DEBUGGABLE来检查应用是否可被调试

page65image59829840.png

  • 或者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,则代表处于被调试状态

        page68image59884144.png page68image59885184.png

检查特定的调试器

IDA:23946

Drozer:31415等等

基于时间的反调试(用的不多)

Dump内存

逆向中的加解密算法

  • 逆向中常常会考察密码学算法
    • 编码
      • 通过解码编码信息得到原始信息
    • 加密
      • 加密传输信息,保证信息的安全性,通过密钥和密文可以还原原始信息
    • 哈希
      • 验证信息的唯一性,不是一种对称算法,是单向的

逆向常用编码

16进制

  • 识别
    • 码表
    • 一对二的对应关系
  • hex解码
    • ’-48‘ ’-55‘,

Base64/32

  • 类似于64进制
  • 每3个转化为4个
  • 码表
  • 识别 3->4 4<-3

分组密码

对称加密与非对称加密

几种常见加密

  1. 异或加密(单字节异或加密/多字节异或加密)

  2. 凯撒加密

  3. AES

    • 码表s_box循环结构
    • 明显的循环结构
  4. DES

    • 密钥长度为64bit,但只有58bit
    • 安全性较差,可被暴力破解
  5. RC4

    特征:长度为256byte的数组

  6. TEA等

加密的相关题型

识别加密算法

  • 搜索算法中的常量
  • 根据算法结构判断
  • 根据密钥长度/加密快长度等进行筛选
  • 留意出题人对算法的修改(轮数、常量)
  • 工具

找密文和密钥

寻找解密算法的实现

  • 直接调用库
  • 写脚本
  • 网站

哈希

  • 将任意长度的消息压缩到某一固定长度的信息摘要的函数

  • 一般不可逆

  • 很难找到哈希值相同

常见的哈希算法

  • MD5
  • SHA1
  • SHA256
  • CRC

CTF中哈希题型

进行哈希判断和爆破哈希值

密码学算法识别工具

  • Signsrch
  • PEiD插件 Krypto ANALyzer

安卓逆向技术

  • 安卓架构图page108image60263264.jpg
  • 安卓APK文件
  • 安卓JNI
  • 安卓APK结构
  • 安卓应用四大组件
  • 安卓组件注册
  • 安卓组件实现
  • 安卓相关工具
  • 常用安卓反编译工具比较
  • (这节基本都讲过了)

CTF安卓题目练习

考察逆向基本功

Java逆向

Native逆向

  • 常见的反逆向技术
    • 包名混淆

    • 控制流混淆

    • 常量加密

    • 加壳

    • VM

    • 动态代码加载(如DexClassLoader)

    • Java反射

    • 自修改代码(dex或native)

    • 反调试、反重打包、反模拟器

考察安卓机制

CTF安卓逆向出题

在视频里有时间整理