关于间接跳转的一种分析方法

2.1k 词

一种间接跳转分析方法介绍

——基于跳转块地址可视化的直观分析法

一、背景介绍

间接跳转是一种常用的代码混淆手段,基本原理是将完整的函数运行结构“拆散”,得到若干步骤块(最低可以拆到单行汇编级别)。块与块之间的顺序衔接可以由散乱的偏移量表获取,并在外层“控制流分发器”函数内计算(中心式,可单独解析顺序);或在每个块中重新计算下一个块地址(去中心式,顺序自包含)等方式实现。大部分的间接跳转为了反分析,往往采用第二种方法,并且往往将循环、条件等需要分支选择的逻辑也包含在跳转块主要实现逻辑之外的计算中,使整个执行流难以被直接分析。

间接跳转的显著特征就是块与块之间的地址和调用函数的地址由寄存器通过一系列计算得到 (jump reg / call reg),而不是由硬编码的数据。由于计算跳转地址会干扰之前的运行结果,块的开头往往会重新加载之前保存的寄存器,然后在块的结尾计算跳转地址之前将已有的结果保存(一般是用栈来保存,也有用数据段的);还有一些间接跳转直接用栈来模拟寄存器、栈中栈和存储数据(相当于在栈内又实现了一层只负责存储数据的结构体)。跳转块的地址计算结果往往不是定值,而是支持分支功能(如果是定值就可以强行patch汇编,直接计算好跳转结果,覆盖到跳转块末尾的计算地址部分,然后整体定义为一个函数并用工具进行自动反编译,这会导致其混淆性大大降低),一个块A可能在前n次都跳向下一个块B,但某次循环结束后就开始跳向新的块C,由于patch时往往不好实现根据分支选择不同块进行跳跃的逻辑(循环次数未知、切换触发条件是否与输出相关未知、可修改字节数量太小无处可patch等),patch后反编译出来的逻辑大概率会是残缺不全的,难以一次性直观看出全部逻辑,导致间接跳转常常更难被分析。

间接跳转的常用分析方法之一是trace,如在完整trace中筛除无关汇编行,或者分析跳转块的模式之后找到其关键逻辑汇编行,然后在trace过程中只记录这些行的执行等。由于跳转块的模式千变万化,形式灵活,且关键汇编行不一定在每个间接跳转块中的位置固定,甚至可能还有附加了运算混淆的间接跳转,每个间接跳转块的结构差异巨大,运算极其复杂,真正的关键逻辑看起来只是像随机嵌在其中不起眼的一行。这些情况下,试图使用上述的方法将变得困难。本文介绍一种更加直观的、更为普适的间接跳转分析方法。

二、方法概述

间接跳转的核心和关键是jmp regcall reg的汇编指令。绝大部分间接跳转都使用这些指令来实现跳转功能,正常情况下,每个块也应当都具备这些指令中的一种。因此,我们可以先对这条指令进行trace。如果每个跳转块尚且能被识别为单独的函数,亦可通过每个函数的开头来定位,但最保险还是直接hook这个模式的指令。可以使用idapython来编写trace脚本(但运行记录速度很慢),亦可使用gdb或者intel pin。核心思路就是先定位提取目标地址范围内的所有间接跳转指令的地址,然后再在trace脚本中对这些地址进行hook,记录其被执行的顺序,甚至可以顺手记录寄存器值等,相关脚本编写示例将在下文的两个实例中给出。成功获取调用顺序后,用散点图或折线图可视化按顺序的地址执行顺序,观察循环特征和特殊模式(如256轮的循环构造、和明文/密文长度相同的循环等)。亦可编写脚本,直接贪婪匹配hook日志中的最大循环乃至嵌套循环,将冗长的日志折叠成带循环的易于分析的版本(见下文实例2)。

下面列举一些使可视化更易于观察出特征模式,减少不必要的分析和逻辑揣测的“小窍门”:

  • 首先,仅就CTF题目来说,大部分程序要求输入由控制台传入。如果输入逻辑也被包含在间接跳转的块中,可以在hook脚本中添加一个线程用于时长计算,若干秒未触发新的hook则添加一条标记行,然后在程序要求输入时等待若干秒,触发插入标记行,由此可以区分哪些逻辑发生在输入之前(与输入无关),哪些逻辑发生在输入之后,甚至可以比较得出与输出强相关的逻辑(如加密,校验)。
  • 如果间接跳转块自身不构成函数/间接跳转只位于单个函数内,可以查找有无间接调用(call reg),若有,大概率是库函数(如read,write,puts等),可以加以标记和划分跳转块的逻辑区间(见下文实例2)。
  • 如果程序是单字节校验,或者有一些便于爆破的弱校验(如输入长度),亦可通过hook的log长度来进行侧信道爆破(比总指令数更稳定)。
  • 如果程序存在多个函数,且多个函数内均含有间接跳转,若确信每个函数内的间接跳转(不是call)不会跳转到别的函数所在的地址范围内,可以根据每个函数的地址范围对间接跳转块的地址做分类,用不同的颜色可视化,以此确认每个函数负责的业务逻辑(见下文实例1)。

以下给出两个实例。

三、具体实例

1. FlareOn 12 第8题

该题目实现了一个窗口化的flag校验器,有多个关键逻辑相关函数被施加了间接跳转,且各函数之间的间接跳转块互相独立,因此可以用函数地址范围进行分类,并在可视化时用不同色彩上色。但此题目的坑点在于校验值在填入每个数字的过程中就自动生成了,并不是最后计算的,因此等待若干秒的方法未能正确发挥其效果,详情见标题链接。可视化图像如下:

FlareOn 12 #8

FlareOn 12 #8

在此题目的解出过程中,由于没有明显的结构化加密过程,可视化的方法主要贡献是用于区分和确定每个函数所负责的逻辑,最终还是要回到具体的汇编分析中,但可视化依旧便利了初始的分析过程,比起在每个函数下断点的方法更整体直观,更加行之有效。

d2dd621bf1facde2e8e18ee312c1ea60ab998a8859d6740b2ae1d87d11305b8c2722ca66cec3ad608de02f5f6942ea8bb314af31a1196824307bb05591ea1598268c775deccd3a80c855e5502347ae0c510d04043570fc90b90d6c911c3e4fef6dcdfe46cd9cb6d525c37b8ba30759515e539d0f307b15337bacc78285d17bf6ce2d15070bd2fc6de5e6c86bb229317923af2a37583017e390cb4eabdd5c044b259c6ad41567ec9a4b4b3ee5c3c334bae75d3b2464ace6b338e3c2a32cb9a41718b64f3080a47c5c7fb43aa0b6d0f71d81aec3c9e4a7ed087f27dccdaaaaa80f5f076f1c730a72c03c03ad2bac91164916a2df2408ac885c42e5335584e0b1eb05806071220bd07afacc6a5de6dd287bf70ef9b3cac5ef782e02acfb2c2e1bfc21838ae3a5978c8846016ae1a62c0b189876e26f4fbdc42e1cd172cd05ced0971f3bf73041ce55ebf4d0990d0fbd820d587f8fa8b123c04cdb17e9de9814147c0b1fb638911fe32179d7bbe5588bfaffde181af827b94839b267b915ad036ec096004fefc60b248dbfbd7e1edb635e6bb4a84b5ec7ad587c95f2e4ceb7a7ccc937c190fe2959b92aceef28f3f77bdd1f5f6329118d30c53b1c1523bf52769bf7674bef1d708ec886d9d6430717ef7db7bb1c96353d106e9442ebf606fb7101d0c8bc1034a0617638dc002e4a8cd95284077c9682cc8a949e4d427191d610a7701f4440b8778b8ba56d0cebd2c59076111f44f35e4b0fd98a228f1140eeae2017f132ed07eb5e3612459658b2a55e6ed4cfb6a63f3b7eff7bda47ee29fff0b77a3d7781679e6a2a5192bbd0b5d80c463b11cca8e8d3b1d6060086111e7b7e8a9391703637586f987f1fcf269901081f710937bcea7c36393cc4c31129c812c01677c7b63c987861471293e04e6e3f7a6c1529a2dbd564280a0a85fe01f841764efa934d36c250c4d384c255145c57f5a543b86b15ca2c0b1572ae0af7a5dfed8bed6375bf08c297394201c9ee5acdfe4ee9a985ebda7f67a1ee169dbea4212037e033c2ab04652b15ca3f1b362e2b6f49498c6fbf1d917df058b13c5b5745d41ada7bba0b6fc0f3fb540cb15ff09827341f20b8124b07db4f325179b599e9775e3a1c02988eaef46e2bf260f086abba65532d11691afd88801b6ed718a48e7b7d07087fcdc8b7e44ed15eb4aebca9736735bdc1dfd32dbc39a0b6ffeb01550833aa5eac977fa1eeaaa9e0a5df52f9dc780a64c42d8b941b58cd6b20a6dd19c523d3238b3f01ee8b56cce26bbf52d506eff46980795ba9e3348a9bd381ad4dbca034478425da76a4b2e37b6b533d1649f9f657c2c4561020599caa0815ec11df7c839aee3bb245f5d14c2d5e80a2e8fb6afbdc033784e8cd882308e75a66a9e9ac1332518e668d6d2e3382c59d72d4684a86e5214f75e5cee8841ee64932e803400bdbe81865788cdbc529b70a4fcc963332174f651f9aeb496b6a6efa1b18ccd0e318e9cc46fd2e5b1947fe5d37887c17f935d690287f7ffae3b03098e894cdcd709d5c9d6b167a756242bd319c02cf1881e810f2c276a8a51c4fefac2c3bdfc331cac84c6d18cd92c01ad22a5a46247312f573b2ab03a9b56758629197c0c99b8414125beac9d1322df1e23f77cccf67a2f7c56640d563e88af9691c6853a93781583b860ec61154530bf56524e0bbb72bb73b599f6f1a8ae186c6756b336fafc946fc05c11284e3bc4d4a19b36c0e8d4643a6ab2fa64b9b23ce1cfbc0dc067fb1f2cea0712e874c021d5147c55f7df2a675070367bb95d2b6857b48d1f661806e806e8fc8d3ee25cfda742687b7d19a8c3ce7fa5a6e3e26d3a26d8f4e99b77904e94425648dac07b44d7bda725349bbfbc995ffb902acc1353c753cbacbce776ae387894eaef2a8abeb8690ab133a80e1703c35e9ce0e6bca6d90f2d252b6c7e3a57123f0df270bdb7b48c672002e9b1e65f93bb540c687b1ff93a477c6a7256c51bea804b6f9881d3068def1e6fa106e40beabf13f0e97b42be1dfc38618aab5adb2f2052968e8a30d238fc48dc1640ae291d25ed12751559c6a366835fb335fefb1296d5ef576c2ed8583b09e0fde5c8c15e926dadaced48e79a9b03b04b3806d8782a8cd1cb430f823100c7ed967b5bab8391f887dd77668116bea096c97d19b48ed590ac5c533db223618ee7e70c12ef9d08a0eb58247ea21bebcebc19b73786e1d23da156544ffd748e89c2c8c1b7aa6f354a0892976bb10d2d6fc29d3ab63b84d1d9f386d58699c56623ebde9e598e7aee6f9747115bd54f378485fee1bfbc7323b1677933d052db3430fc372730578ee7fcf7c385b41d8650940b38eccac5202dd8be8ca0af34de70d0b414e131fcd9a8b1d8a1e610a88e7b56726f6807ae3008df990af15b561aaec3ec3de5121c40de24827640dbee78594c63914dee1752a57cd1f512c81998a3f0e2753f361e415edf0e0f9fe3474ffaf5cfda519f2b99ec1775f0c3e83c1960ec9785b6ef5571d523af1731d04cf45a01f084e2bd6f0358074b30c3ded97cad426cc45d556e909ee86c5b2ccaf90e3307d5c6c39a853880336d31a009454e7fde75c5a8ddf859f33b961726589bbe8c3d760875063de5e4e60a65daab558e7279b11e6d217e43dc483956c28d367a394c09b48150881189f821b15041de4348c740a9ee5723a0b03e66d6988fbd85e05f84ed51fdc59cab9540331f2ec7a10e8ebc3fab409a7daa4174cde30cc3f3f7621d31ad0908598db3d98ac304f22bbc7b29f29feb139fec5fe8ce865f724e57c219b604bd4eb572880e89297162966f406da9bbbe3fe7dd6645f870cca3b1a84bc9dcc

四、总结

本文提供了一种侧信道的、结合图像分析和模式感知的方法更为普适地分析间接跳转块与块之间的衔接顺序,并用可视化的方式将其直观展示出来。可视化的主要目的是提供不同函数地址界限、不同逻辑界限的辨认和便于认出重复模式及其重复次数,从而推断其作用和重要性。尽管该方法能以图像形式直观展示间接跳转块之间的执行顺序,由于不同人分析执行流的方法不同,该方法可能不适用于所有人(觉得图示难以理解等)。