本文主要介绍一下APK简单加固的破解方法,以及一些其他的逆向技巧和知识。现在市场中加固APK的方式一般有两种:一种是对源APK整体做一个加固,放到指定位置,运行的时候再解密动态加载;另一种是对so进行加固,在so加载内存的时候进行解密释放。本文主要针对第一种方式。
Java反序列化漏洞(一)基础知识
要理解Java反序列化漏洞需要一些Java的相关知识:
1.使用Java反射机制
2.利用sun.reflect.annotation.AnnotationInvocationHandler类
3.调用TransformedMap类的decorate方法时,参数一的Map对象需要put进”value”与非空的值
4.AnnotationInvocationHandler类的实例化参数一需要为java.lang.annotation.Retention类
下面先介绍基础知识,再利用类TransformedMap与AnnotationInvocationHandler分析漏洞。
符号执行基础
这篇文章主要是参考中科大一位同学的文章,介绍了符号执行的基本原理,以及其中的路径状态空间爆炸、复杂结构语义和操作语义建模及程序全局分析这三个关键技术的难点。
Rootkit技术(二)隐藏LKM
前一篇文章中介绍了hook系统调用的方法,但是通过lsmod
等方法可以看到正在内核运行的模块。所以本文主要介绍隐藏LKM的方法,其实很简单。
从lsmod命令中隐藏模块
对于rootkit来说,隐蔽性非常重要,但lsmod命令就能直接看到我们编写的模块。这里先介绍一下lsmod原理,以便理解如何在lsmod命令中隐藏模块。
lsmod命令是通过/proc/modules
来获取当前系统模块信息的。而/proc/modules中的当前系统模块信息是内核利用struct module
结构体的表头遍历内核模块链表、从所有模块的struct module
结构体中获取模块的相关信息来得到的。结构体struct module
在内核中代表一个内核模块。通过insmod把模块插入内核时,模块便与一个struct module
结构体相关联,并成为内核的一部分,所有的内核模块都被维护在一个全局链表中,链表头是一个全局变量struct module *modules
。任何一个新创建的模块,都会被加入到这个链表的头部,通过modules->next
即可引用到。为了让模块在lsmod命令的输出中消失,就需要在这个链表内删除这个模块。
Linux设备驱动(三)文件系统
fastbin上的堆漏洞利用
这是一个hctf2016的比赛题目,题目中的漏洞是堆相关的,但与之前写过的堆漏洞有所不同,程序中申请的堆块比较小,只能用uaf
去利用。
经过对程序的分析,分析出如下两个结构体:str_struct
是漏洞利用所用到的结构体,每次创建字符串都会malloc一个这个结构。
漏洞发生在delete_str
函数中,在delete时没有检查这块内存是否被释放过,造成double free。
模糊测试基础
这篇文章主要是对模糊测试的一个入门级的认识,没有太多干货,主要是一些概念性的东西,为以后深入学习做一点铺垫。
用于模糊测试的模糊测试器分为两类:
- 一类是
基于变异(mutation-based)
的模糊测试器,这一类测试器通过对已有的数据样本进行变异来创建测试用例 - 另一类是
基于生成(generation-based)
的模糊测试器,该类测试器为被测系统使用的协议或是文件格式建模,基于模型生成输入并据此创建测试用例。