题目信息:
本题是安卓平台规则2的crackme
文件名:KCTF2022-autumn-android-crackme.apk
公开序列号如下:
name:KCTF
serial:42A4ECA067F54074C3EB2F177ACB06FE1379055CD4FB2211C3BD874FAD9E101D
第二组序列号:
name:5113BF890A692660
serial:FDF7C5A02A114C749970F516F1DB24FE9D6AC65C41B4EEEDD2EDA660D5EFB01E
(通过命令shasum -a 256 KCTF2022-autumn-android-crackme.apk计算apk得文件hash:
5113BF890A69266035BA4AE149F4E88183949F6E5F9B8201B404E0F5F98F29D3)
设计思路:
本题算法延续了KCTF2022-春季赛-第八题迷雾散去的设计方法:
增加防护技巧:
本题属于高阶对抗题目,虽然在算法上与之前想似,故算法部分不是考察重点,此次增加了混淆保护的形态多样性,故保护后的关键函数并没有相同之处,加上防调试及防frida的手段,本题重在考察选手对于复杂指令形态下,如何思考了解函数间关系,抽丝拨缕梳理解决问题的技巧能力。
解题思路:
程序中保留了android_log_print符号调用,并且保留了将序列号中间结果通过参数传递给子函数的调用,攻击者只需要找到该子函数并且将调用android_log_print打印参数的指令填充后,通过日志即可查看到真实serial
vm保护原理:
正常编译后的代码通过反编译工具,逻辑结构很清晰,门槛低的小白都可以拿来用f5分析,所以代码防护很重要,最起码能防部分小白。最初级的加壳保护运行后会解密所以动态调试和dump内存也能获取到原代码,这时保护后勿需还原最终以保护态运行就会提高分析门槛。X86时期辉煌无数的vmprotect技术令大部分人闻风丧胆。该技术放到arm架构同样适用。原理也大同小异:
保护流程主要由三部分组成:反汇编器,解释器vmachine和链接器。
反汇编器取汇编指令列表中的指令根据指令类型生成对应的模拟代码,
如push/pop, ldr/str, bl, add, mov等,由于对指令进行了重新编码故称为指令模拟
原始代码开始替换为一条b 指令跳转到新生成的模拟代码运行,这样做可以避免其
他函数调用该函数时能正常工作。其余位置可以填充随机字段或者清空。
解释器工作原理:
针对ARM平台ELF格式的二进制程序的代码保护,兼容Arm&Thumb指令集,
首先反编译被保护的函数获取指令流 其次对指令流类型分别处理进行重定位
和需要模拟的指令进行编码生成vmdata最后通过链接器将解释器和原二进制
文件进行patch生成新二进制由于编译后的汇编指令地址相关性,当把指令放到到千里之外,且不影响运行首要任务就是对地址相关指令做重定位
.text:000016C2 19 4C LDR R4, =(__stack_chk_guard_ptr - 0x16CC)
.text:000016C4 C3 B0 SUB SP, SP, #0x10C
.text:000016C6 01 AE ADD R6, SP, #0x120+var_11C
.text:000016C8 7C 44 ADD R4, PC
.text:000016CA 24 68 LDR R4, [R4]
…
.text:00001728 A0 38 00 00 off_1728 DCD __stack_chk_guard_ptr - 0x16CC
Thumb指令16C2处指令为ldr r4, [pc, #0x64],
访问的数据地址为 (16C2&0xFFF4) + (PC+4) + 0x64 = 0x1728
意思是从0x1728中获取数据即0x38A0赋值给R4寄存器
R4寄存器在0x16C8地址处会跟PC寄存器相加即0x38A0+(PC+4)=0x4F6C
结合0x16CA指令读内存操作,也就是说程序是在读取0x4F6C地址处的数据
这段代码当移动到其他地址运行时PC寄存器会变为移动后的地址
例如这段代码移动到
.text:00006000 19 4C LDR R4, =(__stack_chk_guard_ptr - 0x16CC)
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2022-11-21 13:16
被kanxue编辑
,原因: