我在某些帖子/视频/文件中看到它们是零填充的,看起来比它们更大,或匹配相同的文件大小"一些文件系统实用程序用于移动文件的标准,大多数是恶作剧程序或恶意软件。
但我经常想知道,如果文件损坏会发生什么,并且会加载"下一组"指令"这是在文件末尾的大零填充空间?
会发生什么事吗?什么是0x0
的指令集?
答案 0 :(得分:6)
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解码为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>