दिलचस्प सवाल। चूंकि मुझे जवाब नहीं पता था, यहां दिए गए कदम हैं जिन्हें मैंने समझने के लिए लिया है:
फ़ाइल में स्ट्रिंग कहां होती है?
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 %r14
0x41
, 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 के ASCII
0x4157415641554154...
अनुक्रम देख सकते हैं।
पी.पी.एस.मूल प्रश्न 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
काश आपका जवाब एक व्यापक दर्शकों तक पहुंच जाएगा, मैं इस सवाल का जवाब से निष्पादनयोग्य की जांच के बारे में बहुत कुछ सीखा। – seewalker
Google खोज से पता चलता है कि दूसरों को यह उत्तर पता था: https://plus.google.com/+EmilMikulic/posts/L13sdZNRhL9 और https://www.jwz.org/blog/2014/10/we-live-in-a -मैजिकल-भविष्य-जहां-स्ट्रिंग्स-शोषक/# टिप्पणी -158250 है, इसलिए इसे हल करने का एक और तरीका है: इसके लिए केवल Google ;-) –
'echo -n AWAVAUATUSH | rasm2 -B -a x86 -b 64 -Df -' काफी आसानी से अनुक्रम को अलग करता है। – ysdx