Instructions and Data are located in separate areas within binaries
>Currently I can get the offsets and assembly code, but not text strings alongside.Code and data are in separate sections of ABI-compliant binaries. Here is a diagram of the how different sections are laid out in ELF binaries:
In other words, sections with instructions will not contain meaningful strings, only intstructions. This can be observed directly when the -s
option for objdump
is used when examining the .text
section of the Linux date
utility:
$ 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 [email protected].@.
401b30 e83bfcff ffbf6194 4000e811 fcffffbf .;....a.@.......
401b40 102c4000 e8877800 00c64424 0f0048c7 .,@...x...D$..H.
< snip >
In ELF binaries, the .text
section holds the executable instructions of the program. The bytes the instructions are composed of are treated as ASCII, so there are meaningless sequences of characters being printed.
Objdump will treat data as inctructions and disassemble accordingly
objdump
relies on an ELF binary's section headers to determine which sections of the binary contain code and which sections contain data. Only sections with instructions (.text
, for example) should be disassembled using objdump
.The -D
argument to objdump
will result in all sections of an ELF binary being disassembled, even non-code sections like .data
and .rodata
.
From the manual page:
-D
--disassemble-all
Like -d, but disassemble the contents of all sections, not just those expected to contain instructions.
This means that even if a section contained hardcoded strings (.dynstr
, .shstrtab
, .rodata
, etc.) objdump
would treat this data as instructions and dissasemble them accordingly.
Here is an example using /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 >
It looks like there are instructions being disassembled, when in reality is data being treated as code:
$ 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
Furthermore, the arguments -b binary
result in objdump
treating the binary as a blob with a single section, obliterating any distinction between code and data within the binary, resulting in the entire contents of the binary being treated as code and is disassembled as such.
Reference: the System V ABI section 4: "Object Files"