Thứ Bảy, 25 tháng 4, 2015

[WriteUp] WhiteHat Contest 9 - Crypto300

Crypto300

Một mạch có đầu vào 8bit và đầu ra 8 bit tương ướng với plaintext và ciphertext (đã được base64)
cipher = 4BauKt+udK5gx34Wkyq03/Wurqb1336+3zSu37S+kyq037u0u5Mq9X7fx776w99grqaupjSuYN9+Frt+334Wrt+7k2BqIrsqrt9+u4uu9d++ICDfu7S7kyr1ft9+Fq7f4JMqKsPfKr5+3+CTfhbfk37L

Flag = WhiteHat{sha1(plaintext)}

Schematic của mạch mã hóa được vẽ bằng mô phỏng proteus như sau:
http://material.wargame.whitehat.vn/contests/9/crypto300_354a0de71625c782906783139bb8fb72.bmp

OK nhìn vào mạch ta có thể đoán được như sau:
Đầu vào là 8 bit = 1 byte = 1 char
Đầu ra cũng 8 đèn led = 8 bit = 1 byte = 1 char cipher

Trong mạch rất đơn giản chỉ có 2 loại cổng là NAND và XOR

Đầu vào là plaintext nên ta bruteforce các kí tự in được từ chr(32) -> chr(126)
Coi thêm tại http://asciitable.com/

OK Bắt tay vào code
import base64
def NAND(a,b):
a=int(a)
b=int(b)
if not (a&b):
return 1
return 0

def XOR(a,b):
a=int(a)
b=int(b)
if a != b:
return 1
else:
return 0
def N1(a):
return NAND(a[0],a[1])
def N2(a):
return NAND(a[2],a[3])
def N3(a):
return NAND(a[4],a[5])
def N4(a):
return NAND(a[6],a[7])
def N5(a):
return NAND(a[0],a[2])
def N6(a):
return NAND(a[1],a[3])
def N7(a):
return NAND(a[4],a[6])
def N8(a):
return NAND(a[5],a[7])

def X11(a):
return XOR(N1(a),a[1])
def X12(a):
return XOR(N2(a),a[1])
def X13(a):
return XOR(N3(a),a[2])
def X14(a):
return XOR(N4(a),a[3])
def X15(a):
return XOR(N5(a),a[4])
def X16(a):
return XOR(N6(a),a[5])
def X17(a):
return XOR(N7(a),a[6])
def X18(a):
return XOR(N8(a),a[7])
def X21(a):
return XOR(X11(a),a[6])
def X22(a):
return XOR(X12(a),a[3])
def X23(a):
return XOR(X13(a),a[4])
def X24(a):
return XOR(X14(a),a[5])
def X25(a):
return XOR(X15(a),a[6])
def X26(a):
return XOR(X16(a),a[7])
def X27(a):
return XOR(X17(a),a[0])
def X28(a):
return XOR(X18(a),a[1])
def toChar(a):
a = char2binary(a)
bin = str(X21(a))
bin += str(X22(a))
bin += str(X23(a))
bin += str(X24(a))
bin += str(X25(a))
bin += str(X26(a))
bin += str(X27(a))
bin += str(X28(a))
return bin
def char2binary(a):
x=format(ord(a),'b').zfill(8)
return x

cipher = base64.b64decode("4BauKt+udK5gx34Wkyq03/Wurqb1336+3zSu37S+kyq037u0u5Mq9X7fx776w99grqaupjSuYN9+Frt+334Wrt+7k2BqIrsqrt9+u4uu9d++ICDfu7S7kyr1ft9+Fq7f4JMqKsPfKr5+3+CTfhbfk37L")
key = []
for n in xrange(0,len(cipher)):
k = []
c = char2binary(cipher[n])
for i in xrange(32,126): 
res = toChar(chr(i))
if res==c:
k.append(chr(i))
key.append(k)
if len(k)==0:
print "Fail"
exit(1)
flag = ""
for i in xrange(len(key)):
flag+=key[i][0]
print i,key[i]
print flag

Run it:
Kết quả là Fail
Why? Bởi vì có kí tự output mà không tìm được kí tự input nào
Xem xét kỹ ta thấy có thể đề đã sai. Tinh tế hơn ta để ý ở X21. Ta thử sửa thành
def X21(a):
# return XOR(X11(a),a[6])
return XOR(X11(a),a[7])
Run tiếp:
C:\Users\phieu lang\Desktop\WH9>crypto300.py
0 ['W']
1 ['H', '|']
2 ['E']
3 ['D', 'N', 'z']
4 [' ', '[']
5 ['E']
6 ['V']
7 ['E']
8 ['R']
9 ['Y']
10 ['T', '^']
11 ['H', '|']
12 ['I']
13 ['D', 'N', 'z']
14 ['G']
15 [' ', '[']
16 ['S']
17 ['E']
18 ['E']
19 ['M']
20 ['S']
21 [' ', '[']
22 ['T', '^']
23 ['O']
24 [' ', '[']
25 ['B']
26 ['E']
27 [' ', '[']
28 ['G']
29 ['O']
30 ['I']
31 ['D', 'N', 'z']
32 ['G']
33 [' ', '[']
34 ['A']
35 ['G']
36 ['A']
37 ['I']
38 ['D', 'N', 'z']
39 ['S']
40 ['T', '^']
41 [' ', '[']
42 ['Y']
43 ['O']
44 ['U']
45 [',']
46 [' ', '[']
47 ['R']
48 ['E']
49 ['M']
50 ['E']
51 ['M']
52 ['B']
53 ['E']
54 ['R']
55 [' ', '[']
56 ['T', '^']
57 ['H', '|']
58 ['A']
59 ['T', '^']
60 [' ', '[']
61 ['T', '^']
62 ['H', '|']
63 ['E']
64 [' ', '[']
65 ['A']
66 ['I']
67 ['R']
68 ['+', 'P']
69 ['L', 'x']
70 ['A']
71 ['D', 'N', 'z']
72 ['E']
73 [' ', '[']
74 ['T', '^']
75 ['A']
76 ['K']
77 ['E']
78 ['S']
79 [' ', '[']
80 ['O']
81 ['F']
82 ['F']
83 [' ', '[']
84 ['A']
85 ['G']
86 ['A']
87 ['I']
88 ['D', 'N', 'z']
89 ['S']
90 ['T', '^']
91 [' ', '[']
92 ['T', '^']
93 ['H', '|']
94 ['E']
95 [' ', '[']
96 ['W']
97 ['I']
98 ['D', 'N', 'z']
99 ['D', 'N', 'z']
100 [',']
101 [' ', '[']
102 ['D', 'N', 'z']
103 ['O']
104 ['T', '^']
105 [' ', '[']
106 ['W']
107 ['I']
108 ['T', '^']
109 ['H', '|']
110 [' ', '[']
111 ['I']
112 ['T', '^']
113 ['$', '.']
WHED EVERYTHIDG SEEMS TO BE GOIDG AGAIDST YOU, REMEMBER THAT THE AIR+LADE TAKES OFF AGAIDST THE WIDD, DOT WITH IT$
Fix lại 1 số chỗ ta được key chính xác là:
 WHEN EVERYTHING SEEMS TO BE GOING AGAINST YOU, REMEMBER THAT THE AIRPLANE TAKES OFF AGAINST THE WIND, NOT WITH IT.
OK giờ ta có flag:
 WhiteHat{5ad8000a22f19c27cba191e4e6812c1833141138}

Không có nhận xét nào:

Đăng nhận xét