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

Mus*_*pha 5 hex hex-editors elf

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

int value = 1337;

我想编辑可执行文件使用十六进制编辑器搜索值1337并将其更改为其他东西,我在ubuntu尝试ghex但我不知道如何搜索它我转换为十六进制但我没有找到它,先谢谢你们.

Jon*_*art 17

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

readelf -s a.out | grep value
Run Code Online (Sandbox Code Playgroud)

这将输出如下所示的行:

    64: 000000000060102c     4 OBJECT  GLOBAL DEFAULT   24 value
Run Code Online (Sandbox Code Playgroud)

所以这里,文件中的第64个符号是value.它的加载地址是0x60102c,它的大小是4个字节.现在我们有了虚拟地址,但这并没有告诉我们它在文件中的位置.要做到这一点,我们需要做三件事:

  1. 找出它所在的部分,
  2. 计算出该值的部分偏移量
  3. 将其部分偏移量添加到该部分的文件偏移量,以获取项目的实际文件偏移量(如果打开ELF文件,将在十六进制编辑器中看到"地址").

让我们再跑readelf一次.-S将列出部分.

readelf -S a.out
Run Code Online (Sandbox Code Playgroud)

这是输出的片段.记住我们变量的地址是60102c,我们正在寻找60102cAddress和它之间的区域Address + 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
Run Code Online (Sandbox Code Playgroud)

果然,.data在内存中,在601028601028+8 = 601030.value从这一部分的地址减去地址,我们得到:

  60102c       Address of `value`
- 601028       Start address of .data section
--------
       4
Run Code Online (Sandbox Code Playgroud)

因此,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`
Run Code Online (Sandbox Code Playgroud)

我们已经获得了文件偏移量,现在让我们确保知道会发生什么.您的变量的值为1337.在十六进制中,即0x539.但是,我们需要调出字节顺序(或"字节顺序").英特尔x86系统是小端.这意味着当一个大于一个字节的整数存储在一个地址时,该值的最不重要字节(或"小"端)位于该地址,其余字节位于后续(增加地址).

所以你的1337将被存储(作为一个4字节int)在文件中,如下所示:

39 05 00 00
Run Code Online (Sandbox Code Playgroud)

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

00 00 05 39
Run Code Online (Sandbox Code Playgroud)

这就是说,如果你在十六进制编辑器中打开你的ELF文件,转到偏移102c,你会看到你的价值:

在此输入图像描述

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