흥미로운 질문입니다. 나는 답을 모르기 때문에, 여기에 나와있는 단계가있다.
여기서 파일에서 문자열이 발생 하는가?
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 table은 0x41
이고, 0x57
은 실제로 push %r15
이며이이 AW
인 ASCII
에 해당합니다. 마찬가지로 push %r14
은 0x41
, 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
...
이제 옵 코드의 ASCII
0x4157415641554154...
순서를 명확하게 볼 수 있습니다.
P.P.S.원래 질문은 내 Mach-O bash
및 gzip
에 나타나지만 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
는 나는이 대답에서 실행 파일을 검사에 대해 많은 것을 배웠습니다, 당신의 대답은 폭 넓은 잠재 고객에게 다가 갈 것입니다 바랍니다. – seewalker
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 ;-) –
'echo -n AWAVAUATUSH | rasm2 -B -a x86 -b64 -Df-'는 시퀀스를 매우 편리하게 분해합니다. – ysdx