文本字符串是嵌入式软件中的漏洞吗?

安全设备/系统

160人已加入

描述

多年来,台式计算机的安全性一直是人们关注的问题。一旦机器连接到互联网,本质上就有可能受到某种攻击。这种渗透可能是为了窃取数据、破坏系统或以某种方式改变其操作。保护手段是众所周知的并且被广泛应用。嵌入式系统似乎总是不受这些问题的影响,因为它们很少联网,而且它们的代码通常在某种 ROM 中。事情变了。大部分现代系统都连接到 Internet,将代码复制到 RAM 并从那里执行是常见的做法。这意味着安全性现在是一个重要的嵌入式软件设计考虑因素。

英语是一种很好的交流工具。它是一种极具表现力的语言,能够以非常精确和微妙的方式进行交流。然而,在日常讲话中,我们大多数人都很懒惰,经常使用没有 100% 准确度的单词。我在这里想到的例子是安全安保几乎可以互换使用的方式,就好像它们是同义词一样。我认为我听到的最好的定义是这样的:安全是保护世界免受设备影响的过程;安全性正在保护设备免受外界侵害。安全是我今天的主题。

如果一个系统真的需要完全防弹,则需要工业级加密。这通常需要特定的硬件支持,虽然很容易获得,但对于不需要如此高安全性的应用程序来说,这可能被认为是多余的。在这种情况下,还有其他选择,这就是我想探索的。

如果黑客可以访问设备的内存内容,他们就可以开始弄清楚它做了什么以及它是如何做的。这是改变其运作的第一阶段。代码可以被反汇编,因此可以揭示逻辑。如果没有加密,就几乎无法防止这种情况发生。黑客可能做的下一件事是查看数据的十六进制/ASCII 转储,看看他们能在那里找到有意义的东西。他们正在寻找模式和可识别的结构。这是可以采取一些预防措施的地方。虽然加密可能不是一种选择,但混淆是可能的。

数据混淆的目的是通过简单地降低数据的可识别性来延迟或阻止黑客。通过内存转储扫描,最容易发现的事情之一是文本字符串。所以,这就是我将在这里重点介绍的内容。

在 C/C++ 代码中,文本字符串通常只是包含以空字节结尾的 ASCII 代码的字节序列。这很容易发现,所以我会改变它。首先,每个字符串的第一个字节将是一个长度说明符,而不是空终止符。字符串的字符会稍微打乱它们的数据,让它们看起来不那么熟悉——我要做的就是交换每个字节的两个半字节。我需要一个实用程序,将纯文本字符串输入其中,并生成具有适当初始化的数组的声明。这是该实用程序的核心功能:

void scramble(int index, unsigned char *input)
{
    unsigned char *charpointer, 字符;
    printf("unsigned char string%d[%d] = {0x%02x,", index,
           strlen(输入)+1,strlen(输入));
    字符指针 = 输入;
    而(*字符指针)
    {
        字符= *字符指针++;
        字符 = ((字符 & 0x0f) << 4) |
                    ((字符 & 0xf0) >> 4);
        printf("0x%02x", 字符);
        if (*字符指针)
            printf(",");
    }
    printf("}; // \"%s\"\n", 输入);
}

如果我向这个函数传递一个索引 4 和一个字符串“Hello world”(原来的嗯?),输出将是:

unsigned char string4[12] = {0x0b, 0x84, 0x56, 0xc6, 0xc6, 0xf6, 0x02, 0x77, 0xf6, 0x27, 0xc6, 0x46};// “你好世界”

我可以将其复制并粘贴到我的代码中,然后我需要做的就是编写一个函数来在需要显示文本时对其进行解读。我可以通过将index参数替换为字符串来给它一个任意名称,而不是给每个字符串一个索引号。请注意,生成的代码在某种程度上是自记录的,因为注释以可读的形式显示了字符串,但是,当然,这只出现在源代码中。如果黑客可以访问您的源代码,那么您就有足够的麻烦,我无法提供进一步的帮助!

下面是一些代码来说明解扰过程:

无效的主要()
{
    无符号字符临时,缓冲区[50];
    整数计数 = string4[0],索引 = 0;
    而(计数--)
    {
        temp = string4[index+1];
        温度 = ((温度 & 0x0f) << 4) | ((温度 & 0xf0) >> 4);
        缓冲区[索引] = 温度;
        索引++;
    }
    缓冲区[索引] = 0;
    printf("-%s-\n", 缓冲区);
}

每个字节中半字节的交换是可以完成加扰的许多不同方式之一。另一种可能性是,比如说,将每个字符左旋转三位。这里有一些代码可以做到这一点:

unsigned char leftrotate3(unsigned char c)
{
    c = (c << 3) | (c >> 5);
    返回 c;
}

我概述的混淆技术会逐个字符地打乱字符串。可以改为对整个字符串执行操作。例如,将字符串视为一长串位并将其向左旋转任意数字。我将把这个算法的编码留给更热心的读者。

  值得注意的是,本地化所有文本字符串的一个副作用是,为其他语言制作不同版本的软件非常简单。

  我必须重申并强调,数据混淆远不是防弹的,充其量只能减缓黑客的攻击速度。如果没有其他情况,解读代码可能会被分解。这种技术的诀窍是使模糊处理成为难以遵循的轨迹。如果你真的需要更高的安全性,你必须考虑完全加密。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分