为什么从 gdb 中的反汇编得到的偏移量在十六进制编辑器中显示超出范围错误?

Why offset got from disassembly in gdb shows out of range error in hex editors?

当我在 gdb 中反汇编 ELF64 并找到特殊指令偏移量时,然后在十六进制编辑器(ghex、bless、...)中打开该 elf 并输入偏移量,它说:

Invalid offset - EOF error (out of range offset).

我搜索了 we 并发现 ASLR 可能会造成这个问题,但精灵不是馅饼,无论如何我 disabled ASLR 但它没有帮助。

也试过 radare2 和 objdump,没有区别...

这是带有指令的函数 (0x00000000004f013b <+43>: je 0x4f01a0) 我想将 'je' 编辑为 'jne' (74 -> 75)

    Dump of assembler code for function _ZN9bombsquad4Game13StartKickVoteEPNS_18ConnectionToClientES2_:
       0x00000000004f0110 <+0>:     push   r15
       0x00000000004f0112 <+2>:     mov    r15,rdi
       0x00000000004f0115 <+5>:     push   r14
       0x00000000004f0117 <+7>:     push   r13
       0x00000000004f0119 <+9>:     mov    r13,rsi
       0x00000000004f011c <+12>:    push   r12
       0x00000000004f011e <+14>:    mov    r12,rdx
       0x00000000004f0121 <+17>:    push   rbp
       0x00000000004f0122 <+18>:    push   rbx
       0x00000000004f0123 <+19>:    sub    rsp,0xe8
       0x00000000004f012a <+26>:    call   0x4a66b0 <_ZN9bombsquad11GetRealTimeEv>
       0x00000000004f012f <+31>:    cmp    BYTE PTR [r15+0x2bc],0x0
       0x00000000004f0137 <+39>:    mov    DWORD PTR [rsp+0xc],eax
       0x00000000004f013b <+43>:    je     0x4f01a0 <_ZN9bombsquad4Game13StartKickVoteEPNS_18ConnectionToClientES2_+144>
       0x00000000004f013d <+45>:    lea    rdi,[rsp+0xc0]
       0x00000000004f0145 <+53>:    lea    rdx,[rsp+0x80]
       0x00000000004f014d <+61>:    mov    esi,0x72c3c1
       0x00000000004f0152 <+66>:    call   0x48fa00 <_ZNSsC1EPKcRKSaIcE@plt>
       0x00000000004f0157 <+71>:    xorps  xmm2,xmm2
       0x00000000004f015a <+74>:    lea    rsi,[rsp+0xc0]
       0x00000000004f0162 <+82>:    movss  xmm0,DWORD PTR [rip+0x2353d6]

拆解后的ELF为bs_headless

它不会运行没有其他文件你可以在其官方下载完整的服务器website

gdb 没有显示文件偏移量。它向您显示一个虚拟内存地址。您需要查阅 headers 部分以获得起始文件位置,然后您可以在包含部分中添加偏移量。或者,只需在附近搜索一些独特的字节。

$ objdump -h -j .text bs_headless 

bs_headless:     file format elf64-x86-64

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
 12 .text         002933c2  0000000000490090  0000000000490090  00090090  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE

要获取地址 X 的文件偏移量,您需要执行 X - VMA + File off 作为包含部分的开始。在这种情况下,这意味着您可以方便地从地址中删除前导 4。因此,您在 0x4f013b 处的指令位于文件偏移量 0x0f013b:

000F0138 44 24 0C 74 │ 63 48 8D BC │