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

[WriteUp] WhiteHat Contest 9 - Steg200


Steg200

http://material.wargame.whitehat.vn/contests/9/steg200_f2f6d2f2773301a5246507e25225349d.jpg
Đề cho ta mỗi cái hình:
http://material.wargame.whitehat.vn/contests/9/steg200_f2f6d2f2773301a5246507e25225349d.jpg

Sau khi thử bằng binwalk, http://fotoforensics.com/, tweakpng thì ta không phát hiện được điều gì đặc biệt
Tìm thử ảnh gốc nó để so sánh xem khác nhau không?
Let search
Kích thước ảnh là 900 × 582
Google hình ảnh ta có:

http://www.twinkfish.com/al/SilentRuinsGrayscale.jpg

Nhìn sơ thì không khác nhau là mấy.
OK vậy code thử:
Nếu chỗ nào khác nhau ta gán màu đen (0,0,0) và giống nhau ta gán màu trắng (255,255,255) ở hệ màu RGB

from PIL import Image
img = Image.open("SilentRuinsGrayscale.jpg")
img2 = Image.open("steg200_f2f6d2f2773301a5246507e25225349d.jpg")
pix = img.load()
pix2 = img2.load()
for i in xrange(img.size[0]):
for j in xrange(img.size[1]):
if pix[i,j]!=pix2[i,j]:
pix2[i,j]=(0,0,0)
else:
pix2[i,j]=(255,255,255)
img2.save("result.jpg")

Lại là QR code... Ám ảnh

Cắt ra fix lại decode ta được:

Flag:
WhiteHat{2fda0b6199b0465b61fde1f43c6a721038c7f3a0} 

[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}

[WriteUp] WhiteHat Contest 9 - Crypto100

Crypto100

Sau khi unzip ta thấy trong file txt có tầm 50 => Tương đương WhiteHat{ + 40 kí tự sha1sum + }
Vậy mỗi dòng sẽ là 1 kí tự
1 3 * 7 + 7 / 7 + 8 / 6 / 9 + 5 / 8 + 2 + 6 * 9 * 2 - 1 - 3 - 8 - 3 - 1 - 1 - 3 - 9 - 6 - 6 - 1 - 5 - 1 - 5 - 4 - 1 - 2 - 8 - 9 - 2 - 1 - 9 - 4 - 2 - 1 - 1 - 4 - 1 - 2 - 7 - 9 - 2 - 6 - 6 - 6 - 9 - 4 - 8 - 1 - 3 - 4 - 8 - 6 - 7 - 3 - 7 - 3 - 1 - 4 - 9 - 4 - 5 - 8 - 4 - 4 - 5 - 1 - 1 - 4 - 7 - 4 - 7 - 6 - 1 - 9 - 7 - 9 - 7 - 8 - 4 - 4 - 4 - 2 - 9 - 3 - 5 - 5 - 3 - 3 - 3 - 9 - 2 - 4 - 5 - 7 - 4 - 8 - 3 - 5 - 1 - 5 - 1 - 1 - 9 - 3 - 5 - 5 - 7 - 9 - 3 - 8 - 1 - 9 - 1 - 3 - 5 - 3 - 4 - 9 - 4 - 1 +
1 1 * 3 * 5 + 2 + 1 + 1 + 6 / 9 / 7 + 8 + 4 * 2 + 4 * 2 - 8 - 1 - 7 - 6 - 6 - 6 - 9 - 8 - 1 - 7 - 6 - 8 - 9 - 8 - 6 - 9 - 2 - 9 - 2 - 9 - 9 - 5 - 5 - 4 +
1 7 * 3 + 5 + 1 + 7 / 2 * 3 + 4 * 4 + 5 * 3 - 6 - 9 - 3 - 4 - 1 - 4 - 1 - 3 - 7 - 2 - 6 - 5 - 9 - 8 +
1 4 / 2 + 2 * 3 + 2 + 6 * 7 * 8 - 3 - 4 - 8 - 8 - 4 - 2 - 9 - 7 - 2 - 8 - 9 - 2 - 7 - 4 - 1 - 6 - 9 - 3 - 9 - 3 - 4 - 5 - 1 - 9 - 5 - 5 - 1 - 5 - 3 - 2 - 1 - 2 - 6 - 4 - 7 - 1 - 7 - 5 - 4 - 1 - 7 - 8 - 2 - 5 - 1 - 8 - 6 - 5 - 9 - 1 - 8 - 4 - 5 - 1 +
1 1 + 7 + 1 + 8 / 5 + 9 / 6 / 3 + 4 * 5 + 8 + 8 * 6 - 4 - 2 - 7 - 6 - 7 - 1 - 3 - 3 - 5 - 9 - 2 - 4 - 4 - 4 - 6 - 3 - 5 - 7 - 9 - 3 - 1 +
1 2 + 1 + 7 + 6 * 6 +
1 6 + 6 / 8 + 9 + 5 * 7 +
1 4 / 9 / 6 + 1 * 4 / 5 + 8 + 7 + 6 / 1 + 2 + 3 + 4 * 9 / 2 / 1 * 6 * 9 + 4 + 1 + 5 + 1 / 4 + 6 + 5 * 8 - 9 - 1 - 8 - 2 - 5 - 3 - 2 - 2 - 3 - 8 - 5 - 1 - 1 - 5 - 1 - 5 - 1 - 2 - 3 - 2 - 7 - 8 - 3 +
1 3 + 4 * 9 * 9 - 2 - 3 - 8 - 1 +
1 6 + 4 + 1 + 2 / 6 + 7 + 7 + 9 + 5 + 5 / 1 + 5 * 6 +
1 4 / 4 * 9 + 4 / 9 * 9 + 5 + 8 + 2 + 8 + 3 +
1 2 * 4 / 8 + 3 + 4 / 3 / 1 + 5 / 3 / 7 / 8 * 3 * 1 + 6 * 3 / 4 / 8 + 1 / 7 / 7 + 8 * 6 - 8 - 7 - 6 +
1 2 + 9 * 8 + 5 + 6 * 5 - 4 - 1 - 2 - 8 - 5 - 3 - 8 - 8 - 2 - 6 - 6 - 8 - 8 - 5 - 9 - 4 - 3 - 2 - 7 - 9 - 1 - 8 - 2 - 6 - 9 - 8 - 4 - 6 - 3 - 6 - 8 - 6 - 2 - 6 - 5 +
1 8 + 8 * 5 - 6 - 4 - 8 - 1 +
1 1 + 1 + 3 * 5 + 2 + 7 + 4 / 3 / 5 + 5 * 9 + 9 +
1 6 / 9 * 9 + 3 + 5 / 7 / 7 + 4 + 6 / 7 + 7 / 5 + 8 / 5 + 1 * 9 + 6 * 8 - 3 - 9 - 7 - 1 - 4 - 2 - 1 +
1 9 / 9 / 6 + 3 / 7 * 8 / 3 / 8 + 9 + 4 + 4 / 7 + 2 + 2 * 6 / 2 / 2 + 6 + 3 * 3 * 5 - 4 - 1 - 3 - 3 - 1 - 7 - 5 - 1 - 6 - 3 - 3 - 0 +
1 8 * 4 + 3 * 4 + 8 / 5 / 5 + 1 + 8 * 9 + 3 * 4 - 3 - 9 - 9 - 7 - 6 - 9 - 4 - 1 - 6 - 7 - 3 - 5 - 7 - 2 - 6 - 8 - 2 +
1 6 * 7 / 8 / 1 / 8 / 6 + 8 + 9 + 5 + 2 * 6 * 9 - 6 - 3 - 3 - 8 - 2 - 9 - 5 - 2 - 8 - 4 - 4 - 3 - 1 - 9 - 7 - 6 - 9 - 6 - 1 - 1 - 6 - 7 - 7 - 5 - 9 - 6 - 8 - 7 - 8 - 3 - 9 - 3 - 7 - 7 - 3 - 6 - 1 - 7 - 9 - 2 - 6 - 5 - 2 +
1 6 + 2 + 8 / 3 + 4 * 8 + 3 * 2 + 5 + 9 + 6 * 9 - 9 - 8 - 6 - 3 - 5 - 8 - 4 - 8 - 1 - 4 - 5 - 7 - 7 - 3 - 1 - 4 - 9 - 3 - 9 - 2 - 9 - 4 - 3 - 9 - 2 - 7 - 1 - 6 - 4 - 1 - 7 - 2 - 8 - 3 - 7 - 4 - 7 - 3 - 8 - 2 - 4 - 9 - 6 - 8 - 4 - 3 - 2 - 8 - 1 - 8 - 7 - 5 - 7 - 3 - 8 - 3 - 9 - 6 - 4 - 8 - 4 - 2 - 3 - 8 - 7 - 8 - 5 - 9 - 8 - 5 - 4 - 8 - 8 - 7 - 2 - 6 - 4 - 7 - 4 +
1 6 + 9 + 2 + 5 + 3 + 9 / 9 + 9 + 2 * 4 * 5 - 2 - 3 - 4 - 6 - 5 - 8 - 5 - 3 - 6 - 4 - 8 - 5 - 4 +
1 2 + 6 * 2 * 7 * 7 - 6 - 6 - 4 - 3 - 4 - 1 - 7 - 9 - 8 - 5 - 1 - 5 - 4 - 3 - 8 - 4 - 3 - 3 - 1 - 3 - 9 - 7 - 5 - 3 - 8 - 9 - 2 - 5 - 7 - 8 - 5 +
1 8 + 6 + 7 * 4 - 0 +
1 5 + 5 + 7 + 3 + 7 * 3 - 6 - 5 - 7 - 4 - 9 - 8 - 9 - 4 - 7 - 2 - 2 - 9 - 9 - 2 - 5 - 3 - 1 - 0 +
1 9 + 5 / 2 / 6 * 6 + 5 + 6 / 5 * 2 + 2 + 6 + 6 + 5 / 3 + 8 * 9 + 4 + 4 / 9 / 4 * 1 + 2 + 2 * 6 + 1 + 8 + 3 + 7 + 4 + 5 + 7 + 6 + 1 + 8 / 1 + 5 * 1 * 4 * 9 - 8 - 2 - 6 - 3 - 1 - 9 - 9 - 7 - 9 - 7 - 7 - 2 - 2 - 1 +
1 6 + 7 / 8 + 6 / 5 / 4 + 4 * 8 + 8 / 8 / 1 / 6 / 7 / 1 / 3 + 6 + 5 + 7 + 3 + 5 + 8 * 9 - 5 - 4 - 9 - 1 - 8 - 3 - 1 - 5 - 6 - 6 - 2 - 9 - 9 - 3 - 3 - 6 - 8 - 2 - 6 - 6 - 2 - 5 - 3 - 4 - 4 - 1 - 2 - 1 - 1 - 4 - 3 - 5 - 7 - 7 - 3 - 6 - 6 - 9 - 3 +
1 6 + 2 + 7 + 4 + 2 / 5 * 1 +
1 7 / 1 + 8 + 8 + 4 + 6 + 8 + 6 / 4 + 8 + 1 + 9 + 9 + 2 + 4 / 7 / 3 / 6 + 8 / 3 + 1 + 1 * 5 * 6 + 9 + 7 + 8 +
1 3 + 8 * 8 / 5 + 2 + 8 + 6 + 5 + 4 * 1 - 6 - 8 - 8 - 5 - 9 - 5 - 4 - 3 - 7 - 3 - 3 - 3 - 1 - 7 - 2 +
1 1 / 2 / 8 + 7 * 1 - 2 - 1 - 8 - 7 +
1 3 + 1 * 5 + 9 / 5 * 8 * 3 / 8 * 8 - 6 +
1 5 / 5 / 2 / 4 * 8 / 6 / 2 + 4 / 3 + 5 + 4 * 2 / 8 + 7 / 6 + 8 + 2 * 8 * 3 - 5 - 3 - 8 - 4 - 9 - 7 - 3 - 9 - 3 - 2 - 7 - 3 - 7 - 8 - 5 - 4 - 8 - 3 - 7 - 3 - 2 - 1 - 9 - 1 - 8 - 8 - 5 - 6 - 5 - 3 - 2 - 6 - 5 - 6 - 4 +
1 6 + 3 + 7 + 8 / 8 + 6 + 6 * 1 - 7 - 7 - 7 - 7 - 1 - 4 - 3 - 1 - 2 - 8 - 2 +
1 9 + 5 + 3 + 5 / 5 + 3 + 2 * 7 + 5 + 1 + 4 / 4 / 4 + 5 * 4 + 8 + 6 +
1 8 * 6 + 9 + 8 / 2 + 3 / 2 * 1 + 1 + 1 * 6 + 8 / 1 + 8 + 7 * 9 + 9 / 2 + 3 + 2 / 4 + 8 + 6 + 6 * 1 - 9 - 9 - 3 - 9 - 6 - 4 - 7 - 3 +
1 3 / 5 / 4 + 6 + 8 / 4 + 5 + 6 + 3 + 9 / 4 + 5 * 2 + 9 + 8 + 8 + 3 * 8 - 7 - 9 - 4 - 4 - 1 - 4 - 9 - 8 - 4 - 8 - 1 - 1 - 1 - 8 - 4 +
1 2 + 6 + 7 + 4 * 5 + 1 * 8 / 4 + 8 + 1 + 4 + 1 * 1 + 1 + 8 * 9 - 7 - 4 - 3 - 5 - 6 - 8 - 9 - 2 - 4 - 6 - 2 - 3 - 6 - 9 - 1 - 7 - 9 - 7 - 1 - 4 - 7 - 0 +
1 3 + 4 + 3 + 1 + 5 + 1 * 4 * 3 / 2 + 7 / 3 + 1 + 3 * 9 + 4 + 3 + 4 + 1 + 3 + 6 + 1 + 7 * 2 - 7 - 9 - 9 - 4 - 9 - 9 - 1 - 8 - 2 - 4 - 6 - 2 - 1 - 2 - 2 - 3 - 7 - 1 - 7 - 7 - 6 - 4 - 8 - 1 - 4 - 2 - 9 - 2 - 3 - 6 - 8 - 9 - 6 - 7 - 3 - 7 - 4 - 7 - 1 - 4 - 9 - 7 - 1 - 4 - 3 - 6 - 6 - 5 - 9 - 3 - 5 - 6 - 5 +
1 4 + 6 + 6 + 8 + 8 + 4 / 5 + 3 + 4 * 9 - 6 - 8 - 7 +
1 2 / 5 + 9 + 6 + 5 / 3 + 8 / 1 + 8 / 5 * 2 / 1 + 7 + 9 * 2 - 9 - 8 - 3 +
1 4 + 1 + 3 + 3 / 6 + 7 + 8 / 2 / 7 * 4 / 2 / 1 * 9 / 2 + 1 * 9 + 5 + 8 / 4 + 1 + 8 + 2 * 6 + 8 + 9 + 3 +
1 6 + 6 * 8 + 5 + 6 / 5 + 5 + 8 + 9 + 8 + 8 + 1 + 3 / 1 / 4 + 2 / 8 + 2 + 8 / 9 + 6 + 3 * 1 / 3 * 4 - 5 - 7 - 3 - 3 - 5 - 2 - 9 - 5 - 4 - 6 - 1 +
1 5 * 1 * 4 + 8 + 3 / 8 * 1 * 5 + 1 + 3 + 1 * 3 * 7 - 7 - 4 - 1 - 7 - 2 - 5 - 5 - 4 - 8 - 4 +
1 2 + 1 + 6 + 2 + 1 + 7 + 4 / 7 / 6 + 6 + 3 / 6 * 7 + 8 + 4 / 4 * 6 + 3 / 1 + 1 + 6 + 9 + 5 * 6 - 8 - 8 - 4 - 6 - 5 - 4 - 9 - 4 - 1 - 4 - 3 +
1 2 + 6 + 1 + 6 + 4 * 6 - 9 - 2 - 1 +
1 8 * 1 * 5 + 6 / 4 * 9 + 5 + 7 + 3 + 3 / 5 + 6 + 8 + 9 * 2 - 5 - 6 - 8 - 3 - 9 - 4 - 9 - 6 - 8 - 5 - 4 - 6 - 2 - 3 - 1 - 6 - 2 - 3 - 1 - 1 - 5 - 8 - 5 - 9 - 6 - 6 - 1 - 8 - 3 - 8 - 5 - 5 - 2 +
1 1 / 9 / 2 / 9 + 7 + 4 + 3 + 6 * 7 - 4 - 8 - 9 - 8 - 5 - 1 - 2 - 4 - 2 - 1 - 7 - 3 - 2 - 1 - 5 - 6 - 4 - 4 - 1 +
1 5 + 2 / 2 + 8 + 2 / 4 * 2 * 8 +
1 7 / 3 * 3 + 2 * 7 + 7 + 8 + 3 + 3 + 2 + 2 / 9 * 5 - 9 - 7 - 8 - 3 - 1 - 3 - 4 - 4 - 4 - 5 - 1 - 5 - 4 - 3 +
1 1 / 8 / 6 + 3 / 9 + 2 + 5 + 7 + 6 + 7 * 8 - 3 - 1 - 1 - 1 - 9 - 5 - 4 - 2 - 8 - 3 - 9 - 9 - 3 - 9 - 5 - 1 - 4 - 2 - 7 - 2 +
Do trước đây từng làm bài báo cáo về kí pháp ba lan nên mình nhận ra ngay đây là biểu thức ở dạng hậu tố
Đọc thêm về kí pháp ba lan tại http://vi.wikipedia.org/wiki/K%C3%AD_ph%C3%A1p_Ba_Lan

OK vậy ta tính các biểu thức hậu tố này. 
def calculate(inputs):
stack = []
for a in inputs:
# if type(a) is int:
if a in "1234567890":
stack.append(int(a))
continue
op1, op2 = stack.pop(), stack.pop()
if a == '+':
stack.append(op2 + op1)
elif a == '-':
stack.append(op2 - op1)
elif a == '*':
stack.append(op2 * op1)
elif a == '/':
stack.append(op2 / op1)

return stack.pop()
file = open("cipher.txt")
flag=""
for line in file:
inp = line.strip()
flag+=chr(calculate(inp.split(" ")))
print flag
OK vậy  run ta được:
WhiteHat{35192030eefdce4d33213fb20cbaf088eec0d88f}