2016-09-05 21 views
5

Có vẻ như có một số tương tự tìm chuỗi chữ và số dài mà thường xảy ra trong Mach-O 64 thực thi bit và ELF 64-bit LSB thực thi giữa các biểu tượng khác mà không phải là chữ và số:Ý nghĩa của một chuỗi chung trong thực thi?

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

có 181 kết quả, và

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

có 9 kết quả.

enter image description here

Các chuỗi này là gì?

Trả lời

13

Câu hỏi thú vị. Vì tôi không biết câu trả lời, dưới đây là các bước tôi đã thực hiện để tìm ra câu trả lời:

Xâu xảy ra ở đâu trong chuỗi?

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

Phần nào trong đó?

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. 

Từ trên đầu ra, chúng ta thấy rằng tất cả các trường của AWAVAUATUSH là trong .text phần (trong đó bao gồm [0x1dc0, 0x10f7a) offsets của tập tin.

Do đây là .text, chúng tôi hy vọng để tìm hướng dẫn thực thi ở đó. Địa chỉ chúng ta quan tâm là 0x401dc0 (.text địa chỉ) + 0x35e0 (offset của AWAVAUATUSH trong file) -. 0x1dc0 (offset của .text trong file) == 0x4035e0

Trước tiên, hãy kiểm tra xem số học trên có chính xác không:

gdb -q /bin/gzip 

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

Vâng, đúng vậy. Tiếp theo, các hướng dẫn ở đó là gì?

(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) 

Đây thực sự là các hướng dẫn thực thi bình thường. Opcode của push %r15 là gì? This table cho thấy rằng 0x41, 0x57 thực sự là push %r15 và các mã vạch này chỉ xảy ra để đánh vần AW trong ASCII. Tương tự, push %r14 được mã hóa là 0x41, 0x56, chỉ xảy ra chính tả AV. Vv

P.S. Phiên bản gzip của tôi bị tước hoàn toàn, đó là lý do GDB không hiển thị biểu tượng nào trong phần tháo gỡ ở trên. Thay vào đó, nếu tôi sử dụng phiên bản không bị tước, tôi sẽ thấy:

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 

Vì vậy, chuỗi vẫn ở trong .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 
... 

Bây giờ bạn có thể thấy rõ ASCII0x4157415641554154... chuỗi các opcodes.

P.P.S.Câu hỏi ban đầu hỏi về AWAVAUATSH, xuất hiện trong Mach-O bashgzip, nhưng không xuất hiện trong Linux. Ngược lại, AWAVAUATUSH không xuất hiện trong các tập tin nhị phân Mach-O của tôi.

Câu trả lời là giống nhau. Trình tự AWAVAUATSH tương tự như AWAVAUATUSH, nhưng bị bỏ qua push %rbp.

P.P.P.S Dưới đây là một số khác chuỗi "vui vẻ" cùng tính chất:

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

Tôi muốn câu trả lời của bạn sẽ đạt được một đối tượng rộng, tôi đã học được rất nhiều về việc kiểm tra thực thi từ câu trả lời này. – seewalker

+1

Tìm kiếm của Google cho thấy rằng những người khác biết câu trả lời này: https://plus.google.com/+EmilMikulic/posts/L13sdZNRhL9 và https://www.jwz.org/blog/2014/10/we-live-in-a -magical-future-where-strings-là-exploitable/# comment-158250 vì vậy đó là một cách khác để giải quyết vấn đề này: chỉ cần Google cho nó ;-) –

+2

'echo -n AWAVAUATUSH | rasm2 -B -a x86 -b 64 -Df -' khá tiện lợi khi ngắt chuỗi. – ysdx

Các vấn đề liên quan