可执行文件中常见字符串的含义?

时间:2016-09-05 00:13:07

标签: macos executable elf binary-data mach

似乎有一些类似的长字母数字字符串,通常出现在Mach-O 64位可执行文件和ELF 64位LSB可执行文件以及其他不是字母数字的符号中:

cat /bin/bash | grep -c "AWAVAUATSH"

有181个结果,

cat /usr/bin/gzip | grep -c "AWAVAUATSH"

有9个结果。

enter image description here

这些字符串是什么?

1 个答案:

答案 0 :(得分:23)

有趣的问题。由于我不知道答案,以下是我采取的步骤:

文件中的字符串出现在哪里?

strings -otx /bin/gzip | grep AWAVAUATUSH
   35e0 AWAVAUATUSH
   69a0 AWAVAUATUSH
   7920 AWAVAUATUSH
   8900 AWAVAUATUSH
   92a0 AWAVAUATUSH

在哪个部分?

readelf -WS /bin/gzip

There are 28 section headers, starting at offset 0x16860:

Section Headers:
  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
  [ 1] .interp           PROGBITS        0000000000400238 000238 00001c 00   A  0   0  1
  [ 2] .note.ABI-tag     NOTE            0000000000400254 000254 000020 00   A  0   0  4
  [ 3] .note.gnu.build-id NOTE            0000000000400274 000274 000024 00   A  0   0  4
  [ 4] .gnu.hash         GNU_HASH        0000000000400298 000298 000038 00   A  5   0  8
  [ 5] .dynsym           DYNSYM          00000000004002d0 0002d0 000870 18   A  6   1  8
  [ 6] .dynstr           STRTAB          0000000000400b40 000b40 000360 00   A  0   0  1
  [ 7] .gnu.version      VERSYM          0000000000400ea0 000ea0 0000b4 02   A  5   0  2
  [ 8] .gnu.version_r    VERNEED         0000000000400f58 000f58 000080 00   A  6   1  8
  [ 9] .rela.dyn         RELA            0000000000400fd8 000fd8 000090 18   A  5   0  8
  [10] .rela.plt         RELA            0000000000401068 001068 0007e0 18   A  5  12  8
  [11] .init             PROGBITS        0000000000401848 001848 00001a 00  AX  0   0  4
  [12] .plt              PROGBITS        0000000000401870 001870 000550 10  AX  0   0 16
  [13] .text             PROGBITS        0000000000401dc0 001dc0 00f1ba 00  AX  0   0 16
  [14] .fini             PROGBITS        0000000000410f7c 010f7c 000009 00  AX  0   0  4
... etc.

从上面的输出中,我们看到AWAVAUATUSH的所有实例都在.text部分(其中包含[0x1dc0, 0x10f7a)文件的偏移量。

由于这是.text,我们希望在那里找到可执行指令。我们感兴趣的地址是0x401dc0.text地址)+ 0x35e0(文件中AWAVAUATUSH的偏移量) - 0x1dc0({{1}的偏移量在文件中)== .text

首先,让我们检查上面的算法是否正确:

0x4035e0

是的,确实如此。接下来,那里有什么指示?

gdb -q /bin/gzip

(gdb) x/s 0x4035e0
0x4035e0:       "AWAVAUATUSH\203\354HdH\213\004%("

这些确实看起来像普通的可执行指令。 (gdb) x/20i 0x4035e0 0x4035e0: push %r15 0x4035e2: push %r14 0x4035e4: push %r13 0x4035e6: push %r12 0x4035e8: push %rbp 0x4035e9: push %rbx 0x4035ea: sub $0x48,%rsp 0x4035ee: mov %fs:0x28,%rax 0x4035f7: mov %rax,0x38(%rsp) 0x4035fc: xor %eax,%eax 0x4035fe: mov 0x213363(%rip),%rax # 0x616968 0x403605: mov %rdi,(%rsp) 0x403609: mov %rax,0x212cf0(%rip) # 0x616300 0x403610: cmpb $0x7a,(%rax) 0x403613: je 0x403730 0x403619: mov $0x616300,%ebx 0x40361e: mov (%rsp),%rdi 0x403622: callq 0x4019f0 <strlen@plt> 0x403627: cmp $0x20,%eax 0x40362a: mov %rax,0x8(%rsp) 的操作码是什么? This table表明push %r150x41确实是0x57,这些操作码只是发生push %r15拼写AW }。同样,ASCII编码为push %r140x41,只会发生拼写0x56。等

P.S。我的gzip版本被完全剥离,这就是为什么GDB在上面的反汇编中没有显示符号的原因。如果我使用非剥离版本,我会看到:

AV

因此字符串仍然在strings -o -tx gzip | grep AWAVAUATUSH | head -1 6be0 AWAVAUATUSH readelf -WS gzip | grep text [13] .text PROGBITS 0000000000401b00 001b00 00d102 00 AX 0 0 16

.text

现在,您可以清楚地看到gdb -q ./gzip (gdb) p/a 0x0000000000401b00 + 0x6be0 - 0x001b00 $1 = 0x406be0 <inflate_dynamic> (gdb) disas/r 0x406be0 Dump of assembler code for function inflate_dynamic: 0x0000000000406be0 <+0>: 41 57 push %r15 0x0000000000406be2 <+2>: 41 56 push %r14 0x0000000000406be4 <+4>: 41 55 push %r13 0x0000000000406be6 <+6>: 41 54 push %r12 0x0000000000406be8 <+8>: 55 push %rbp 0x0000000000406be9 <+9>: 53 push %rbx 0x0000000000406bea <+10>: 48 81 ec 38 05 00 00 sub $0x538,%rsp ... ASCII操作码序列。

P.P.S。原始问题询问0x4157415641554154...,它确实出现在我的Mach-O AWAVAUATSHbash中,但不出现在Linux中。相反,gzip没有出现在我的Mach-O二进制文件中。

但答案是一样的。 AWAVAUATUSH序列与AWAVAUATSH相同,但省略AWAVAUATUSH

P.P.P.S以下是其他一些性质相同的“有趣”字符串:

push %rbp