# ructf2010 histograph bitmap decoder # http://smokedchicken.org import array, struct import sys filename = sys.argv[1] f = file(filename, 'rb') f.seek(0x436); action = f.read() f.close() data = bytearray(action) table = "0E79CAE2488E3F66D88C7C50315C06627DE71246B81ECDBCB5517886BD955A42E4964598533002B3DFCF57C0154F09A8F685678A5F94C4EE64A59C6AAE55EDE908B2033DD98D3A43386959820571B613ECD347074AF06F10751B704E260B90340FF1EAA02865C916F252E56D41EBFB61E69FE058C274A9730CD02E77B03ED6B1C8D76C7F1F198472FA27FC2B32C788FD49E323AFF5FE3C1D4CAD21008FF92FD5689EBA297E83B78BE12A7BACA356AAF463DBDE1AD299D1CC4B39C12414DC6BBF8991A75ED4FF18AB172D76921C9BB97ADD444D1181935D04C554A4B4CE33DA229D20CB605B25E8A62CF70D01A2F835BEF3A13B0AC6369A6E37EFBB40808797C3".decode('hex') pos = 0 flag = bytearray(32) i = 0 while i < 500: for j in range(300): j2 = 299 - j if (j2 <= 0x16) or (j2 > 0x116) or (i <= 0x1a) or (i > 0x1da): continue if (data[j2*500 + i] == 0x24): if (data[(j2 - 1)*500 + i] == pos): flag[pos] = 0x116 - j - 1 pos = pos + 1 break elif (data[(j2 - 1)*500 + i] == 0x24) and (data[(j2 + 1)*500 + i] != 0x24) and (data[(j2 - 2)*500 + i] != 0x24): flag[pos] = 0x116 - j - 1 pos = pos + 1 i = i + 14 break i = i + 1 indexes = bytearray(32) for i in range(32): for j in range(len(table)): if flag[i] == ord(table[j]): indexes[i] = j # index = flag[i] + Sum mod 256 Sum = (indexes[31] - 61) % 256 flag2 = bytearray(32) for i in range(32): flag2[i] = (indexes[i] - Sum) % 256 Sum2 = 0 result = "" for i in range(32): Sum2 = Sum2 + (i + 1) * flag2[i] result = result + chr(flag2[i]) Sum2 = Sum2 % 256 if Sum != Sum2: print "Incorrect checksum" print result