在跳转目标基于动态环境值的情况下,如何构建控制流图? [英] How are control flow graphs built in cases where the jump destination is based on a dynamic environment value?

查看:14
本文介绍了在跳转目标基于动态环境值的情况下,如何构建控制流图?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在学习逆向工程时,我经常想到,因为我可以传递任何位置(我有权访问)作为参数,带有一些非硬编码或非确定性目标的跳转指令(因为它以前没有由程序明确定义)可以指向任何地方。因此,如果我用EAX加载一个基于比方说操作系统版本的字符串的值并执行jmp eax,那么任何试图生成控制流图的工具似乎都不知道目标在哪里(它可以基于您的当前环境,但这可能会导致程序中的一些中断路径)。

我错过了什么吗?因为如果我理解正确的话,似乎我在IDA中打开的每个恶意软件都会这样做(基于他们知道目标环境的某些条件),但我没有看到这样的断开控制流图。话又说回来,我对逆向工程还很陌生。

推荐答案

确实,正如您已经猜到的那样,JMP EAX形式的指令可能会跳到任何地方,因此会破坏您试图进行反向工程的程序的cfg(即,您不会从当前基本块中的已知代码段退出弧线)。

但是,编译器很少发出绝对的间接跳转。当它们这样做时,它们通常是为switch语句生成的跳转表。如果我们谈论的是间接调用(或JMP结尾调用),那么我们也有函数指针,您可以看到CALL EAX形式的指令(在C++中非常常见,即vtables)。例如,对于switch语句,为了正确处理其输入变量或表达式(例如int)的所有可能值,通常需要少量代码来确保值在给定范围内,然后使用它来索引代码指针数组,然后通过寄存器进行绝对间接跳转(或者更常见的情况是jmp [table + eax*4],可能在对EAX做了一些计算之后)。

对于这种情况,使用的习惯用法和编译器实现(即生成什么机器代码)通常是众所周知的,因此反汇编和反编译器可以检测到它们,并计算出输入约束加上跳转表的位置,从而确定正确的目的地(这就是IDA/HexRays所做的事情)。然而,有时这是不可能的,或者只是太难让反汇编/反编译器弄清楚(例如,编译器使用了不同的未知语义,或者程序员故意尝试使反向工程变得更加困难)。

这篇关于在跳转目标基于动态环境值的情况下,如何构建控制流图?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆