카테고리 없음

CRC64 역연산 소스

진모씨 2014. 9. 15. 23:44

from socket import *

from struct import *

# Initialisation

# 32 first bits of generator polynomial for CRC64

# the 32 lower bits are assumed to be zero


CRCTable = [0, 12911341560706588527L, 17619267392293085275L, 5164075066763771700L, 8921845837811637811L, 14483170935171449180L, 10328150133527543400L, 4357999468653093127L, 17843691675623275622L, 4940391307328217865L, 226782375002905661L, 12685511915359257426L, 10119945210068853333L, 4566377562367245626L, 8715998937306186254L, 14689403211693301089L, 9051005139383707209L, 14895072503764629798L, 9880782614656435730L, 4193374422961527165L, 453564750005811322L, 13070904082541799189L, 17496296445768931361L, 4747102235666401102L, 9960315520700766767L, 4113029525020509504L, 9132755124734491252L, 14812441257301386523L, 17431997874612372508L, 4811156168024382323L, 391483189436228679L, 13132671735097031464L, 18102010278767414418L, 5195199925788447741L, 1131375642422963401L, 13591081480414639014L, 9288535643022529185L, 3731739485546663374L, 8386748845923054330L, 14361410892855143829L, 907129500011622644L, 13814943346342178715L, 17875617253995106479L, 5421418680781082560L, 8594564625313771207L, 14152643483341451688L, 9494204471332802204L, 3525329033817543155L, 9704381199536204507L, 3855837706121835956L, 8226059050041019008L, 13908973417437222383L, 18265510249468982504L, 5643692520190618503L, 718348998302913715L, 13463047253836762076L, 8146277531524994749L, 13989069943491807698L, 9622312336048764646L, 3938150108875254153L, 782966378872457358L, 13399312233903888353L, 18327840216347633877L, 5582173445676054458L, 7257036000092981153L, 15535280666427316430L, 10390399851576895482L, 2529986302517213333L, 2262751284845926802L, 12414353723947190013L, 16997392145760156105L, 6398650419759490726L, 10599130201908394951L, 2322133910755632296L, 7463478971093326748L, 15329644185724306675L, 16773497691846108660L, 6622864283287239323L, 2036569382881248687L, 12640783567252986560L, 1814259000023245288L, 12250853444207230599L, 17125426475222188467L, 6811676960462675676L, 7132938157145702363L, 15119434731753103540L, 10842837361562165120L, 2690676064372932847L, 17189129250627542414L, 6747026957542163169L, 1875814858707893717L, 12188560364711551674L, 10762704257491731389L, 2770420489343360210L, 7050658067635086310L, 15201536148867841161L, 11493583972846619443L, 3219832958944941148L, 7711675412243671912L, 15576564987190227975L, 16452118100082038016L, 6305011443818121839L, 1213047649942025563L, 11816267669673208372L, 7503259434831574869L, 15784731923736995898L, 11287385040381237006L, 3425713581329221729L, 1436697996605827430L, 11591809733187859977L, 16677985422973077821L, 6078267261889762898L, 16292555063049989498L, 5851447209550246421L, 1630020308903038241L, 11939238787801010766L, 11081681957373440841L, 3090674103720225830L, 7876300217750508306L, 16023932746787097725L, 1565932757744914716L, 12003503911822413427L, 16230825569204842823L, 5913566482019610152L, 7956607163135676207L, 15944361922680361024L, 11164346891352108916L, 3008957496780927003L, 14514072000185962306L, 8809633696146542637L, 4460922918905818905L, 10287960411460399222L, 12879331835779764593L, 113391187501452830L, 5059972605034426666L, 17660565739912801861L, 4525502569691853604L, 10224187249629523019L, 14576435430675780479L, 8748148222884465680L, 4980157760350383383L, 17740628527280140920L, 12797300839518981452L, 195741594718114339L, 13040162471224305931L, 565687821211481700L, 4644267821511264592L, 17536326748496696895L, 14926957942186653496L, 8937808626997553239L, 4297282312656885603L, 9839608450464401420L, 4852190599768102253L, 17327666750234135042L, 13245728566574478646L, 359174499151456857L, 4073138765762497374L, 10063573324157604913L, 14700457781105076997L, 9163920108173816938L, 3628518000046490576L, 9328460452529085631L, 14330211790445699979L, 8498696072880078052L, 5299565100954197475L, 18061012165519327884L, 13623353920925351352L, 1018284691440624343L, 14265876314291404726L, 8562713237611094233L, 3566469078572851181L, 9390260331795218562L, 13702854325316886917L, 937907429353946858L, 5381352128745865694L, 17978417549248290481L, 5746791986423309721L, 18225777846762470134L, 13494053915084326338L, 606523824971012781L, 3751629717415787434L, 9745292510640121029L, 13876787882151992305L, 8338992711486538910L, 13285957365033343487L, 815010154451519120L, 5540840978686720420L, 18431906428167644875L, 14101316135270172620L, 8115412784602421411L, 3978303581567838103L, 9519354766961195256L, 12527462061959317731L, 2230461459452909452L, 6439665917889882296L, 16893009583564617687L, 15423350824487343824L, 7288217715337890239L, 2490078880175191691L, 10493603952060017124L, 6520081235612152965L, 16813546994155744234L, 12610022887636243678L, 2148641156328442801L, 2426095299884051126L, 10557972909709735385L, 15361512820870335213L, 7350228890552538498L, 15006518869663149738L, 7165105895222849989L, 2649782550477098737L, 10947027550912647582L, 12362696414880903321L, 1783234539286425590L, 6851427162658443458L, 17022309211647725485L, 2873395993211654860L, 10722532847870938531L, 15232418832718623383L, 6938393941075996152L, 6642978682516671743L, 17230443782969840528L, 12156534523779525796L, 1989151790783919051L, 6263731030979658865L, 16556202624882645790L, 11702894419100492842L, 1245039440087595845L, 3260040617806076482L, 11390642587947386157L, 15688795063501830681L, 7680756410435167606L, 11622868312827688983L, 1324891275238549368L, 6181348207440451660L, 16638201170595874595L, 15752600435501016612L, 7616209416359311691L, 3321489341258335871L, 11328242235714328848L, 3131865515489829432L, 10977756817953029463L, 16137146508898304611L, 7844397531750915340L, 5811434156413844491L, 16395372229761246052L, 11827132964039220304L, 1660744670629167935L, 15913214326271352414L, 8068573254449152305L, 2905717078206922245L, 11204220263579804010L, 12035829987123708013L, 1452858539103461122L, 6017914993561854006L, 16189773752444600153L]

original = "_[Hello___Welcome To Reversing.Kr]__The idea of the algorithm came out of the codeengn challenge__This algorithm very FXCK__But you can solve it!!__Impossible is Impossible_()_[]_()_[]_()_[]_()_[]_()_[]_()_[]_()_[]_()_[]_()_[]_()_[]_()_[]_()_[]_()_[]_()_[\x00"

def CRC64(aString, old_crc=0):

    global isInitialized

    crc = old_crc

    for c in aString:

        crc = CRCTable[(crc & 0xff) ^ ord(c)] ^ (crc >> 8)

    if crc > (2 ** 64):

        print "Fuck!"

        exit()

    return crc


payload = []

org_crc = 0x676F5F67 * (2 ** 32) + 0x5F695F6C

offset = 0

v_crc_table = [0] * 256

for i in range(256):

 v_crc_table[(CRC64(chr(i)) & 0xffffffffffffffff) >> 56] = (CRC64(chr(i)) & 0xffffffffffffffff)

#org_crc = CRC64("A" * 256)

#original = "A" * 256

for i in range(255, 8 - 1, -1):

# print org_crc >> 56

# print hex(org_crc)[2:-1].zfill(16)

 org_chr = CRCTable.index(v_crc_table[org_crc >> 56]) ^ ord(original[i])

 org_crc ^= v_crc_table[org_crc >> 56]

 org_crc <<= 8

 org_crc |= org_chr 

# print hex(org_crc)[2:-1].zfill(16)

for j in range(8):

 print hex(CRC64("A" * j))

print hex(org_crc)

shellcode = pack("<Q", org_crc)

print '=' * 8

for offset in range(0, len(shellcode), 8):

    r=''

    old_crc = org_crc

    s = shellcode[offset:offset+8]

    a = []

    for i in range(8):

        s_c = old_crc >> 56

        old_crc ^= v_crc_table[s_c]

        old_crc <<= 8

        print hex(old_crc), r.encode('hex')

        a.append(s_c)

    a = a[::-1]

    c = 0

    for b in a:

        print hex(b),

        d = CRCTable.index(v_crc_table[b]) ^ c

        c = CRC64(r + chr(d)) & 0xff

        r += chr(d)

        print hex(c)

    payload.append(r)

print map(lambda x: x.encode('hex'), payload)

print map(hex, map(lambda x: x & 0xfffffffffffffff, map(lambda x: CRC64(x), payload)))

print hex(org_crc)