http://canyoucrackit.co.ukの解答
で出題されていた問題の解答。サイトには書かれていなかったけど、出題者は英国諜報機関。
クラックできたらスパイとして採用――英諜報機関 - ITmedia ニュース
Stage 1
問題: http://canyoucrackit.co.uk/images/cyber.png
書かれている16進数をテキストにおこす。
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
>file stage1.bin stage1.bin: DOS executable (COM)
00000000 EB04 jmp short 0x6 00000002 AF scasd 00000003 C2BFA3 ret 0xa3bf 00000006 81EC00010000 sub esp,0x100 0000000C 31C9 xor ecx,ecx 0000000E 880C0C mov [esp+ecx],cl 00000011 FEC1 inc cl 00000013 75F9 jnz 0xe 00000015 31C0 xor eax,eax 00000017 BAEFBEADDE mov edx,0xdeadbeef 0000001C 02040C add al,[esp+ecx] 0000001F 00D0 add al,dl 00000021 C1CA08 ror edx,0x8 00000024 8A1C0C mov bl,[esp+ecx] 00000027 8A3C04 mov bh,[esp+eax] 0000002A 881C04 mov [esp+eax],bl 0000002D 883C0C mov [esp+ecx],bh 00000030 FEC1 inc cl 00000032 75E8 jnz 0x1c 00000034 E95C000000 jmp dword 0x95 00000039 89E3 mov ebx,esp 0000003B 81C304000000 add ebx,0x4 00000041 5C pop esp 00000042 58 pop eax 00000043 3D41414141 cmp eax,0x41414141 00000048 7543 jnz 0x8d 0000004A 58 pop eax 0000004B 3D42424242 cmp eax,0x42424242 00000050 753B jnz 0x8d 00000052 5A pop edx 00000053 89D1 mov ecx,edx 00000055 89E6 mov esi,esp 00000057 89DF mov edi,ebx 00000059 29CF sub edi,ecx 0000005B F3A4 rep movsb 0000005D 89DE mov esi,ebx 0000005F 89D1 mov ecx,edx 00000061 89DF mov edi,ebx 00000063 29CF sub edi,ecx 00000065 31C0 xor eax,eax 00000067 31DB xor ebx,ebx 00000069 31D2 xor edx,edx 0000006B FEC0 inc al 0000006D 021C06 add bl,[esi+eax] 00000070 8A1406 mov dl,[esi+eax] 00000073 8A341E mov dh,[esi+ebx] 00000076 883406 mov [esi+eax],dh 00000079 88141E mov [esi+ebx],dl 0000007C 00F2 add dl,dh 0000007E 30F6 xor dh,dh 00000080 8A1C16 mov bl,[esi+edx] 00000083 8A17 mov dl,[edi] 00000085 30DA xor dl,bl 00000087 8817 mov [edi],dl 00000089 47 inc edi 0000008A 49 dec ecx 0000008B 75DE jnz 0x6b 0000008D 31DB xor ebx,ebx 0000008F 89D8 mov eax,ebx 00000091 FEC0 inc al 00000093 CD80 int 0x80 00000095 90 nop 00000096 90 nop 00000097 E89DFFFFFF call dword 0x39 0000009C 41 inc ecx 0000009D 41 inc ecx 0000009E 41 inc ecx 0000009F 41 inc ecx
実際に実行してみると、これだけでは足りないことがわかる。画像ファイルのコメントに、次のコメントがある。
QkJCQjIAAACR2PFtcCA6q2eaC8SR+8dmD/zNzLQC+td3tFQ4qx8O447TDeuZw5P+0SsbEcYR 78jKLw==
Base64で復号して↑のコードの後ろに付けると、最後まで実行できる。実行前のスタックの周辺を実行後に見てみると、
GET /15b436de1f9107f3778aad525e5d0b20.js HTTP/1.1
という文字列がある。
Stage 2
問題: http://canyoucrackit.co.uk/15b436de1f9107f3778aad525e5d0b20.js
仕様に従って、仮想マシンを書く問題。実行後のメモリの中に答えがある。Javascriptで書かなくても良い、↓のプログラムはPython。
ip = 0 r = [0,0,0,0,0,16] fl = 0 mem = [ 0x31, 0x04, 0x33, 0xaa, 0x40, 0x02, 0x80, 0x03, 0x52, 0x00, 0x72, 0x01, 0x73, 0x01, 0xb2, 0x50, 0x30, 0x14, 0xc0, 0x01, 0x80, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0xab, 0xd9, 0xa1, 0x9f, 0xa7, 0x83, 0x83, 0xf2, 0xb1, 0x34, 0xb6, 0xe4, 0xb7, 0xca, 0xb8, 0xc9, 0xb8, 0x0e, 0xbd, 0x7d, 0x0f, 0xc0, 0xf1, 0xd9, 0x03, 0xc5, 0x3a, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xa9, 0xcd, 0xdf, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x26, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7d, 0x1f, 0x15, 0x60, 0x4d, 0x4d, 0x52, 0x7d, 0x0e, 0x27, 0x6d, 0x10, 0x6d, 0x5a, 0x06, 0x56, 0x47, 0x14, 0x42, 0x0e, 0xb6, 0xb2, 0xb2, 0xe6, 0xeb, 0xb4, 0x83, 0x8e, 0xd7, 0xe5, 0xd4, 0xd9, 0xc3, 0xf0, 0x80, 0x95, 0xf1, 0x82, 0x82, 0x9a, 0xbd, 0x95, 0xa4, 0x8d, 0x9a, 0x2b, 0x30, 0x69, 0x4a, 0x69, 0x65, 0x55, 0x1c, 0x7b, 0x69, 0x1c, 0x6e, 0x04, 0x74, 0x35, 0x21, 0x26, 0x2f, 0x60, 0x03, 0x4e, 0x37, 0x1e, 0x33, 0x54, 0x39, 0xe6, 0xba, 0xb4, 0xa2, 0xad, 0xa4, 0xc5, 0x95, 0xc8, 0xc1, 0xe4, 0x8a, 0xec, 0xe7, 0x92, 0x8b, 0xe8, 0x81, 0xf0, 0xad, 0x98, 0xa4, 0xd0, 0xc0, 0x8d, 0xac, 0x22, 0x52, 0x65, 0x7e, 0x27, 0x2b, 0x5a, 0x12, 0x61, 0x0a, 0x01, 0x7a, 0x6b, 0x1d, 0x67, 0x75, 0x70, 0x6c, 0x1b, 0x11, 0x25, 0x25, 0x70, 0x7f, 0x7e, 0x67, 0x63, 0x30, 0x3c, 0x6d, 0x6a, 0x01, 0x51, 0x59, 0x5f, 0x56, 0x13, 0x10, 0x43, 0x19, 0x18, 0xe5, 0xe0, 0xbe, 0xbf, 0xbd, 0xe9, 0xf0, 0xf1, 0xf9, 0xfa, 0xab, 0x8f, 0xc1, 0xdf, 0xcf, 0x8d, 0xf8, 0xe7, 0xe2, 0xe9, 0x93, 0x8e, 0xec, 0xf5, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x7a, 0x07, 0x11, 0x1f, 0x1d, 0x68, 0x25, 0x32, 0x77, 0x1e, 0x62, 0x23, 0x5b, 0x47, 0x55, 0x53, 0x30, 0x11, 0x42, 0xf6, 0xf1, 0xb1, 0xe6, 0xc3, 0xcc, 0xf8, 0xc5, 0xe4, 0xcc, 0xc0, 0xd3, 0x85, 0xfd, 0x9a, 0xe3, 0xe6, 0x81, 0xb5, 0xbb, 0xd7, 0xcd, 0x87, 0xa3, 0xd3, 0x6b, 0x36, 0x6f, 0x6f, 0x66, 0x55, 0x30, 0x16, 0x45, 0x5e, 0x09, 0x74, 0x5c, 0x3f, 0x29, 0x2b, 0x66, 0x3d, 0x0d, 0x02, 0x30, 0x28, 0x35, 0x15, 0x09, 0x15, 0xdd, 0xec, 0xb8, 0xe2, 0xfb, 0xd8, 0xcb, 0xd8, 0xd1, 0x8b, 0xd5, 0x82, 0xd9, 0x9a, 0xf1, 0x92, 0xab, 0xe8, 0xa6, 0xd6, 0xd0, 0x8c, 0xaa, 0xd2, 0x94, 0xcf, 0x45, 0x46, 0x67, 0x20, 0x7d, 0x44, 0x14, 0x6b, 0x45, 0x6d, 0x54, 0x03, 0x17, 0x60, 0x62, 0x55, 0x5a, 0x4a, 0x66, 0x61, 0x11, 0x57, 0x68, 0x75, 0x05, 0x62, 0x36, 0x7d, 0x02, 0x10, 0x4b, 0x08, 0x22, 0x42, 0x32, 0xba, 0xe2, 0xb9, 0xe2, 0xd6, 0xb9, 0xff, 0xc3, 0xe9, 0x8a, 0x8f, 0xc1, 0x8f, 0xe1, 0xb8, 0xa4, 0x96, 0xf1, 0x8f, 0x81, 0xb1, 0x8d, 0x89, 0xcc, 0xd4, 0x78, 0x76, 0x61, 0x72, 0x3e, 0x37, 0x23, 0x56, 0x73, 0x71, 0x79, 0x63, 0x7c, 0x08, 0x11, 0x20, 0x69, 0x7a, 0x14, 0x68, 0x05, 0x21, 0x1e, 0x32, 0x27, 0x59, 0xb7, 0xcf, 0xab, 0xdd, 0xd5, 0xcc, 0x97, 0x93, 0xf2, 0xe7, 0xc0, 0xeb, 0xff, 0xe9, 0xa3, 0xbf, 0xa1, 0xab, 0x8b, 0xbb, 0x9e, 0x9e, 0x8c, 0xa0, 0xc1, 0x9b, 0x5a, 0x2f, 0x2f, 0x4e, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ] while True: op =mem[r[4]*16+ip]>>4 op1=mem[r[4]*16+ip]&0xf op2=mem[r[4]*16+ip+1] print "ip=%02x r=%02x,%02x,%02x,%02x cs=%02x ds=%02x fl=%02x %-4s %d %02x %02x" % ( ip, r[0], r[1], r[2], r[3], r[4], r[5], fl, ["jmp","movr","movm","add","xor","cmp","jmpe","hlt"][op/2], op%2, op1, op2) ip += 1 if op in [0x00,0x0c,0x0e,0x0f] else 2 ip %= 0x100 if False: pass elif op==0x00: ip=r[op1] elif op==0x01: ip=r[op1]; r[4]=op2 elif op==0x02: r[op1]=r[op2] elif op==0x03: r[op1]=op2 elif op==0x04: r[op1]=mem[r[5]*16+r[op2]] elif op==0x05: mem[r[5]*16+r[op1]]=r[op2] elif op==0x06: r[op1]+=r[op2]; r[op1]%=0x100 elif op==0x07: r[op1]+=op2; r[op1]%=0x100 elif op==0x08: r[op1]^=r[op2] elif op==0x09: r[op1]^=op2 elif op==0x0a: fl=1-int(r[op1]==r[op2]) elif op==0x0b: fl=1-int(r[op1]==op2) elif op==0x0c: if fl==0: ip=r[op1] elif op==0x0d: if fl==0: ip=r[op1]; r[4]=op2 elif op==0x0e: break elif op==0x0f: break print "".join(chr(x) for x in mem).encode("string_escape")
実行するとメモリ中に3問目のURLが生成される。
GET /da75370fe15c4148bd4ceec861fbdaa5.exe HTTP/1.0
Stage 3
問題: http://canyoucrackit.co.uk/da75370fe15c4148bd4ceec861fbdaa5.exe
>da75370fe15c4148bd4ceec861fbdaa5.exe canyoucrackit.co.uk keygen.exe error: license.txt not found >da75370fe15c4148bd4ceec861fbdaa5.exe keygen.exe usage: keygen.exe hostname >da75370fe15c4148bd4ceec861fbdaa5.exe canyoucrackit.co.uk keygen.exe error: license.txt not found >touch license.txt >da75370fe15c4148bd4ceec861fbdaa5.exe canyoucrackit.co.uk keygen.exe error: license.txt invalid
有効なlicense.txtを作る問題。プログラムを解析すると、先頭4文字が"gchq"、4文字目以降をsとして、crypt(s,"hqDTK7b8K2rvw")=="hqDTK7b8K2rvw"という条件がわかる。掲示板などを見るに、2つ目の条件の答えは、"cyberwin"らしいけど、例えば、プログラムの0x59dバイト目の0x07を0x00にするとかしてクラックできる。
>echo gchqaaaaaaaa000011112222 > license.txt >da75370fe15c4148bd4ceec861fbdaa5_crack.exe canyoucrackit.co.uk keygen.exe loading stage1 license key(s)... loading stage2 license key(s)... request: GET /hqDTK7b8K2rvw/30303030/31313131/32323232/key.txt HTTP/1.0 response: HTTP/1.1 404 Not Found Content-Type: text/html; charset=us-ascii Server: Microsoft-HTTPAPI/2.0 Date: Wed, 14 Dec 2011 10:00:44 GMT Connection: close Content-Length: 315 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/str ict.dtd"> <HTML><HEAD><TITLE>Not Found</TITLE> <META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD> <BODY><h2>Not Found</h2> <hr><p>HTTP Error 404. The requested resource is not found.</p> </BODY></HTML>
http://canyoucrackit.co.uk/hqDTK7b8K2rvw/[12-15バイト]/[16-19バイト]/[20-24バイト]/key.txt
にアクセスして、結果を表示している。これらの値を読み込むときに、
loading stage1 license key(s)... loading stage2 license key(s)...
と表示しているので、stage1とstage2にこれらの値があるはず。
Stage 1は、JMPで飛ばしている値。
0xa3bfc2AF
Stage 2は、使われていない変数。
firmware: [0xd2ab1f05, 0xda13f110]
license.txtをバイナリで、
67 63 68 71 61 61 61 61 61 61 61 61 AF C2 BF A3 05 1F AB D2 10 F1 13 DA
として実行すると……
>da75370fe15c4148bd4ceec861fbdaa5_crack.exe canyoucrackit.co.uk keygen.exe loading stage1 license key(s)... loading stage2 license key(s)... request: GET /hqDTK7b8K2rvw/a3bfc2af/d2ab1f05/da13f110/key.txt HTTP/1.0 response: HTTP/1.1 404 Not Found Content-Type: text/html; charset=us-ascii Server: Microsoft-HTTPAPI/2.0 Date: Wed, 14 Dec 2011 10:07:13 GMT Connection: close Content-Length: 315 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/str ict.dtd"> <HTML><HEAD><TITLE>Not Found</TITLE> <META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD> <BODY><h2>Not Found</h2> <hr><p>HTTP Error 404. The requested resource is not found.</p> </BODY></HTML>
(´・ω・`) バーチャルホストのせいなのか、ブラウザで↓のURLにアクセスするとキーワードが表示される。
http://canyoucrackit.co.uk/hqDTK7b8K2rvw/a3bfc2af/d2ab1f05/da13f110/key.txt
答え:
Pr0t3ct!on#cyber_security@12*12.2011+
暗号などではなく、全部アセンブラの問題だった。