sup3ria
01.12.11, 18:19
[Link nur für registrierte und freigeschaltete Mitglieder sichtbar]
Was für ein Algorithmus wurde verwendet?
Der britische Geheimdienst GCHQ hat ein Nachwuchsproblem - deshalb sucht er jetzt Bewerber per Online-Rätsel: Wer kann den kryptischen Code knacken? Mitmachen kann jeder.
[Link nur für registrierte und freigeschaltete Mitglieder sichtbar]
Also, dieser code wird gegeben.
eb 04 af c2 bf a3 81 ec 00 01 00 00 31 c9 88 0c
0c fe c1 75 f9 31 c0 ba ef be ad de 02 04 0c 00
d0 c1 ca 08 8a 1c 0c 8a 3c 04 88 1c 04 88 3c 0c
fe c1 75 e8 e9 5c 00 00 00 89 e3 81 c3 04 00 00
00 5c 58 3d 41 41 41 41 75 43 58 3d 42 42 42 42
75 3b 5a 89 d1 89 e6 89 df 29 cf f3 a4 89 de 89
d1 89 df 29 cf 31 c0 31 db 31 d2 fe c0 02 1c 06
8a 14 06 8a 34 1e 88 34 06 88 14 1e 00 f2 30 f6
8a 1c 16 8a 17 30 da 88 17 47 49 75 de 31 db 89
d8 fe c0 cd 80 90 90 e8 9d ff ff ff 41 41 41 41
Erstmal dachte ich das es Hex wäre, allerdings kommt beim kovertieren nur schrott raus.
Dann habe ich mir noch mal alles etwas genauer angeschaut und bin in der letzten Zeile auf die nops "90 90 " gestoßen, was oft typisch für Shell code in C ist.
Also habe ich den code mit jeweils "\x" angepasst:
\xeb\x04\xaf\xc2\xbf\xa3\x81\xec\x00\x01\x00\x00\x 31\xc9\x88\x0c
\x0c\xfe\xc1\x75\xf9\x31\xc0\xba\xef\xbe\xad\xde\x 02\x04\x0c\x00
\xd0\xc1\xca\x08\x8a\x1c\x0c\x8a\x3c\x04\x88\x1c\x 04\x88\x3c\x0c
\xfe\xc1\x75\xe8\xe9\x5c\x00\x00\x00\x89\xe3\x81\x c3\x04\x00\x00
\x00\x5c\x58\x3d\x41\x41\x41\x41\x75\x43\x48\x3d\x 42\x42\x42\x42
\x75\x3b\x5a\x89\xd1\x89\xe6\x89\xdf\x29\xcf\xf3\x a4\x89\xde\x89
\xd1\x89\xdf\x29\xcf\x31\xc0\x31\xdb\x31\xd2\xfe\x c0\x02\x1c\x06
\x8a\x14\x06\x8a\x34\x1e\x88\x34\x06\x88\x14\x1e\x 00\xf2\x30\xf6
\x8a\x1c\x16\x8a\x17\x30\xda\x88\x17\x47\x49\x75\x de\x31\xdb\x89
\xd8\xfe\xc0\xcd\x80\x90\x90\xe8\x9d\xff\xff\xff\x 41\x41\x41\x41
Dann habe ich mal den Shell code in C ausgeführt:
char shellcode[] = "\xeb\x04\xaf\xc2\xbf\xa3\x81\xec\x00\x01\x00\x00\x 31\xc9\x88\x0c\x0c\xfe\xc1\x75\xf9\x31\xc0\xba\xef \xbe\xad\xde\x02\x04\x0c\x00\xd0\xc1\xca\x08\x8a\x 1c\x0c\x8a\x3c\x04\x88\x1c\x04\x88\x3c\x0c\xfe\xc1 \x75\xe8\xe9\x5c\x00\x00\x00\x89\xe3\x81\xc3\x04\x 00\x00\x00\x5c\x58\x3d\x41\x41\x41\x41\x75\x43\x48 \x3d\x42\x42\x42\x42\x75\x3b\x5a\x89\xd1\x89\xe6\x 89\xdf\x29\xcf\xf3\xa4\x89\xde\x89\xd1\x89\xdf\x29 \xcf\x31\xc0\x31\xdb\x31\xd2\xfe\xc0\x02\x1c\x06\x 8a\x14\x06\x8a\x34\x1e\x88\x34\x06\x88\x14\x1e\x00 \xf2\x30\xf6\x8a\x1c\x16\x8a\x17\x30\xda\x88\x17\x 47\x49\x75\xde\x31\xdb\x89\xd8\xfe\xc0\xcd\x80\x90 \x90\xe8\x9d\xff\xff\xff\x41\x41\x41\x41";
void main() {
int *ret;
ret = (int *)&ret + 2;
(*ret) = (int)shellcode;
printf("fertig");
}
und tatsächlich wurde das "fertig" ( printf("fertig") ) ausgegeben.
Also scheint der Shell code zumindestens valide zu sein.
Nun schaute ich mir den generierten asm code an, um das ganze besser zu verstehen.
0000000000601040 :
601040: eb 04 jmp 601046
601042: af scas %es:(%rdi),%eax
601043: c2 bf a3 retq $0xa3bf
601046: 81 ec 00 01 00 00 sub $0x100,%esp
60104c: 31 c9 xor %ecx,%ecx
60104e: 88 0c 0c mov %cl,(%rsp,%rcx,1)
601051: fe c1 inc %cl
601053: 75 f9 jne 60104e
601055: 31 c0 xor %eax,%eax
601057: ba ef be ad de mov $0xdeadbeef,%edx
60105c: 02 04 0c add (%rsp,%rcx,1),%al
60105f: 00 d0 add %dl,%al
601061: c1 ca 08 ror $0x8,%edx
601064: 8a 1c 0c mov (%rsp,%rcx,1),%bl
601067: 8a 3c 04 mov (%rsp,%rax,1),%bh
60106a: 88 1c 04 mov %bl,(%rsp,%rax,1)
60106d: 88 3c 0c mov %bh,(%rsp,%rcx,1)
601070: fe c1 inc %cl
601072: 75 e8 jne 60105c
601074: e9 5c 00 00 00 jmpq 6010d5
601079: 89 e3 mov %esp,%ebx
60107b: 81 c3 04 00 00 00 add $0x4,%ebx
601081: 5c pop %rsp
601082: 58 pop %rax
601083: 3d 41 41 41 41 cmp $0x41414141,%eax
601088: 75 43 jne 6010cd
60108a: 48 3d 42 42 42 42 cmp $0x42424242,%rax
601090: 75 3b jne 6010cd
601092: 5a pop %rdx
601093: 89 d1 mov %edx,%ecx
601095: 89 e6 mov %esp,%esi
601097: 89 df mov %ebx,%edi
601099: 29 cf sub %ecx,%edi
60109b: f3 a4 rep movsb %ds:(%rsi),%es:(%rdi)
60109d: 89 de mov %ebx,%esi
60109f: 89 d1 mov %edx,%ecx
6010a1: 89 df mov %ebx,%edi
6010a3: 29 cf sub %ecx,%edi
6010a5: 31 c0 xor %eax,%eax
6010a7: 31 db xor %ebx,%ebx
6010a9: 31 d2 xor %edx,%edx
6010ab: fe c0 inc %al
6010ad: 02 1c 06 add (%rsi,%rax,1),%bl
6010b0: 8a 14 06 mov (%rsi,%rax,1),%dl
6010b3: 8a 34 1e mov (%rsi,%rbx,1),%dh
6010b6: 88 34 06 mov %dh,(%rsi,%rax,1)
6010b9: 88 14 1e mov %dl,(%rsi,%rbx,1)
6010bc: 00 f2 add %dh,%dl
6010be: 30 f6 xor %dh,%dh
6010c0: 8a 1c 16 mov (%rsi,%rdx,1),%bl
6010c3: 8a 17 mov (%rdi),%dl
6010c5: 30 da xor %bl,%dl
6010c7: 88 17 mov %dl,(%rdi)
6010c9: 47 rex.RXB
6010ca: 49 75 de rex.WB jne 6010ab
6010cd: 31 db xor %ebx,%ebx
6010cf: 89 d8 mov %ebx,%eax
6010d1: fe c0 inc %al
6010d3: cd 80 int $0x80
6010d5: 90 nop
6010d6: 90 nop
6010d7: e8 9d ff ff ff callq 601079
6010dc: 41 rex.B
6010dd: 41 rex.B
6010de: 41 rex.B
6010df: 41 00 00 add %al,(%r8)
Dann dachte ich mir "Das sieht doch schon mal gut aus", vorallem wegen die quasi strings 0xdeadbee.
hier zu finden: 601057: ba ef be ad de mov $0xdeadbeef,%edx
So, jetzt habe ich noch ein "break printf" zu der printf("fertig"); Zeile hinzugefügt und das ganze in dem GDB: The GNU Project Debugger ausgeführt.
Da ich doch recht motiviert war habe ich mich ewig durch den stack frame gearbeitet um die strings zu finden und habe sie letztendlich gefunden.
Alle strings waren multi-byte also UTF-8, UTF-7, Shift-JIS, Big5 und so.
Also war ich definitiv auf dem richtigen Weg.
Doch war ich nicht in der Lage irgend ein string zu dechiffrieren.
FUCK!
Kommt irgend Jemand weiter?
Was für ein Algorithmus wurde verwendet?
Der britische Geheimdienst GCHQ hat ein Nachwuchsproblem - deshalb sucht er jetzt Bewerber per Online-Rätsel: Wer kann den kryptischen Code knacken? Mitmachen kann jeder.
[Link nur für registrierte und freigeschaltete Mitglieder sichtbar]
Also, dieser code wird gegeben.
eb 04 af c2 bf a3 81 ec 00 01 00 00 31 c9 88 0c
0c fe c1 75 f9 31 c0 ba ef be ad de 02 04 0c 00
d0 c1 ca 08 8a 1c 0c 8a 3c 04 88 1c 04 88 3c 0c
fe c1 75 e8 e9 5c 00 00 00 89 e3 81 c3 04 00 00
00 5c 58 3d 41 41 41 41 75 43 58 3d 42 42 42 42
75 3b 5a 89 d1 89 e6 89 df 29 cf f3 a4 89 de 89
d1 89 df 29 cf 31 c0 31 db 31 d2 fe c0 02 1c 06
8a 14 06 8a 34 1e 88 34 06 88 14 1e 00 f2 30 f6
8a 1c 16 8a 17 30 da 88 17 47 49 75 de 31 db 89
d8 fe c0 cd 80 90 90 e8 9d ff ff ff 41 41 41 41
Erstmal dachte ich das es Hex wäre, allerdings kommt beim kovertieren nur schrott raus.
Dann habe ich mir noch mal alles etwas genauer angeschaut und bin in der letzten Zeile auf die nops "90 90 " gestoßen, was oft typisch für Shell code in C ist.
Also habe ich den code mit jeweils "\x" angepasst:
\xeb\x04\xaf\xc2\xbf\xa3\x81\xec\x00\x01\x00\x00\x 31\xc9\x88\x0c
\x0c\xfe\xc1\x75\xf9\x31\xc0\xba\xef\xbe\xad\xde\x 02\x04\x0c\x00
\xd0\xc1\xca\x08\x8a\x1c\x0c\x8a\x3c\x04\x88\x1c\x 04\x88\x3c\x0c
\xfe\xc1\x75\xe8\xe9\x5c\x00\x00\x00\x89\xe3\x81\x c3\x04\x00\x00
\x00\x5c\x58\x3d\x41\x41\x41\x41\x75\x43\x48\x3d\x 42\x42\x42\x42
\x75\x3b\x5a\x89\xd1\x89\xe6\x89\xdf\x29\xcf\xf3\x a4\x89\xde\x89
\xd1\x89\xdf\x29\xcf\x31\xc0\x31\xdb\x31\xd2\xfe\x c0\x02\x1c\x06
\x8a\x14\x06\x8a\x34\x1e\x88\x34\x06\x88\x14\x1e\x 00\xf2\x30\xf6
\x8a\x1c\x16\x8a\x17\x30\xda\x88\x17\x47\x49\x75\x de\x31\xdb\x89
\xd8\xfe\xc0\xcd\x80\x90\x90\xe8\x9d\xff\xff\xff\x 41\x41\x41\x41
Dann habe ich mal den Shell code in C ausgeführt:
char shellcode[] = "\xeb\x04\xaf\xc2\xbf\xa3\x81\xec\x00\x01\x00\x00\x 31\xc9\x88\x0c\x0c\xfe\xc1\x75\xf9\x31\xc0\xba\xef \xbe\xad\xde\x02\x04\x0c\x00\xd0\xc1\xca\x08\x8a\x 1c\x0c\x8a\x3c\x04\x88\x1c\x04\x88\x3c\x0c\xfe\xc1 \x75\xe8\xe9\x5c\x00\x00\x00\x89\xe3\x81\xc3\x04\x 00\x00\x00\x5c\x58\x3d\x41\x41\x41\x41\x75\x43\x48 \x3d\x42\x42\x42\x42\x75\x3b\x5a\x89\xd1\x89\xe6\x 89\xdf\x29\xcf\xf3\xa4\x89\xde\x89\xd1\x89\xdf\x29 \xcf\x31\xc0\x31\xdb\x31\xd2\xfe\xc0\x02\x1c\x06\x 8a\x14\x06\x8a\x34\x1e\x88\x34\x06\x88\x14\x1e\x00 \xf2\x30\xf6\x8a\x1c\x16\x8a\x17\x30\xda\x88\x17\x 47\x49\x75\xde\x31\xdb\x89\xd8\xfe\xc0\xcd\x80\x90 \x90\xe8\x9d\xff\xff\xff\x41\x41\x41\x41";
void main() {
int *ret;
ret = (int *)&ret + 2;
(*ret) = (int)shellcode;
printf("fertig");
}
und tatsächlich wurde das "fertig" ( printf("fertig") ) ausgegeben.
Also scheint der Shell code zumindestens valide zu sein.
Nun schaute ich mir den generierten asm code an, um das ganze besser zu verstehen.
0000000000601040 :
601040: eb 04 jmp 601046
601042: af scas %es:(%rdi),%eax
601043: c2 bf a3 retq $0xa3bf
601046: 81 ec 00 01 00 00 sub $0x100,%esp
60104c: 31 c9 xor %ecx,%ecx
60104e: 88 0c 0c mov %cl,(%rsp,%rcx,1)
601051: fe c1 inc %cl
601053: 75 f9 jne 60104e
601055: 31 c0 xor %eax,%eax
601057: ba ef be ad de mov $0xdeadbeef,%edx
60105c: 02 04 0c add (%rsp,%rcx,1),%al
60105f: 00 d0 add %dl,%al
601061: c1 ca 08 ror $0x8,%edx
601064: 8a 1c 0c mov (%rsp,%rcx,1),%bl
601067: 8a 3c 04 mov (%rsp,%rax,1),%bh
60106a: 88 1c 04 mov %bl,(%rsp,%rax,1)
60106d: 88 3c 0c mov %bh,(%rsp,%rcx,1)
601070: fe c1 inc %cl
601072: 75 e8 jne 60105c
601074: e9 5c 00 00 00 jmpq 6010d5
601079: 89 e3 mov %esp,%ebx
60107b: 81 c3 04 00 00 00 add $0x4,%ebx
601081: 5c pop %rsp
601082: 58 pop %rax
601083: 3d 41 41 41 41 cmp $0x41414141,%eax
601088: 75 43 jne 6010cd
60108a: 48 3d 42 42 42 42 cmp $0x42424242,%rax
601090: 75 3b jne 6010cd
601092: 5a pop %rdx
601093: 89 d1 mov %edx,%ecx
601095: 89 e6 mov %esp,%esi
601097: 89 df mov %ebx,%edi
601099: 29 cf sub %ecx,%edi
60109b: f3 a4 rep movsb %ds:(%rsi),%es:(%rdi)
60109d: 89 de mov %ebx,%esi
60109f: 89 d1 mov %edx,%ecx
6010a1: 89 df mov %ebx,%edi
6010a3: 29 cf sub %ecx,%edi
6010a5: 31 c0 xor %eax,%eax
6010a7: 31 db xor %ebx,%ebx
6010a9: 31 d2 xor %edx,%edx
6010ab: fe c0 inc %al
6010ad: 02 1c 06 add (%rsi,%rax,1),%bl
6010b0: 8a 14 06 mov (%rsi,%rax,1),%dl
6010b3: 8a 34 1e mov (%rsi,%rbx,1),%dh
6010b6: 88 34 06 mov %dh,(%rsi,%rax,1)
6010b9: 88 14 1e mov %dl,(%rsi,%rbx,1)
6010bc: 00 f2 add %dh,%dl
6010be: 30 f6 xor %dh,%dh
6010c0: 8a 1c 16 mov (%rsi,%rdx,1),%bl
6010c3: 8a 17 mov (%rdi),%dl
6010c5: 30 da xor %bl,%dl
6010c7: 88 17 mov %dl,(%rdi)
6010c9: 47 rex.RXB
6010ca: 49 75 de rex.WB jne 6010ab
6010cd: 31 db xor %ebx,%ebx
6010cf: 89 d8 mov %ebx,%eax
6010d1: fe c0 inc %al
6010d3: cd 80 int $0x80
6010d5: 90 nop
6010d6: 90 nop
6010d7: e8 9d ff ff ff callq 601079
6010dc: 41 rex.B
6010dd: 41 rex.B
6010de: 41 rex.B
6010df: 41 00 00 add %al,(%r8)
Dann dachte ich mir "Das sieht doch schon mal gut aus", vorallem wegen die quasi strings 0xdeadbee.
hier zu finden: 601057: ba ef be ad de mov $0xdeadbeef,%edx
So, jetzt habe ich noch ein "break printf" zu der printf("fertig"); Zeile hinzugefügt und das ganze in dem GDB: The GNU Project Debugger ausgeführt.
Da ich doch recht motiviert war habe ich mich ewig durch den stack frame gearbeitet um die strings zu finden und habe sie letztendlich gefunden.
Alle strings waren multi-byte also UTF-8, UTF-7, Shift-JIS, Big5 und so.
Also war ich definitiv auf dem richtigen Weg.
Doch war ich nicht in der Lage irgend ein string zu dechiffrieren.
FUCK!
Kommt irgend Jemand weiter?