2016-09-05 4 views
5

कुछ समान दिखने वाले लंबे अक्षरांकीय तार जो सामान्य मच-ओ 64 बिट निष्पादनयोग्य में होते हैं और ELF 64-बिट LSB अन्य प्रतीक है कि अक्षरांकीय नहीं हैं के बीच निष्पादनयोग्य प्रतीत:निष्पादन योग्य में एक आम स्ट्रिंग का अर्थ?

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

है 181 परिणाम है, और

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

में 9 परिणाम हैं।

enter image description here

इन तार क्या हैं?

उत्तर

13

दिलचस्प सवाल। चूंकि मुझे जवाब नहीं पता था, यहां दिए गए कदम हैं जिन्हें मैंने समझने के लिए लिया है:

फ़ाइल में स्ट्रिंग कहां होती है?

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 (फ़ाइल में .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 <[email protected]> 
    0x403627: cmp $0x20,%eax 
    0x40362a: mov %rax,0x8(%rsp) 

ये वास्तव में सामान्य निष्पादन योग्य निर्देशों की तरह दिखते हैं। push %r15 का ऑपोड क्या है? This table पता चलता है कि 0x41, 0x57 वास्तव में push %r15 है, और इन opcodes सिर्फ हो ASCII में AW वर्तनी। इसी तरह, push %r140x41, 0x56 के रूप में एन्कोड किया गया है, जो केवल AV वर्तनी होता है। आदि

पीएस जीजीआईपी का मेरा संस्करण पूरी तरह से छीन लिया गया है, यही कारण है कि जीडीबी उपरोक्त disassembly में कोई प्रतीक नहीं दिखाता है। अगर मैं बजाय एक गैर छीन संस्करण का उपयोग, मैं देख रहा हूँ:

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 
... 

अब आप स्पष्ट रूप से opcodes के ASCII0x4157415641554154... अनुक्रम देख सकते हैं।

पी.पी.एस.मूल प्रश्न AWAVAUATSH के बारे में पूछता है, जो मेरे मैक-ओ bash और gzip में दिखाई देता है, लेकिन लिनक्स में नहीं। इसके विपरीत, AWAVAUATUSH मेरी माच-ओ बाइनरी में प्रकट नहीं होता है।

उत्तर हालांकि वही है। AWAVAUATSH अनुक्रम AWAVAUATUSH जैसा ही है, लेकिन push %rbp के साथ छोड़ा गया है।

P.P.P.S यहाँ एक ही प्रकृति के कुछ अन्य "मजा" तार कर रहे हैं:

strings /bin/bash | grep '^A.A.A.' | sort | uniq -c | sort -nr | head 
    44 AWAVAUATUSH 
    27 AVAUATUSH 
    16 AWAVAUA 
    15 AVAUATUH 
    14 AWAVAUI 
    14 AWAVAUATUH 
    12 AWAVAUATI 
     8 AWAVAUE1 
     8 AVAUATI 
     6 AWAVAUATU 
+1

काश आपका जवाब एक व्यापक दर्शकों तक पहुंच जाएगा, मैं इस सवाल का जवाब से निष्पादनयोग्य की जांच के बारे में बहुत कुछ सीखा। – seewalker

+1

Google खोज से पता चलता है कि दूसरों को यह उत्तर पता था: https://plus.google.com/+EmilMikulic/posts/L13sdZNRhL9 और https://www.jwz.org/blog/2014/10/we-live-in-a -मैजिकल-भविष्य-जहां-स्ट्रिंग्स-शोषक/# टिप्पणी -158250 है, इसलिए इसे हल करने का एक और तरीका है: इसके लिए केवल Google ;-) –

+2

'echo -n AWAVAUATUSH | rasm2 -B -a x86 -b 64 -Df -' काफी आसानी से अनुक्रम को अलग करता है। – ysdx

संबंधित मुद्दे