如果系统执行文件中被零填充的部分,会发生什么情况?
What would happen if a system executes a part of the file that is zero-padded?
我在一些 posts/videos/files 中看到它们被零填充以看起来比实际更大,或者符合 "same file size" 一些文件系统实用程序移动文件的标准,大多数情况下它们要么恶作剧程序或恶意软件。
但我经常想,如果文件损坏了会发生什么,会不会 "load" 下一组 "instructions" 在最后的大零填充 space文件的?
会不会有事? 0x0
的指令集是什么?
0
字节的解码完全依赖于CPU架构。在许多体系结构中,指令是固定长度的(例如 32 位),因此相关的东西将是 00 00 00 00
(使用 hexdump 表示法)。
在大多数 Linux 发行版中,clang/llvm 内置了对多个目标架构的支持(clang -target
和 llvm-objdump
),与 gcc / gas / binutils 不同,所以我可以用它来检查一些我没有安装 cross-gcc / binutils 的架构。使用 llvm-objdump --version
查看支持的列表。 (但我没有弄清楚如何让它反汇编像 binutils objdump -b binary
这样的原始二进制文件,而且我的 clang 不会自行创建 SPARC 二进制文件。)
在 x86 上,00 00
(2 个字节)解码(http://ref.x86asm.net/coder32.html) as an 8-bit add
with a memory destination。第一个字节是操作码,第二个字节是指定操作数的 ModR/M。
这通常会立即出现段错误(如果 eax/rax
不是有效指针),或者一旦执行从零填充部分的末尾掉落到未映射的页面中就会出现段错误。 (这在现实生活中会发生,因为像 falling off the end of _start
这样的错误没有进行退出系统调用 ),尽管在那些情况下,以下字节并不总是全为零。例如数据,或 ELF 元数据。)
x86 64 位模式:ndisasm -b64 /dev/zero | head
:
address machine code disassembly
00000000 0000 add [rax],al
x86 32 位模式 (-b32
):
00000000 0000 add [eax],al
x86 16 位模式:(-b16
):
00000000 0000 add [bx+si],al
AArch32 ARM 模式:cd /tmp
&& dd if=/dev/zero of=zero bs=16 count=1
&& arm-none-eabi-objdump -z -D -b binary -marm zero
。 (没有 -z
,objdump 跳过大块全零并显示 ...
)
addr machine code disassembly
0: 00000000 andeq r0, r0, r0
ARM Thumb/Thumb2: arm-none-eabi-objdump -z -D -b binary -marm --disassembler-options=force-thumb zero
0: 0000 movs r0, r0
2: 0000 movs r0, r0
AArch64: aarch64-linux-gnu-objdump -z -D -b binary -maarch64 zero
0: 00000000 .inst 0x00000000 ; undefined
MIPS32: echo .long 0 > zero.S
&& clang -c -target mips zero.S
&& llvm-objdump -d zero.o
zero.o: file format ELF32-mips
Disassembly of section .text:
0: 00 00 00 00 nop
PowerPC 32 位和 64 位:-target powerpc
和 -target powerpc64
。 IDK 如果 PowerPC 的任何扩展使用 00 00 00 00
指令编码,或者如果它在现代 IBM POWER 芯片上仍然是非法指令。
zero.o: file format ELF32-ppc (or ELF64-ppc64)
Disassembly of section .text:
0: 00 00 00 00 <unknown>
IBM S390: clang -c -target systemz zero.S
zero.o: file format ELF64-s390
Disassembly of section .text:
0: 00 00 <unknown>
2: 00 00 <unknown>
我在一些 posts/videos/files 中看到它们被零填充以看起来比实际更大,或者符合 "same file size" 一些文件系统实用程序移动文件的标准,大多数情况下它们要么恶作剧程序或恶意软件。
但我经常想,如果文件损坏了会发生什么,会不会 "load" 下一组 "instructions" 在最后的大零填充 space文件的?
会不会有事? 0x0
的指令集是什么?
0
字节的解码完全依赖于CPU架构。在许多体系结构中,指令是固定长度的(例如 32 位),因此相关的东西将是 00 00 00 00
(使用 hexdump 表示法)。
在大多数 Linux 发行版中,clang/llvm 内置了对多个目标架构的支持(clang -target
和 llvm-objdump
),与 gcc / gas / binutils 不同,所以我可以用它来检查一些我没有安装 cross-gcc / binutils 的架构。使用 llvm-objdump --version
查看支持的列表。 (但我没有弄清楚如何让它反汇编像 binutils objdump -b binary
这样的原始二进制文件,而且我的 clang 不会自行创建 SPARC 二进制文件。)
在 x86 上,00 00
(2 个字节)解码(http://ref.x86asm.net/coder32.html) as an 8-bit add
with a memory destination。第一个字节是操作码,第二个字节是指定操作数的 ModR/M。
这通常会立即出现段错误(如果 eax/rax
不是有效指针),或者一旦执行从零填充部分的末尾掉落到未映射的页面中就会出现段错误。 (这在现实生活中会发生,因为像 falling off the end of _start
这样的错误没有进行退出系统调用 ),尽管在那些情况下,以下字节并不总是全为零。例如数据,或 ELF 元数据。)
x86 64 位模式:ndisasm -b64 /dev/zero | head
:
address machine code disassembly
00000000 0000 add [rax],al
x86 32 位模式 (-b32
):
00000000 0000 add [eax],al
x86 16 位模式:(-b16
):
00000000 0000 add [bx+si],al
AArch32 ARM 模式:cd /tmp
&& dd if=/dev/zero of=zero bs=16 count=1
&& arm-none-eabi-objdump -z -D -b binary -marm zero
。 (没有 -z
,objdump 跳过大块全零并显示 ...
)
addr machine code disassembly
0: 00000000 andeq r0, r0, r0
ARM Thumb/Thumb2: arm-none-eabi-objdump -z -D -b binary -marm --disassembler-options=force-thumb zero
0: 0000 movs r0, r0
2: 0000 movs r0, r0
AArch64: aarch64-linux-gnu-objdump -z -D -b binary -maarch64 zero
0: 00000000 .inst 0x00000000 ; undefined
MIPS32: echo .long 0 > zero.S
&& clang -c -target mips zero.S
&& llvm-objdump -d zero.o
zero.o: file format ELF32-mips
Disassembly of section .text:
0: 00 00 00 00 nop
PowerPC 32 位和 64 位:-target powerpc
和 -target powerpc64
。 IDK 如果 PowerPC 的任何扩展使用 00 00 00 00
指令编码,或者如果它在现代 IBM POWER 芯片上仍然是非法指令。
zero.o: file format ELF32-ppc (or ELF64-ppc64)
Disassembly of section .text:
0: 00 00 00 00 <unknown>
IBM S390: clang -c -target systemz zero.S
zero.o: file format ELF64-s390
Disassembly of section .text:
0: 00 00 <unknown>
2: 00 00 <unknown>