gpt4 book ai didi

c - 在程序集中定位数组

转载 作者:太空宇宙 更新时间:2023-11-04 08:20:40 26 4
gpt4 key购买 nike

Here是一种混淆技术,其中条件跳转被跳转表取代。每个数组只包含一个有效的函数指针,它们根据一个 crc 值被调用。我只保留了一个函数指针数组

#include <stdio.h>
#include <inttypes.h>

typedef void (*crc_check_fn)(uint32_t *);

static void crc_nib2 (uint32_t *crc) { printf("OK\n"); }

crc_check_fn b1[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, crc_nib2, 0, 0, 0 };

int main(){
uint32_t crc = 0xFFF7FB7C;
int index = crc & 0x0F;
(*b1[index])(&crc);
}

我有几个问题:

  1. 能否将这个数组定位到二进制的汇编中?我不太懂汇编,所以检查它我无法分辨。

  2. 我假设上一个问题的答案是肯定的,因为原始帖子建议初始化 b1{ ..., crc_nib2-8, crc_nib2, crc_ni2+8, ... };。这样更安全吗?难道不能说这些是无效指针吗?难道不是实现大量真实虚拟函数的更好选择吗?

  3. gcc -S编译我得到了

    b1:...
    .quad 0
    .quad crc_nib2 .quad 0
    ...

在二进制文件上运行 objdump -d 会生成一个没有上述行的程序集。为什么程序集不同?我没有剥离符号。

最佳答案

  1. Can this array located in the assembly of the binary? I do not know well assembly, so checking it I was unable to tell this.

是的,可能吧。使用 GCC,我将它放在程序集中。可以想象它会被放置在 BSS(零初始化内存)中,然后在 main 之前初始化以包含单个非 NULL 指针。

  1. I assume the answer to the previous question is yes, because the original post recommends initializng b1 like { ..., crc_nib2-8,
    crc_nib2, crc_ni2+8, ... };
    . Is this safer? Isn't it possible to tell that these are invalid pointers? Shouldn't be a better option to implement a lot of real dummy functions?

首先,这实际上不是很安全。解决这个问题所需的所有信息都可用。如果我们知道这已经完成,就可以很容易地找出 crc_nib2 是一个有效的函数指针,而另一个是。也可以得出 crc_ni2+8 可能不是有效指针的结论。这是通过知道一个函数的开始通常看起来非常相似并且可以以一定程度的准确度自动识别来完成的。如果有可用的符号表,它会变得更加简单。

如果你想让可执行文件真正防篡改,你必须确保您不能篡改检查可执行文件完整性的代码。如果检查是在可执行文件本身中完成的,那么它可能毫无意义,因为您(如果您可以在一个地方进行修改)即使在其他地方修改后也可以修改检查以使它们通过。

  1. Compiling with gcc -S I got

    b1: ...
    .quad 0
    .quad crc_nib2 .quad 0
    ...

是的,我也是,但问题是什么?

请注意,objdump -d 只是反汇编可执行文件的可执行部分中的所有内容,并跳过其余部分。这是因为通常其他(数据)部分中的数据类型因此“反汇编”没有太多有趣之处,只有对该数据进行 hexdump 才有意义。

关于c - 在程序集中定位数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33565833/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com