gpt4 book ai didi

elf - 使用十六进制编辑器在ELF可执行文件中查找整数声明的变量

转载 作者:行者123 更新时间:2023-12-04 16:31:32 25 4
gpt4 key购买 nike

我想通过使用十六进制编辑器来更改可执行文件中的整数声明变量的值,这仅是假设我知道代码中声明了一个变量类型为int且该变量为:

int value = 1337;



我想使用十六进制编辑器编辑可执行文件,搜索值1337并将其更改为其他内容,我在ubuntu中尝试了ghex,但我不知道如何搜索,我将其转换为十六进制,但找不到,谢谢大家。

最佳答案

首先,您将使用readelf来确定变量的虚拟地址(程序加载后它在内存中的位置)。 -s将显示符号表,我们将用grep表示变量的名称。

readelf -s a.out | grep value

这将输出如下所示的行:
    64: 000000000060102c     4 OBJECT  GLOBAL DEFAULT   24 value

因此,这里文件中的第64个符号是 value。它的加载地址为0x60102c,大小为4个字节。现在我们有了虚拟地址,但这并不能告诉我们它在文件中的位置。为此,我们需要做三件事:
  • 找出它所在的部分,
  • 找出此值的节偏移
  • 将其节偏移量添加到该节的文件偏移量中,以获取项目的实际文件偏移量(如果打开ELF文件,则将在十六进制编辑器中看到的“地址”)。

  • 让我们再次运行 readelf-S将列出这些部分。
    readelf -S a.out

    这是输出的代码段。请记住,变量的地址是 60102c,我们正在寻找 60102c位于其 AddressAddress + Size之间的部分。由于这是一个读写变量,因此我们可以猜测它会在 .data部分中。
    Section Headers:
    [Nr] Name Type Address Offset
    Size EntSize Flags Link Info Align
    ...
    [21] .dynamic DYNAMIC 0000000000600e28 00000e28
    00000000000001d0 0000000000000010 WA 6 0 8
    [22] .got PROGBITS 0000000000600ff8 00000ff8
    0000000000000008 0000000000000008 WA 0 0 8
    [23] .got.plt PROGBITS 0000000000601000 00001000
    0000000000000028 0000000000000008 WA 0 0 8
    [24] .data PROGBITS 0000000000601028 00001028
    0000000000000008 0000000000000000 WA 0 0 4
    [25] .bss NOBITS 0000000000601030 00001030
    0000000000000008 0000000000000000 WA 0 0 4
    [26] .comment PROGBITS 0000000000000000 00001030
    000000000000002c 0000000000000001 MS 0 0 1

    果然, .data601028601028+8 = 601030的内存中。从本节的地址中减去 value的地址,我们得到:
      60102c       Address of `value`
    - 601028 Start address of .data section
    --------
    4

    因此, value.data节的开始处的偏移量为4。现在, .data节在文件中的什么位置?这就是 Offset列告诉我们的内容。 .data从文件偏移量 1028开始。知道了这一点,我们可以找到 value的文件偏移量:
      1028         File offset of .data section
    + 4 Offset of `value` in .data section
    -------
    102c File offset of `value`

    我们已经偏移了文件,现在让我们确保我们知道期望什么。您的变量的值为1337。用十六进制表示的是0x539。但是,我们需要调出 byte order(或“endianness”)。英特尔x86系统为低端字节序。这意味着,当一个地址中存储的整数大于一个字节时,该值的最低有效字节(或“小”端)位于该地址,其余字节位于后续地址(地址递增)。

    因此,您的1337将以以下形式存储在文件中(作为4字节 int):
    39 05 00 00

    在“大端”系统(例如Motorola 68k)上,该值将在文件中以相反的顺序显示:
    00 00 05 39

    综上所述,如果您在十六进制编辑器中打开ELF文件,然后转到offset 102c,则将看到您的值:

    ELF文件没有校验和或CRC,因此您应该能够在十六进制编辑器中简单地编辑该值,并且在程序执行时它将具有新值!

    关于elf - 使用十六进制编辑器在ELF可执行文件中查找整数声明的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20671194/

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