0x1-前言:
本篇文章,笔者想谈谈Unidbg无限debugger这个问题,毕竟这种样本确实存在,却没有看到过有师傅发文章进行讲解,那就由我起个头吧.本篇的样本单纯讲无限debugger这个问题,算法分析先搁置.
本篇来自我的公众号发布后复制粘贴,代码块和图片可能丢失,请转移至我的原文:
aHR0cHM6Ly9tcC53ZWl4aW4ucXEuY29tL3MvZnp0aTB4MUNaaGp0aUVVak9NaXFfQQ==
0x2-样本信息:
直达:
version:
此篇研究的对象是libsignature.so这个so文件.
0x3-由因而起:
首先搭好unidbg的架子
运行看看,发现自动断在了这个地方0x400f9230:

笔者并没有人为的去下断点,这是样本本身所引发的问题.
按下c,继续执行

无论怎么按,都会断在这个位置.
我们可以用stop命令停止

这样看似解决了问题,但是如果想额外人为的下断点去看函数入参,寄存器状态,内存状态,就会被样本本身引发的断点干扰.
以上现象,笔者将其定义为无限debugger,无限debugger干扰了我们人为的下断分析,故我们需要做手动patch.
0x4-透过现象看本质:
首先,我们需要知道Unidbg(Unicorn Debugger)本质上是一个基于 Unicorn引擎的模拟执行框架,它并不是一个传统意义上的调试器,但提供了调试功能.
通过断点位置的调试输出信息定位原因:
pc寄存器是存当前的指令的地址,而lr寄存器是存函数执行完毕后应该返回的地址.
将so文件拖入ida中进行反汇编,跳转到当前指令的地址(0xf9230).

这几条汇编意思是,导出了一个名为_armv8_sha512_probe的函数,可以供其他的so文件导入使用,可是具体逻辑为什么是一堆数字呢,看不到具体的反汇编指令,这个与ida的识别有关系,ida错误的把它识别成了数据段,按下键盘的c也没有办法转成代码段,我们就人为手动的来转换一下.
这里IDA使用DCQ(Define Quadword)定义了两个四字(每个四字8字节).
将这两组数据拆分成4段每段4字节,然后转换一下字节序
使用以下在线网站进行反汇编
反汇编结果

重点关注前两条指令,后两条是nop无意义.
sha512su0指令介绍:
[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!