为什么从 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 │
当我在 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 │