2016-09-05 3 views
5

이 숫자하지 않은 다른 기호들 중 일부 비슷한 보이는 긴 숫자 일반적으로 마하-O 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의 모든 인스턴스가 파일의 [0x1dc0, 0x10f7a) 오프셋을 포함 .text 섹션 (에있는 것을 알 수있다.

.text이기 때문에, 우리가 거기 실행 지침을 찾을 것으로 기대합니다. 주소 . (파일에 .text의 오프셋 (offset)) 0x1dc0 == 0x4035e0

- 0x401dc0 ( .text 주소) + 0x35e0 (파일에 AWAVAUATUSH의 오프셋)는 우리가 관심

먼저, 위의 연산이 올바른지 확인하자 :

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의 opcode는 무엇입니까? This table0x41이고, 0x57은 실제로 push %r15이며이이 AWASCII에 해당합니다. 마찬가지로 push %r140x41, 0x56으로 인코딩되며, 바로 주문 코드 AV이 발생합니다. 기타

P. 내 gzip 버전은 완전히 제거되었으므로 GDB는 위의 디스 어셈블리에서 심볼을 표시하지 않습니다. 내가 대신 비 제거 버전을 사용하는 경우, 내가 참조 :

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

이제 옵 코드의 ASCII0x4157415641554154... 순서를 명확하게 볼 수 있습니다.

P.P.S.원래 질문은 내 Mach-O bashgzip에 나타나지만 Linux에서는 보이지 않는 AWAVAUATSH에 관한 질문입니다. 반대로 AWAVAUATUSH은 내 Mach-O 바이너리에 나타나지 않습니다.

그러나 대답은 같습니다. 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 -magical-future-where-strings-is-exploitable/# comment-158250 이렇게하면 해결할 수있는 또 다른 방법이 있습니다 : 그냥 Google for ;-) –

+2

'echo -n AWAVAUATUSH | rasm2 -B -a x86 -b64 -Df-'는 시퀀스를 매우 편리하게 분해합니다. – ysdx