PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : can you crack it?


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?

c3bob
01.12.11, 18:37
hollywood filme sind also garnichtmal so realitätsfern :D


Ist alles gaaaaaanz easy!

Hier ist ma level 2:
[Link nur für registrierte und freigeschaltete Mitglieder sichtbar]

Wenn ihr dann level2 geschafft habt kommt ihr hierher:
[Link nur für registrierte und freigeschaltete Mitglieder sichtbar]

Dr. Sp!c
01.12.11, 19:03
Hexdezimal... aber bin zu faul um das einzutippen um weiter zu kommen...

Know v2.0
01.12.11, 19:05
Was ist jetzt der "Text or what ever", der aus dem "gecrypteten-zeugs" rauskommt..

Würde mich mal interessieren ^^ Kein bock das einzutippen :D

c3bob
01.12.11, 19:07
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

naja das sieht kacke aus... hier mal die pastebin [Link nur für registrierte und freigeschaltete Mitglieder sichtbar]

dr. Sp!c hier hatte ihn noch in meiner .TEXT

sup3ria
01.12.11, 19:26
Was muss man genau bei [Link nur für registrierte und freigeschaltete Mitglieder sichtbar] machen?

Dr. Sp!c
01.12.11, 19:34
[Link nur für registrierte und freigeschaltete Mitglieder sichtbar]

Wohl doch nicht lach
Aber danke c3bob

sup3ria
01.12.11, 19:36
hollywood filme sind also garnichtmal so realitätsfern :D


Ist alles gaaaaaanz easy!

Hier ist ma level 2:
[Link nur für registrierte und freigeschaltete Mitglieder sichtbar]

Wenn ihr dann level2 geschafft habt kommt ihr hierher:
[Link nur für registrierte und freigeschaltete Mitglieder sichtbar]
Genau das findet man übrigens wenn man in google danach sucht.
Ich bezweifle stark das du es tatsächlich selber gelöst hast.
Falls ja ,bitte Methode erklären ;denn es ist tatsächlich etwas komplexer als einfach Hex zu Ascii zu Konvertieren.

sup3ria
02.12.11, 16:03
puuushh.....der Weg war richtig ! Ich hatte nur probleme den decrypteten stirng aus der memory auszulesen...

PW ist : Pr0t3ct!on#cyber_security@12*12.2011+