为代表性的 crackme 总结相关知识点。一緒に頑張りましょう!
[TOC]
|function|name|How to get|
|-|-|-|
|apk 分析|jadx|
|Java方法调用追踪(与 DDMS method profiling 配合使用)|TraceReader|
|逆向工具|Hopper|
|逆向工具|jeb|
|逆向工具|Ida|
|逆向工具|radare2|
|so 修复|ThomasKing rebuild_section|
|jar 包查看|JD-GUI|
|修改 ro.debuggable|netsniffer mprop|
|汇编字节码|ARM ⇌ Hex|
|汇编框架|keystone|
|二进制查看|010 Editor|
|文件格式模板|010 templates|
|抓包|Charles|
|抓包|Burp Suite|
|证书校验|JustTrustMe|
|操作 apk|aapt|in sdk build-tools|
|apk 签名|Google signapk|
|hook 框架|xposed|
|hook 框架|frida|
|frida on burp suite|Brida|
|DDMS|Android Device Monitor|in sdk tools|
|gdb 调试|gdb|in ndk toolchains (ndk <= r10)|
|gdb 调试|gdbserver|in ndk prebuilt (ndk <= r10)|
|开发工具|Android Studio|
|反编译 apk|ShakaApktool|
|调试 smali|smalidea|
|smali -> dex|smali|
|dex -> smali|baksmali|
|解析 android manifest|axmlprinter|
|查看 .class 文件, 可配合 010 的 class template 手动修改 class bytecode|jclasslib|
|帮助修改 java 字节码|ja|
|luac 反编译|unluac|
|sql 加解密|sqlcipher|
|ab 文件解压|android-backup-extractor|
|llvm 混淆|o-ll://github.com/obfuscator-ll/|
|逆向框架|Miasm|
|符号执行|angr|
|符号执行|trigon|
|二进制分析|barf|
>来自福建海峡两岸CTF 2015。
相关函数:
根据 linker 源码, section 的执行顺序为 .preinit_array -> .init -> .init_array 。但 so 是不会执行 .preinit_array 的, 可以忽略。
.init_array 是一个函数指针数组。编写代码时在函数声明时加上 __attribute__((constructor)) 使之成为共享构造函数,即可使该函数出现在 .init_array section 中。
IDA 动态调试时 'ctrl+s' 查看 section 信息即可定位这两个 setction,特别的,对于 .init_array,可通过搜索 Calling %s @ %p for '%s' 定位。
部分源码:
>来自 RCTF 2015。
快速简记:
|结构|单位结构体占字节|共计字节|
|---|---|---|
|DexHeader|-|0x70h|
|String Table|4|-|
|Type Table|4|-|
|Proto Table|12|-|
|Field Table|8|-|
|Method Table|8|-|
|Class Def Table|32|-|
|Data Section(含Map Section)|-|-|
>来自 0CTF 2015。
常规方法静态分析
dump HPROF file 功能 (带箭头的油桶图标)搜索:strings easyre.sjl.gossip.easyre.hprof | grep 0ctf
gdb 附加进程后直接执行 gcore dump,搜索:strings core.7967 | grep 0ctf
>来自 AliCTF 2016。
指令参考这里👉dal
>来自 AliCTF 2016。
R0、R1、R2、R3, 在调用函数时,用来存放前4个函数参数;如果函数的参数多于 4 个,则多余参数存放在堆栈当中;
低于32位的函数返回值存于 R0。
|寄存器|作用|
|-|-|
|R0 ~ R3|调用函数时,用来存放前4个函数参数|
|R0|函数返回时,存放低于32位的函数返回值|
|R4 ~ R11|保存局部变量。进入函数时必须保存所用到的局部变量寄存器的值,在返回前必须恢复这些寄存器的值;对于函数中没有用到的寄存器则不必进行这些操作。<br>在Thumb中,通常只能使用寄存器 R4~R7来保存局部变量,<br>所以函数内部通用的入栈出栈代码可以为:<br>STMFD sp!,\{r4-r11,lr\}<br>// body of ASM code<br>LDMFD sp!,\{r4-r11,pc\}|
|R12|用作 IP,内部调用暂时寄存器|
|R13|用作 SP,栈指针,sp 中存放的值在退出被调用函数时必须与进入时的值相同。|
|R14|用作 LR,链接寄存器,保存函数的返回地址;如果在函数中保存了返回地址,寄存器R14 则可以用作其他用途|
|R15|用作 PC,程序计数器|
|R16|CPSR,状态寄存器|
>来自 看雪CTF 2017。
SHA1 值。
1. 读取 /proc/pid/status 的 State 是否为 t
2. 读取 /proc/pid/status 的 TracerPid 是否不为0
3. 读取 /proc/pid/wchan 是否有 ptrace_stop
对称性加密,典型的 DES 以64 位二进制为分组对数据加密。
如果明文不是 64 位(16个16进制位)的整数倍,则加密前,这段文本必须在尾部补充一些额外的字节。
在运算时需要根据特定的表格以 64 位为单位对明文和秘钥分别进行置换操作。
对称性加密。主要操作是异或和循环左移。
>来自 看雪CTF 2017。
本例中的花指令有以下几种:
去花即将规律的花指令 nop 掉并修复跳转,ida 中的去花脚本编写可参考 IDA 的 idc 或 idapython API。
为了使 IDA 识别某个函数X,需要在 Functions Window 统统删除之前函数X中误将 junk code 识别为函数的垃圾函数,手动设置函数X的结尾(Edit - Functions - set function end)。
函数尾部特征:
1. BLX __stack_chk_fail -> 堆栈保护
2. POP {R4-R7,PC} (与函数头 PUSH {R4-R7,LR} 对应) -> 堆栈平衡
本例去花可参考:1( HideArea 方便分析)、2( NOP并修改跳转 )
对称性加密。由伪随机数生成器和异或运算组成。密钥长度范围是[1,255]。
RC4一个字节一个字节地加解密。给定一个密钥,伪随机数生成器接受密钥并产生一个S盒。S盒用来加密数据,而且在加密过程中S盒会变化。
*伪代码:*
>来自 LCTF 2016.
在自身应用中,Java 代码在被执行时权限为只读,SMC 只会发生在 NDK 层。一般步骤如下:
1. 通过搜索 DEX 特征码来找到 DEX 的起始地址;
2. 解析 dex 格式定位到具体的类以及方法,找到要修改的 dalvik 字节码;
3. 重新映射内存段,修改内存。
对于本例:(只对 dalvik 有效)
读取 self maps 文件找到 odex 的内存地址 -> 解析dex -> 遍历 classDefs 找到两个函数地址 -> mprotect 修改内存属性 -> 函数替换 -> 将内存属性改回。
>论文参考:《基于 SMC 的 Android 软件保护研究与实现》
>来自 NJCTF 2017.
Nati 是 android SDK 自带的一个 activity,本例将其作为主 activity,使得 dex 中没有 Java 代码。
Nati 所在的 so 在 manifest 中有注册,固定格式:
入口函数是 android_main()。可以这样找到它:
1. 函数 ANati
2. j_j_pthread_create((pthread_t *)v4 + 20, &attr, (void *(*)(void *))sub_XXX, v4);
3. 进入 sub_XXX ,即可看到 android_main(v1);
关于 Nati 原理,参考这里。
CTF-Mobile
write-ups-2015
write-ups-2016
看雪论坛
开发语言:未知
Star 数:75
该项目属于CTF思路方向的开源资源,代码结构清晰,适合安全研究人员学习参考。项目围绕there are some CTF challenges or some other things helping improving android reversing skills.展开,提供了可运行的实现,对理解相关安全机制、工具原理与攻防技术具有较高的研究价值。
从技术实现角度看,此类项目的核心在于对底层原理的深入理解与工程化落地。开发者在研究过程中可以结合官方文档与社区讨论,梳理项目的初始化流程、核心模块职责与数据流转,逐步掌握其中的技术细节与设计思路。
1. 下载源码压缩包,解压到本地环境。
2. 根据项目类型准备对应的运行环境与依赖。
3. 按照 README 中的步骤完成配置与部署。
4. 在隔离的测试环境中运行验证,避免影响生产系统。
本资源来源于开源社区,仅供安全研究、技术学习与合法授权范围内的攻防演练使用,请勿用于任何非法或侵害他人权益的用途。使用本项目产生的一切后果由使用者自行承担。
| 资源标题 | android-reversing-challenges - there are some CTF challenges or some other things |
| 所属分类 | CTF思路 |
| 发布作者 | admin |
| 发布时间 | 2026-10-06 00:00:06 |
| 下载权限 | 免费下载 |
| 附件数量 | 2 个下载链接 |
| 浏览次数 | 92 |
| 讨论数量 | 0 |
| 主题状态 | 正常讨论中 |