目前我可以获取偏移量和汇编代码,但不能获取文本字符串。
我使用了以下内容:
objdump -D -b binary -mi386 -Maddr16,data16 <filename>
我是否需要使用
-s
开关?#1 楼
这里假设正在分析Linux ELF32二进制文件。代码和数据(例如字符串)存储在ELF二进制文件的不同部分中。
要拆卸包含代码的零件,请使用
objdump -dj .text <binary_name>
。要检查硬编码的字符串数据,请使用
readelf -x .rodata <binary_name>
说明和数据位于ELF二进制文件中的单独区域中。
当前,我可以获取偏移量和汇编代码,但不能获取文本字符串。
代码x86或x86-64 ELF二进制文件中没有混合硬编码字符串。当编译器工具链生成二进制文件时,硬编码的字符串与可执行代码位于二进制文件的单独区域中,并通过其虚拟内存地址进行引用/访问。这是Ange Albertini的图表,说明了ELF二进制文件中各个部分的布局方式:
为了使这一点更加清楚,下面是Linux实用程序
ls
,cat
,mkdir
的可视化和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
)。-D
的objdump
参数将导致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
评论
您是否正在分析来自符合特定ABI或格式(ELF,COFF,MACHO等)的二进制文件中的数据?您将需要像IDA这样的工具来自动确定二进制文件中的数据和代码。
我目前无法使用IDA。我正在寻找手动方法或普通Linux发行版附带的方法。
iirc dion mendel在旧的honeynet sotm逆转挑战中使用的一些py脚本使用了objdump并可以美化死列表,这里是一个tut的链接,该tut使它们适应于分析简单的二进制文件,以查看是否有帮助(内容概念和可行的假设很旧,因此您可能需要在附近装满盐的投手)reversing.be/article.php?story=2005030218170966
@blabb您在上一条评论中链接的网站已被Firefox列入黑名单。您知道其他任何页面吗?