x86_64架构下rodata与data段反汇编内容解析求助
问题解析与指令详解
1. rodata段中msg反汇编出现rex.W等指令的本质
rodata段存储的是只读数据(比如字符串msg),objdump默认会尝试把所有字节当作x86-64指令解码,但这些字节本质是ASCII字符,并非机器指令。所谓的rex.W等内容,只是字符串的字节巧合对应了某些指令的机器码,完全没有指令层面的意义。
比如字符串"Hello"的首字节0x48,刚好和x86-64的rex.W前缀机器码一致,但这只是字符H的ASCII值,不是用来扩展寄存器宽度的指令前缀,不需要当作指令解读。
2. data段中b64、b32、b16的反汇编指令解析
data段的b64(64位数据)、b32(32位数据)、b16(16位数据)都是静态数据,并非可执行指令,objdump误将其解码为指令:
- 以
b64处的add DWORD PTR [rax],eax为例:这只是b64的8个字节里,前几个字节刚好匹配add DWORD PTR [rax],eax的机器码(比如0x01 0x00),但这和rax的指向毫无关系——这些字节根本不是用来执行的指令,只是data段里的原始数值。
正确查看数据段内容的方式
不要用反汇编指令的方式查看rodata/data段,改用objdump的-s参数查看原始字节与ASCII内容:
objdump -s -j .rodata -j .data your_program.o
这样就能直接看到msg的真实字符串、b64/b32/b16的原始数值,避免被误解析的无意义指令干扰。
内容的提问来源于stack exchange,提问作者Moses
相关产品推荐
相关产品推荐

