欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

objdump按照指定架构反汇编 裸二进制文件

程序员文章站 2022-07-01 23:26:15
...

objdump按照指定架构反汇编 裸二进制文件

因为某些特殊原因,不会把汇编代码直接编译成一个完整的可执行文件,直接编译成纯二进制的文件,以便读到内存中,供其他程序执行使用。例如:

/prj1$ cat bin.S
.globl _start
    .code16
_start:
    mov $0x3f8, %dx
    add %bl, %al
    add $'0', %al
    out %al, (%dx)
    mov $'\n', %al
    out %al, (%dx)

使用如下命令,编译成相应架构下的字节文件:

as -32 bin.S -o bin.o
ld -m elf_i386 --oformat binary -N -e _start -Ttext 0x10000 -o Bin.bin bin.o

如果这个文件是别人发送个你的,你想知道这个文件具体是在做什么话,可以写一个程序,把这个文件读内存中,gdb调试一下,就知道这个文件中的代码是干啥的。有时候,这样也不是很方便,我们可以采用objdump直接反汇编。由于bin.bin并没有编程成相应的可执行文件格式,所以objdump -S bin.bin是会失败的,如下所示:

/prj1$ objdump -S  bin.bin 
objdump: bin.bin: 不可识别的文件格式

我们查一下,本机的objdump支持哪些指令架构,直接objdump --help就可以看到:

objdump:支持的目标: elf64-x86-64 elf32-i386 elf32-iamcu elf32-x86-64 a.out-i386-linux pei-i386 pei-x86-64 elf64-l1om elf64-k1om elf64-little elf64-big elf32-little elf32-big pe-x86-64 pe-bigobj-x86-64 pe-i386 plugin srec symbolsrec verilog tekhex binary ihex
objdump:支持的体系结构: i386 i386:x86-64 i386:x64-32 i8086 i386:intel i386:x86-64:intel i386:x64-32:intel i386:nacl i386:x86-64:nacl i386:x64-32:nacl iamcu iamcu:intel l1om l1om:intel k1om k1om:intel plugin

下列 i386/x86-64 特定的反汇编器选项在使用 -M 开关时可用(使用逗号分隔多个选项):
  x86-64      Disassemble in 64bit mode
  i386        Disassemble in 32bit mode
  i8086       在 16 位模式下反汇编
  att         用 AT&T 语法显示指令
  intel       用 Intel 语法显示指令
  att-mnemonic
              Display instruction in AT&T mnemonic
  intel-mnemonic
              Display instruction in Intel mnemonic
  addr64      假定 64 位地址大小
  addr32      假定 32 位地址大小
  addr16      假定 16 位地址大小
  data32      假定 32 位数据大小
  data16      假定 16 位数据大小
  suffix      在 AT&T 语法中始终显示指令后缀
  amd64       Display instruction in AMD64 ISA
  intel64     Display instruction in Intel64 ISA

因为我们知道,这个文件是按照 i386汇编搞的,所以我们直接如下操作就行了:

/prj1$ objdump -m att  -b binary -D bin.bin 

bin.bin:     文件格式 binary

objdump: can't use supplied machine att
/prj1$ objdump -m i386  -b binary -D bin.bin 

bin.bin:     文件格式 binary


Disassembly of section .data:

00000000 <.data>:
   0:	ba f8 03 00 d8       	mov    $0xd80003f8,%edx
   5:	04 30                	add    $0x30,%al
   7:	ee                   	out    %al,(%dx)
   8:	b0 0a                	mov    $0xa,%al
   a:	ee                   	out    %al,(%dx)

att 方式是不对,反汇编失败
按照i386强行反汇编二进制文件。

相关标签: objdump