目的:我想获取十六进制和ascii数据(使用xxd从二进制文件派生),并使用Objdump(或Linux随附的其他合适工具)输出内存地址/偏移量,汇编代码和文本数据。

目前我可以获取偏移量和汇编代码,但不能获取文本字符串。

我使用了以下内容:
objdump -D -b binary -mi386 -Maddr16,data16 <filename>

我是否需要使用-s开关?

评论

您是否正在分析来自符合特定ABI或格式(ELF,COFF,MACHO等)的二进制文件中的数据?

您将需要像IDA这样的工具来自动确定二进制文件中的数据和代码。

我目前无法使用IDA。我正在寻找手动方法或普通Linux发行版附带的方法。

iirc dion mendel在旧的honeynet sotm逆转挑战中使用的一些py脚本使用了objdump并可以美化死列表,这里是一个tut的链接,该tut使它们适应于分析简单的二进制文件,以查看是否有帮助(内容概念和可行的假设很旧,因此您可能需要在附近装满盐的投手)reversing.be/article.php?story=2005030218170966

@blabb您在上一条评论中链接的网站已被Firefox列入黑名单。您知道其他任何页面吗?

#1 楼

这里假设正在分析Linux ELF32二进制文件。

代码和数据(例如字符串)存储在ELF二进制文件的不同部分中。


要拆卸包含代码的零件,请使用objdump -dj .text <binary_name>
要检查硬编码的字符串数据,请使用readelf -x .rodata <binary_name>


说明和数据位于ELF二进制文件中的单独区域中。


当前,我可以获取偏移量和汇编代码,但不能获取文本字符串。


代码x86或x86-64 ELF二进制文件中没有混合硬编码字符串。当编译器工具链生成二进制文件时,硬编码的字符串与可执行代码位于二进制文件的单独区域中,并通过其虚拟内存地址进行引用/访问。这是Ange Albertini的图表,说明了ELF二进制文件中各个部分的布局方式:


为了使这一点更加清楚,下面是Linux实用程序lscatmkdir的可视化和mv(通过binvis.io完成)。蓝色的实心区域由ASCII字符串数据组成(例如.rodata部分),蓝色,白色,红色和黑色混合在一起的大块是由可执行代码组成的区域(例如.text部分)。 />
* ls cat mkdir mv






从这些可视化中我们可以看到,这些二进制文件是以类似的方式组织起来。每个二进制文件都有离散的区域或部分,其中包含不同的信息。我们在这里还可以看到有多个区域(即部分)包含ASCII字符串数据,而不仅仅是一个。

带有可执行指令的部分将不包含有意义的字符串,而仅包含代码。在检查Linux -s实用程序的objdump部分时,可以通过将.text选项与date结合使用来直接观察到:

$ objdump -sj .text /bin/date
/bin/date:     file format elf64-x86-64

Contents of section .text:
 401af0 41574531 ff415645 31f64155 41544531  AWE1.AVE1.AUATE1
 401b00 e45589fd 534889f3 4881ecd8 00000048  .U..SH..H......H
 401b10 8b3ee8f9 530000be a1c84000 bf060000  .>..S.....@.....
 401b20 00e8bafe ffffbe87 944000bf 61944000  .........@..a.@.
 401b30 e83bfcff ffbf6194 4000e811 fcffffbf  .;....a.@.......
 401b40 102c4000 e8877800 00c64424 0f0048c7  .,@...x...D$..H.
 < snip >


在ELF二进制文件中,.text节保存该程序的可执行指令。指令组成的字节在此十六进制转储中被视为ASCII,因此打印出无意义的字符序列。

Objdump会将数据视为指令,并进行相应的反汇编。

objdump依靠ELF二进制文件的节头来确定二进制文件的哪些节包含代码,哪些节包含数据。仅应使用.text反汇编带有指令的段(例如objdump)。-Dobjdump参数将导致ELF二进制文件的所有段都被反汇编,甚至是非代码段(例如.data.rodata)。
>从手册页:


-D

--disassemble-all

与-d类似,但反汇编所有部分,而不仅仅是期望包含指令的部分。


这意味着即使部分包含硬编码的字符串(.dynstr.shstrtab.rodata等)objdump也会将该数据视为指令并相应地销毁它们。

下面是使用/ bin / date的示例:

/bin/date:     file format elf64-x86-64


Disassembly of section .rodata:

0000000000409400 <.rodata>:
  409400:       01 00                   add    %eax,(%rax)
  409402:       02 00                   add    (%rax),%al
  409404:       74 69                   je     40946f <__sprintf_chk@plt+0x798f>
  409406:       6d                      insl   (%dx),%es:(%rdi)
  409407:       65 20 25 73 20 69 73    and    %ah,%gs:0x73692073(%rip)        # 73a9b481 <stderr+0x7348d131>
  40940e:       20 6f 75                and    %ch,0x75(%rdi)
  409411:       74 20                   je     409433 <__sprintf_chk@plt+0x7953>
  409413:       6f                      outsl  %ds:(%rsi),(%dx)
  409414:       66                      data16
  409415:       20 72 61                and    %dh,0x61(%rdx)
  409418:       6e                      outsb  %ds:(%rsi),(%dx)
  409419:       67 65 00 0a             add    %cl,%gs:(%edx)
  40941d:       52                      push   %rdx
  40941e:       65                      gs
  40941f:       70 6f                   jo     409490 <__sprintf_chk@plt+0x79b0>
  < snip >


实际上是将数据视为代码:

$ readelf -x .rodata /bin/date
Hex dump of section '.rodata':
  0x00409400 01000200 74696d65 20257320 6973206f ....time %s is o
  0x00409410 7574206f 66207261 6e676500 0a526570 ut of range..Rep


此外,参数-b binary导致objdump将二进制文件视为带有单数的blob e部分,消除了二进制文件中代码与数据之间的任何区别,导致二进制文件的全部内容被视为代码。

参考:System V ABI第4部分:“对象文件” />

评论


好的,我应该使用哪种语法仅使用objdump拆卸代码段?

–unseen_rider
17年2月13日在9:34

objdump -d <文件名>。 -d选项仅导致预期包含反汇编代码的部分。

– julian♦
17年2月13日在14:20

实际上,代码段中也可能存在只读字符串,尤其是在嵌入式平台(如ARM或MIPS)上

–伊戈尔·斯科钦斯基♦
17年2月13日在20:37

ARM链接器可以添加特殊符号,如$ d来标记代码段中的数据区域(尽管我认为这些符号主要用于跳转表等),但我不知道objdump是否使用它们。对于一般情况,您的答案很好,您可以在开始时就提到您的假设。

–伊戈尔·斯科钦斯基♦
17年2月13日在22:33

@unseen_rider未剥离的二进制文件的十六进制转储将包括.strtab节的内容。本节包含与二进制文件的符号表(.symtab)中的符号相对应的字符串。这些字符串中将包含函数名称。如果二进制文件是动态链接的,则.dynstr部分也是如此。即使已删除二进制文件,.dynstr节也将出现在动态链接的二进制文件中。

– julian♦
17-2-14在3:18