瓶颈

有时候还是挺难顶的,缺少开发经验导致对一些代码始终停留于看得懂但是写不出来。这对以后的安全生涯有很大影响。
补,现在就补。
个人认为做安全并不需要特别高的开发能力。但是最基本的,怎么写,如何实现,其原理如何还是得了解。

唉、、、大学这个时间点,我本因在开心的玩才对,但是为了生计,不得不这样努力下去。

【Android壳】有关一代壳和二代壳那点事

android的加壳保护类型

  1. dex整体加壳

  2. 类抽取

    去除整体加壳之后,发现各个类成员函数的代码全部被设置为了nop

  3. vmp和dex2c

  • advmp:解释器本身用ollvm保护,被保护的函数属性变为Native
  • dcc:把dex文件整成lib,被保护的函数属性变为Native

    vmp保护中,可能出现多个函数的注册地址相同,函数逻辑相似

    dcc保护中,不同函数的注册地址不同,函数逻辑不相似

android壳的进化历史

第一代:DEX加密

对DEX进行一个整体加密。对抗调试手段和反编译手段。
这种壳通过hook掉ART加载DEX文件的函数即可完成脱壳
常用脱壳点:
有关DexFile的构造函数点或者类成员函数调用点。常见于InMemoryDexClassLoader,DexClassLader等DEX文件解析类中
都玩烂的东西,和Davlik虚拟机一样的地位————进入了历史的垃圾桶

第二代:dex抽取与so加固

大多数企业版/商用壳的实现(目前)
把DexMethod代码抽取到外部。Dex动态加载,在加载之前由so还原回去原代码。
简单的说就是把dex文件中各函数的具体指令给替换成nop,将原先的指令备份于so中。等需要执行某个函数的时候,再把原先的指令写回dex文件中。
一般情况下,二代壳都把dex2oat这个过程给ban了。因为一旦dex被解析为oat,程序再次运行的时候就会直接使用oat文件作为“指令”,二代壳的指令还原将失效!

三代壳:dex动态解密与so混淆

Dex Method代码动态解密和so代码膨胀混淆。字面意义上来理解,其实就是加更加复杂的smc和代码混淆来继续增大逆向工程难度。

二代壳:实现方式

Dex文件->函数体结构->指令全部设置为nop,并备份原线指令
hook掉dex2oat
hook掉loadMethod:
先读取dex文件,并恢复函数中的内容,再loadMethod

二代壳:破解方式

因为二代壳使用非root inlinehook技术hook掉了安卓系统的一些机制,所以直接从外部手段脱壳是比较困难的
比较可行的方式是直接修改一下android系统,从系统内部出发干他

第一步:选择脱壳点。
二代壳的原理是函数运行前才把具体指令还原回去,那么我们选择的脱壳点就得晚于这个时机。
所有的函数在进入art解释器之前,都会先经历namespace中interpter的execute函数。
在这里插入代码,直接将DexFile写入/sdcard即可

第二步: 编译系统镜像,刷入测试机

第三步:运行想要脱壳的程序

然后我们就可以在/sdcard目录下获得脱壳后的dex文件。
当然,这只是个朦胧的概述。实际上要复杂一些。我们总不能把所有程序的dex文件都dump下来。

【D3CTF-Reverse】部分有价值的题解

noname 用frida hook掉关键函数

check函数调用的FlagChecker类里头的checkFlag函数

阅读manifest.xml,可以得知还有一个Application类在程序启动时同时启动:NoNameApp
对这个类进行逆向,发现先前提到的FlagChecker类是程序运行后才被NoNameApp通过读取.jar文件进行实例化
不过比较悲伤,这个.jar文件在解密-读取之后就被删除了

使用frida hook

目标:hook掉java.io.File.delete(),从而保护data.jar不被删除
使用指令 frida -U -f com.d3ctf.noname -l hook.js --no-pause进行hook

function main() {
  Java.perform(function x() {
    var fileIO = Java.use("java.io.File");
    console.log("Hooking start");
    fileIO.delete.implementation = function() {
      return true;
    }
    console.log("Hooking stop")
  });
}
setImmediate(main);

随后可以在/data/user/0/com.d3ctf.noname/目录下找到data.jar。使用adb将其pull下来,用jeb反编译即可
算法过于白给,exp 略

白给 有时候细心反而比技术能力重要

差点拿下三血。不是能力不足,而是不够细心。
白帽100推送,懒得复制一遍了。
一个切片错误,调试了将近8小时。算法理解能力不是一切,它只是辅助能力。