diff --git a/stack-2020/iot-challenge-5/writeup/arduino-i2c/decoded_i2c.txt b/stack-2020/iot-challenge-5/writeup/arduino-i2c/decoded_i2c.txt new file mode 100644 index 0000000..2378f93 --- /dev/null +++ b/stack-2020/iot-challenge-5/writeup/arduino-i2c/decoded_i2c.txt @@ -0,0 +1,1444 @@ +Time [s],Packet ID,Address,Data,Read/Write,ACK/NAK +1.396227940000000,1,N,'0',Write,ACK +1.496450310000000,2,N,4,Write,ACK +1.496679830000000,3,N,0,Write,ACK +1.501438270000000,4,N,4,Write,ACK +1.501667660000000,5,N,0,Write,ACK +1.502052140000000,6,N,4,Write,ACK +1.502281520000000,7,N,0,Write,ACK +1.502670870000000,8,N,$,Write,ACK +1.502900260000000,9,N,' ',Write,ACK +1.503284610000000,10,N,$,Write,ACK +1.503514000000000,11,N,' ',Write,ACK +1.503748450000000,12,N,'132',Write,ACK +1.503977830000000,13,N,'128',Write,ACK +1.504272210000000,14,N,'4',Write,ACK +1.504501600000000,15,N,'0',Write,ACK +1.504736040000000,16,N,'196',Write,ACK +1.504965560000000,17,N,'192',Write,ACK +1.505199940000000,18,N,'4',Write,ACK +1.505429330000000,19,N,'0',Write,ACK +1.505663770000000,20,N,'20',Write,ACK +1.505893160000000,21,N,'16',Write,ACK +1.508142160000000,22,N,'4',Write,ACK +1.508371670000000,23,N,'0',Write,ACK +1.508606120000000,24,N,d,Write,ACK +1.508835640000000,25,N,`,Write,ACK +1.509070080000000,26,N,'0',Write,ACK +1.509299530000000,27,N,'8',Write,ACK +3.509102010000000,28,N,'12',Write,ACK +3.509331520000000,29,N,'8',Write,ACK +3.509566030000000,30,N,COMMA,Write,ACK +3.509795540000000,31,N,(,Write,ACK +3.512049600000000,32,N,-,Write,ACK +3.512278930000000,33,N,),Write,NAK +3.512513440000000,34,N,\r,Write,NAK +3.512742950000000,36,N,\t,Write,Missing ACK/NAK +3.512982400000000,37,N,m,Write,NAK +3.513211910000000,38,N,i,Write,NAK +3.513446420000000,39,N,},Write,NAK +3.513675810000000,40,N,y,Write,NAK +3.513915250000000,41,N,m,Write,ACK +3.514144770000000,42,N,i,Write,NAK +3.514379280000000,43,N,'253',Write,NAK +3.514608790000000,44,N,'249',Write,NAK +3.514848180000000,45,N,},Write,ACK +3.515077560000000,46,N,y,Write,NAK +3.515316940000000,47,N,m,Write,ACK +3.515546330000000,49,N,i,Write,Missing ACK/NAK +3.515785720000000,50,N,},Write,NAK +3.516015100000000,51,N,y,Write,ACK +3.516249550000000,52,N,M,Write,NAK +3.516479060000000,53,N,I,Write,ACK +3.516718510000000,54,N,m,Write,NAK +3.516948020000000,55,N,i,Write,NAK +3.517182470000000,56,N,],Write,NAK +3.517411790000000,57,N,Y,Write,ACK +3.517651240000000,58,N,m,Write,NAK +3.517880750000000,59,N,i,Write,ACK +3.518115200000000,60,N,=,Write,NAK +3.518344710000000,61,N,9,Write,ACK +3.518584100000000,62,N,m,Write,NAK +3.518813480000000,63,N,i,Write,ACK +3.519047930000000,64,N,'141',Write,ACK +3.519277320000000,65,N,'137',Write,NAK +3.519516770000000,66,N,-,Write,NAK +3.519746280000000,67,N,),Write,NAK +3.519980790000000,68,N,\r,Write,NAK +3.520210300000000,69,N,\t,Write,NAK +3.520454370000000,70,N,m,Write,NAK +3.520683760000000,71,N,i,Write,NAK +3.520918210000000,72,N,=,Write,NAK +3.521147720000000,73,N,9,Write,NAK +3.521387100000000,75,N,},Write,Missing ACK/NAK +3.521616610000000,76,N,y,Write,ACK +3.521851070000000,77,N,M,Write,ACK +3.522080450000000,78,N,I,Write,NAK +3.522319900000000,79,N,m,Write,NAK +3.522549220000000,80,N,i,Write,NAK +3.522783670000000,81,N,m,Write,NAK +3.523013180000000,82,N,i,Write,NAK +3.523252630000000,83,N,-,Write,NAK +3.523487140000000,84,N,),Write,NAK +3.523721650000000,85,N,\r,Write,NAK +3.523951160000000,86,N,\t,Write,NAK +3.524195610000000,87,N,'204',Write,ACK +3.524425120000000,88,N,'200',Write,ACK +3.524659630000000,89,N,'12',Write,ACK +3.524889140000000,90,N,'8',Write,ACK +3.525133520000000,91,N,-,Write,NAK +3.525362910000000,92,N,),Write,NAK +3.525597360000000,93,N,\r,Write,NAK +3.525826750000000,94,N,\t,Write,NAK +3.526066130000000,95,N,},Write,NAK +3.526295520000000,96,N,y,Write,NAK +3.526529910000000,97,N,},Write,ACK +3.526759420000000,98,N,y,Write,NAK +3.526998860000000,100,N,m,Write,Missing ACK/NAK +3.527228380000000,101,N,i,Write,ACK +3.527462820000000,102,N,],Write,NAK +3.527692150000000,103,N,Y,Write,NAK +3.527931590000000,104,N,m,Write,ACK +3.528161110000000,105,N,i,Write,ACK +3.528395550000000,106,N,'205',Write,ACK +3.528630060000000,107,N,'201',Write,ACK +3.528869450000000,108,N,m,Write,NAK +3.529098840000000,109,N,i,Write,ACK +3.529333290000000,110,N,=,Write,ACK +3.529562800000000,111,N,9,Write,ACK +3.529802180000000,112,N,m,Write,NAK +3.530031570000000,113,N,i,Write,NAK +3.530266080000000,114,N,'253',Write,NAK +3.530495460000000,115,N,'249',Write,ACK +3.530734850000000,116,N,m,Write,NAK +3.530964240000000,117,N,i,Write,NAK +3.531198620000000,118,N,'221',Write,NAK +3.531428010000000,119,N,'217',Write,NAK +3.531667390000000,120,N,m,Write,NAK +3.531896780000000,121,N,i,Write,NAK +3.532131230000000,122,N,],Write,NAK +3.532360740000000,123,N,Y,Write,NAK +3.532600190000000,124,N,-,Write,NAK +3.532829700000000,125,N,),Write,NAK +3.533064210000000,126,N,\r,Write,NAK +3.533293720000000,127,N,\t,Write,NAK +3.533533100000000,128,N,},Write,ACK +3.533762620000000,129,N,y,Write,NAK +3.533997070000000,130,N,M,Write,ACK +3.534226450000000,131,N,I,Write,NAK +3.534465900000000,132,N,m,Write,NAK +3.534695410000000,133,N,i,Write,NAK +3.534929920000000,134,N,'253',Write,NAK +3.535159430000000,135,N,'249',Write,ACK +3.535398880000000,136,N,-,Write,NAK +3.535628270000000,137,N,),Write,NAK +3.535862710000000,138,N,\r,Write,ACK +3.536092100000000,139,N,\t,Write,NAK +3.536331550000000,140,N,m,Write,NAK +3.536561060000000,141,N,i,Write,NAK +3.536800440000000,142,N,'157',Write,NAK +3.537029830000000,144,N,'153',Write,Missing ACK/NAK +3.537269280000000,145,N,m,Write,NAK +3.537498790000000,146,N,i,Write,NAK +3.537733300000000,147,N,'253',Write,NAK +3.537962810000000,149,N,'249',Write,Missing ACK/NAK +3.538202200000000,150,N,},Write,NAK +3.538431590000000,151,N,y,Write,ACK +3.538666030000000,153,N,M,Write,Missing ACK/NAK +3.538895540000000,154,N,I,Write,ACK +3.539134990000000,156,N,-,Write,Missing ACK/NAK +3.539364380000000,157,N,),Write,NAK +3.539598890000000,158,N,\r,Write,NAK +3.539828400000000,159,N,\t,Write,NAK +5.539631070000000,160,N,'12',Write,ACK +5.539860460000000,161,N,'8',Write,ACK +5.540094960000000,162,N,'28',Write,ACK +5.540329480000000,163,N,'24',Write,ACK +5.542578540000000,164,N,'12',Write,ACK +5.542807930000000,165,N,'8',Write,ACK +5.543042440000000,166,N,COMMA,Write,ACK +5.543271950000000,167,N,(,Write,ACK +5.545525960000000,168,N,-,Write,ACK +5.545755340000000,169,N,),Write,NAK +5.545989850000000,170,N,\r,Write,NAK +5.546219360000000,171,N,\t,Write,ACK +5.546463870000000,172,N,},Write,NAK +5.546693260000000,173,N,y,Write,NAK +5.546927710000000,174,N,],Write,NAK +5.547157220000000,175,N,Y,Write,NAK +5.547396610000000,177,N,},Write,Missing ACK/NAK +5.547626110000000,178,N,y,Write,ACK +5.547860560000000,179,N,=,Write,ACK +5.548090070000000,180,N,9,Write,ACK +5.548329530000000,182,N,m,Write,Missing ACK/NAK +5.548558850000000,183,N,i,Write,NAK +5.548793300000000,184,N,],Write,ACK +5.549022800000000,185,N,Y,Write,NAK +5.549262190000000,186,N,},Write,NAK +5.549491580000000,187,N,y,Write,NAK +5.549726030000000,188,N,-,Write,ACK +5.549955540000000,189,N,),Write,NAK +5.550194980000000,190,N,m,Write,ACK +5.550424500000000,191,N,i,Write,NAK +5.550659010000000,192,N,'237',Write,NAK +5.550888390000000,193,N,'233',Write,ACK +5.551127840000000,194,N,m,Write,NAK +5.551357350000000,196,N,i,Write,Missing ACK/NAK +5.551596800000000,197,N,'29',Write,NAK +5.551826310000000,199,N,'25',Write,Missing ACK/NAK +5.552065760000000,200,N,m,Write,NAK +5.552295270000000,201,N,i,Write,NAK +5.552529660000000,202,N,'221',Write,NAK +5.552759170000000,203,N,'217',Write,NAK +5.552998610000000,204,N,m,Write,ACK +5.553228130000000,205,N,i,Write,NAK +5.553462570000000,206,N,],Write,ACK +5.553691900000000,207,N,Y,Write,NAK +5.553931350000000,208,N,=,Write,ACK +5.554160860000000,209,N,9,Write,NAK +5.554395310000000,210,N,'173',Write,ACK +5.554624820000000,211,N,'169',Write,NAK +5.554864260000000,212,N,-,Write,ACK +5.555093780000000,213,N,),Write,NAK +5.555328290000000,214,N,\r,Write,NAK +5.555557800000000,215,N,\t,Write,NAK +5.555802180000000,216,N,'204',Write,ACK +5.556031570000000,217,N,'200',Write,ACK +5.556266080000000,218,N,'12',Write,ACK +5.556495470000000,219,N,'8',Write,ACK +5.556745600000000,220,N,-,Write,NAK +5.556974980000000,221,N,),Write,ACK +5.557209500000000,222,N,\r,Write,NAK +5.557439010000000,223,N,\t,Write,NAK +5.557678390000000,225,N,m,Write,Missing ACK/NAK +5.557907780000000,226,N,i,Write,NAK +5.558142160000000,227,N,},Write,NAK +5.558371550000000,228,N,y,Write,NAK +5.558611000000000,229,N,m,Write,NAK +5.558840320000000,231,N,i,Write,Missing ACK/NAK +5.559074830000000,232,N,'253',Write,ACK +5.559304220000000,233,N,'249',Write,NAK +5.559543600000000,234,N,},Write,NAK +5.559778120000000,235,N,y,Write,NAK +5.560012560000000,236,N,m,Write,ACK +5.560242070000000,237,N,i,Write,ACK +5.560481460000000,238,N,},Write,NAK +5.560710850000000,239,N,y,Write,NAK +5.560945300000000,240,N,M,Write,NAK +5.561174810000000,241,N,I,Write,NAK +5.561414250000000,242,N,m,Write,ACK +5.561643770000000,243,N,i,Write,NAK +5.561878150000000,244,N,],Write,NAK +5.562107540000000,245,N,Y,Write,NAK +5.562346990000000,246,N,m,Write,ACK +5.562576500000000,247,N,i,Write,NAK +5.562810890000000,249,N,=,Write,Missing ACK/NAK +5.563040270000000,250,N,9,Write,NAK +5.563279720000000,251,N,m,Write,NAK +5.563509230000000,252,N,i,Write,NAK +5.563743680000000,253,N,'141',Write,NAK +5.563973190000000,254,N,'137',Write,NAK +5.564212570000000,255,N,},Write,ACK +5.564441960000000,256,N,y,Write,NAK +5.564676410000000,257,N,=,Write,NAK +5.564910920000000,258,N,9,Write,NAK +5.565150430000000,259,N,},Write,NAK +5.565379810000000,260,N,y,Write,ACK +5.565614260000000,261,N,M,Write,ACK +5.565843650000000,262,N,I,Write,NAK +5.566083040000000,263,N,m,Write,ACK +5.566312420000000,264,N,i,Write,NAK +5.566546870000000,265,N,'29',Write,NAK +5.566776260000000,266,N,'25',Write,NAK +5.567015640000000,267,N,m,Write,NAK +5.567245020000000,268,N,i,Write,NAK +5.567479480000000,269,N,=,Write,NAK +5.567708990000000,270,N,9,Write,NAK +5.567952120000000,271,N,m,Write,NAK +5.568181510000000,272,N,i,Write,NAK +5.568415900000000,273,N,'189',Write,ACK +5.568645280000000,274,N,'185',Write,NAK +5.568884730000000,275,N,-,Write,NAK +5.569114240000000,276,N,),Write,NAK +5.569348750000000,277,N,\r,Write,NAK +5.569578260000000,278,N,\t,Write,NAK +7.569381050000000,279,N,'12',Write,ACK +7.569610560000000,280,N,'8',Write,ACK +7.569845080000000,281,N,'28',Write,ACK +7.570074590000000,282,N,'24',Write,ACK +7.572323530000000,283,N,'12',Write,ACK +7.572553040000000,284,N,'8',Write,ACK +7.572787550000000,285,N,COMMA,Write,ACK +7.573017060000000,286,N,(,Write,ACK +7.575271130000000,287,N,-,Write,NAK +7.575500640000000,288,N,),Write,NAK +7.575735090000000,289,N,\r,Write,NAK +7.575964470000000,291,N,\t,Write,Missing ACK/NAK +7.576203860000000,292,N,},Write,NAK +7.576433240000000,293,N,y,Write,ACK +7.576667690000000,295,N,\r,Write,Missing ACK/NAK +7.576897080000000,296,N,\t,Write,NAK +7.577136530000000,297,N,m,Write,NAK +7.577366040000000,298,N,i,Write,NAK +7.577600490000000,299,N,'29',Write,NAK +7.577830000000000,300,N,'25',Write,NAK +7.578069380000000,302,N,},Write,Missing ACK/NAK +7.578298770000000,303,N,y,Write,NAK +7.578533220000000,304,N,=,Write,NAK +7.578762540000000,305,N,9,Write,NAK +7.579001930000000,306,N,},Write,NAK +7.579231310000000,307,N,y,Write,ACK +7.579465760000000,309,N,=,Write,Missing ACK/NAK +7.579700270000000,311,N,9,Write,Missing ACK/NAK +7.579939780000000,312,N,},Write,NAK +7.580169170000000,313,N,y,Write,NAK +7.580403550000000,314,N,},Write,ACK +7.580632940000000,315,N,y,Write,NAK +7.580872330000000,316,N,m,Write,NAK +7.581101710000000,318,N,i,Write,Missing ACK/NAK +7.581336220000000,320,N,'253',Write,Missing ACK/NAK +7.581565610000000,321,N,'249',Write,NAK +7.581805120000000,322,N,},Write,NAK +7.582034510000000,323,N,y,Write,NAK +7.582268960000000,324,N,-,Write,ACK +7.582498340000000,325,N,),Write,NAK +7.582739170000000,326,N,m,Write,ACK +7.582968680000000,327,N,i,Write,ACK +7.583203120000000,328,N,M,Write,ACK +7.583432510000000,329,N,I,Write,NAK +7.583671900000000,330,N,=,Write,ACK +7.583901280000000,331,N,9,Write,NAK +7.584135730000000,332,N,'173',Write,NAK +7.584365240000000,333,N,'169',Write,NAK +7.584604690000000,334,N,-,Write,NAK +7.584834200000000,335,N,),Write,NAK +7.585068710000000,336,N,\r,Write,NAK +7.585298220000000,337,N,\t,Write,NAK +7.585537670000000,338,N,-,Write,NAK +7.585767060000000,339,N,),Write,NAK +7.586001500000000,340,N,\r,Write,ACK +7.586230890000000,341,N,\t,Write,NAK +7.586470340000000,342,N,-,Write,NAK +7.586699720000000,343,N,),Write,NAK +7.586934170000000,344,N,\r,Write,ACK +7.587163560000000,345,N,\t,Write,NAK +7.587403010000000,346,N,-,Write,NAK +7.587632390000000,347,N,),Write,ACK +7.587871840000000,348,N,\r,Write,NAK +7.588101230000000,349,N,\t,Write,NAK +7.588340670000000,350,N,M,Write,ACK +7.588570060000000,351,N,I,Write,NAK +7.588804450000000,352,N,},Write,NAK +7.589033960000000,353,N,y,Write,NAK +7.589273410000000,354,N,=,Write,NAK +7.589502920000000,355,N,9,Write,NAK +7.589737430000000,356,N,\r,Write,NAK +7.589966750000000,358,N,\t,Write,Missing ACK/NAK +7.590211200000000,359,N,'204',Write,ACK +7.590440710000000,360,N,'200',Write,ACK +7.590675220000000,361,N,'12',Write,ACK +7.590904610000000,362,N,'8',Write,ACK +7.591149050000000,363,N,},Write,ACK +7.591378440000000,364,N,y,Write,NAK +7.591612890000000,365,N,m,Write,NAK +7.591842400000000,366,N,i,Write,NAK +7.592081780000000,367,N,],Write,ACK +7.592311170000000,368,N,Y,Write,NAK +7.592545620000000,369,N,M,Write,NAK +7.592775010000000,370,N,I,Write,NAK +7.593019390000000,371,N,=,Write,NAK +7.593248780000000,372,N,9,Write,NAK +7.593483220000000,373,N,=,Write,ACK +7.593712740000000,374,N,9,Write,NAK +7.593952120000000,375,N,m,Write,NAK +7.594181510000000,376,N,i,Write,NAK +7.594415960000000,377,N,=,Write,NAK +7.594645470000000,378,N,9,Write,NAK +7.594884920000000,379,N,M,Write,NAK +7.595114430000000,380,N,I,Write,NAK +7.595348880000000,381,N,'141',Write,NAK +7.595578260000000,382,N,'137',Write,ACK +7.595817710000000,383,N,-,Write,NAK +7.596048160000000,384,N,),Write,NAK +7.596282610000000,385,N,'29',Write,NAK +7.596511990000000,386,N,'25',Write,ACK +7.596751440000000,387,N,=,Write,NAK +7.596980950000000,388,N,9,Write,NAK +7.597215340000000,389,N,=,Write,NAK +7.597444720000000,390,N,9,Write,ACK +7.597684110000000,391,N,},Write,NAK +7.597913500000000,392,N,y,Write,ACK +7.598147880000000,393,N,=,Write,NAK +7.598377270000000,394,N,9,Write,NAK +7.598616720000000,395,N,],Write,ACK +7.598846220000000,396,N,Y,Write,NAK +7.599080680000000,397,N,\r,Write,NAK +7.599310060000000,399,N,\t,Write,Missing ACK/NAK +7.599549510000000,400,N,M,Write,NAK +7.599778900000000,401,N,I,Write,NAK +7.600013410000000,402,N,\r,Write,NAK +7.600242730000000,403,N,\t,Write,NAK +7.600482180000000,404,N,-,Write,NAK +7.600711570000000,405,N,),Write,NAK +7.600946010000000,406,N,M,Write,ACK +7.601180520000000,407,N,I,Write,ACK +7.601419970000000,408,N,-,Write,NAK +7.601649360000000,409,N,),Write,NAK +7.601883810000000,410,N,M,Write,NAK +7.602113200000000,411,N,I,Write,ACK +7.602352700000000,413,N,},Write,Missing ACK/NAK +7.602582090000000,414,N,y,Write,NAK +7.602816480000000,415,N,},Write,ACK +7.603045860000000,416,N,y,Write,NAK +7.603285240000000,417,N,=,Write,NAK +7.603514630000000,418,N,9,Write,ACK +7.603749140000000,419,N,\r,Write,ACK +7.603978650000000,420,N,\t,Write,NAK +7.604218040000000,421,N,},Write,NAK +7.604447550000000,423,N,y,Write,Missing ACK/NAK +7.604682000000000,424,N,-,Write,NAK +7.604911390000000,425,N,),Write,NAK +7.605150830000000,426,N,M,Write,ACK +7.605380350000000,427,N,I,Write,NAK +7.605614790000000,428,N,M,Write,ACK +7.605844180000000,429,N,I,Write,NAK +9.605647030000000,430,N,'12',Write,ACK +9.605876540000001,431,N,'8',Write,ACK +9.606111060000000,432,N,'28',Write,ACK +9.606340570000000,433,N,'24',Write,ACK +9.608589510000000,434,N,'12',Write,ACK +9.608824020000000,435,N,'8',Write,ACK +9.609058530000000,436,N,COMMA,Write,ACK +9.609288039999999,437,N,(,Write,ACK +9.611542099999999,438,N,-,Write,ACK +9.611771610000000,439,N,),Write,NAK +9.612006060000001,440,N,\r,Write,ACK +9.612235450000000,441,N,\t,Write,NAK +9.612474900000000,442,N,m,Write,NAK +9.612704409999999,443,N,i,Write,NAK +9.612938919999999,444,N,'189',Write,NAK +9.613168310000001,445,N,'185',Write,NAK +9.613407750000000,446,N,m,Write,ACK +9.613637260000001,447,N,i,Write,ACK +9.613871650000000,448,N,],Write,NAK +9.614101040000000,449,N,Y,Write,NAK +9.614340420000000,451,N,},Write,Missing ACK/NAK +9.614569810000001,452,N,y,Write,NAK +9.614804260000000,453,N,'157',Write,NAK +9.615033580000000,455,N,'153',Write,Missing ACK/NAK +9.615273030000001,456,N,=,Write,NAK +9.615502540000000,457,N,9,Write,NAK +9.615736990000000,458,N,'173',Write,NAK +9.615971500000001,459,N,'169',Write,NAK +9.616210949999999,460,N,-,Write,NAK +9.616440460000000,461,N,),Write,NAK +9.616674970000000,462,N,\r,Write,NAK +9.616904480000001,463,N,\t,Write,NAK +9.617143870000000,464,N,m,Write,ACK +9.617373250000000,466,N,i,Write,Missing ACK/NAK +9.617607700000001,467,N,M,Write,NAK +9.617837090000000,468,N,I,Write,NAK +9.618076479999999,470,N,m,Write,Missing ACK/NAK +9.618305860000000,471,N,i,Write,NAK +9.618540310000000,472,N,],Write,NAK +9.618769820000001,473,N,Y,Write,NAK +9.619009200000001,474,N,m,Write,ACK +9.619238590000000,475,N,i,Write,NAK +9.619473040000001,476,N,],Write,NAK +9.619702550000000,477,N,Y,Write,NAK +9.619941989999999,478,N,m,Write,NAK +9.620171320000001,479,N,i,Write,NAK +9.620405770000000,480,N,M,Write,NAK +9.620635150000000,481,N,I,Write,NAK +9.620874600000000,482,N,m,Write,ACK +9.621109110000001,483,N,i,Write,ACK +9.621343560000000,485,N,'29',Write,Missing ACK/NAK +9.621573079999999,486,N,'25',Write,ACK +9.621812520000001,487,N,=,Write,NAK +9.622042029999999,489,N,9,Write,Missing ACK/NAK +9.622276480000000,490,N,'29',Write,NAK +9.622505990000001,492,N,'25',Write,Missing ACK/NAK +9.622745439999999,493,N,=,Write,NAK +9.622974950000000,494,N,9,Write,NAK +9.623209400000000,495,N,'29',Write,NAK +9.623438910000001,496,N,'25',Write,NAK +9.623678360000000,497,N,=,Write,NAK +9.623907870000000,498,N,9,Write,NAK +9.624144129999999,499,N,=,Write,NAK +9.624373520000001,500,N,9,Write,NAK +9.624612969999999,501,N,=,Write,ACK +9.624842480000000,502,N,9,Write,NAK +9.625076860000000,503,N,},Write,NAK +9.625306370000001,504,N,y,Write,ACK +9.625545819999999,505,N,m,Write,NAK +9.625775330000000,506,N,i,Write,NAK +9.626009780000000,507,N,'29',Write,NAK +9.626239289999999,509,N,'25',Write,Missing ACK/NAK +9.626483739999999,510,N,'204',Write,ACK +9.626713250000000,511,N,'200',Write,ACK +9.626947760000000,512,N,'12',Write,ACK +9.627177150000000,513,N,'8',Write,ACK +9.627421660000000,514,N,m,Write,NAK +9.627651170000000,515,N,i,Write,NAK +9.627885620000001,516,N,-,Write,NAK +9.628114999999999,517,N,),Write,NAK +9.628354390000000,518,N,=,Write,NAK +9.628583770000001,519,N,9,Write,ACK +9.628818280000001,520,N,\r,Write,ACK +9.629047800000000,521,N,\t,Write,NAK +9.629292180000000,522,N,=,Write,NAK +9.629521570000000,523,N,9,Write,NAK +9.629756020000000,524,N,'29',Write,ACK +9.629985400000001,525,N,'25',Write,NAK +9.630224790000000,526,N,=,Write,NAK +9.630454170000000,527,N,9,Write,ACK +9.630688620000001,528,N,-,Write,NAK +9.630918010000000,529,N,),Write,NAK +9.631157460000001,530,N,=,Write,NAK +9.631386780000000,531,N,9,Write,NAK +9.631621290000000,532,N,\r,Write,NAK +9.631850800000000,533,N,\t,Write,NAK +9.632090249999999,534,N,=,Write,NAK +9.632319760000000,535,N,9,Write,NAK +9.632554210000000,536,N,-,Write,NAK +9.632783720000001,537,N,),Write,NAK +9.633023170000000,538,N,-,Write,NAK +9.633252550000000,539,N,),Write,ACK +9.633487000000001,540,N,\r,Write,NAK +9.633716390000000,541,N,\t,Write,NAK +11.633519090000000,542,N,'12',Write,ACK +11.633748470000000,543,N,'8',Write,ACK +11.633982919999999,544,N,'28',Write,ACK +11.634212310000001,545,N,'24',Write,ACK +11.636461250000000,546,N,'12',Write,ACK +11.636690630000000,547,N,'8',Write,ACK +11.636928709999999,548,N,COMMA,Write,ACK +11.637158220000000,549,N,(,Write,ACK +11.639412280000000,550,N,-,Write,ACK +11.639641800000000,551,N,),Write,ACK +11.639876240000000,552,N,\r,Write,ACK +11.640105630000001,553,N,\t,Write,NAK +11.640345079999999,554,N,],Write,NAK +11.640574590000000,555,N,Y,Write,NAK +11.640809040000001,556,N,'29',Write,NAK +11.641038549999999,557,N,'25',Write,NAK +11.641278000000000,558,N,m,Write,NAK +11.641507510000000,559,N,i,Write,NAK +11.641741890000000,561,N,'237',Write,Missing ACK/NAK +11.641971280000000,562,N,'233',Write,NAK +11.642210790000000,563,N,},Write,NAK +11.642440179999999,564,N,y,Write,NAK +11.642674619999999,565,N,=,Write,ACK +11.642904140000001,566,N,9,Write,NAK +11.643143589999999,568,N,-,Write,Missing ACK/NAK +11.643373100000000,569,N,),Write,ACK +11.643607610000000,570,N,\r,Write,NAK +11.643837110000000,571,N,\t,Write,NAK +11.644081500000000,572,N,m,Write,NAK +11.644310890000000,573,N,i,Write,NAK +11.644545400000000,574,N,'253',Write,NAK +11.644774790000000,575,N,'249',Write,ACK +11.645014170000000,576,N,m,Write,NAK +11.645243560000001,577,N,i,Write,NAK +11.645478010000000,578,N,m,Write,ACK +11.645707509999999,579,N,i,Write,NAK +11.645946960000000,580,N,-,Write,ACK +11.646176470000000,581,N,),Write,ACK +11.646410990000000,582,N,\r,Write,NAK +11.646640489999999,583,N,\t,Write,NAK +11.646879880000000,585,N,},Write,Missing ACK/NAK +11.647109270000000,586,N,y,Write,NAK +11.647343720000000,587,N,M,Write,NAK +11.647573230000001,588,N,I,Write,NAK +11.647812679999999,589,N,m,Write,NAK +11.648042190000000,590,N,i,Write,NAK +11.648276640000001,591,N,'141',Write,ACK +11.648506149999999,592,N,'137',Write,NAK +11.648745600000000,593,N,m,Write,ACK +11.648975110000000,594,N,i,Write,NAK +11.649213870000001,595,N,],Write,NAK +11.649443260000000,596,N,Y,Write,ACK +11.649682700000000,597,N,-,Write,NAK +11.649912090000001,598,N,),Write,NAK +11.650146540000000,599,N,\r,Write,NAK +11.650375920000000,601,N,\t,Write,Missing ACK/NAK +11.650615370000001,602,N,m,Write,NAK +11.650844879999999,603,N,i,Write,NAK +11.651079330000000,604,N,M,Write,NAK +11.651308840000000,605,N,I,Write,NAK +11.651548289999999,606,N,m,Write,NAK +11.651777800000000,607,N,i,Write,NAK +11.652012250000000,608,N,'29',Write,NAK +11.652241760000001,609,N,'25',Write,NAK +11.652481140000001,610,N,},Write,ACK +11.652710530000000,611,N,y,Write,NAK +11.652944979999999,612,N,'157',Write,NAK +11.653174490000000,613,N,'153',Write,NAK +11.653418869999999,614,N,'204',Write,ACK +11.653648260000001,615,N,'200',Write,ACK +11.653882769999999,616,N,'12',Write,ACK +11.654112160000000,617,N,'8',Write,ACK +11.654356670000000,618,N,-,Write,NAK +11.654586060000000,619,N,),Write,ACK +11.654820559999999,620,N,\r,Write,ACK +11.655050080000001,621,N,\t,Write,NAK +11.655289470000000,622,N,=,Write,NAK +11.655518850000000,623,N,9,Write,NAK +11.655753349999999,624,N,'253',Write,NAK +11.655982740000001,625,N,'249',Write,ACK +11.656222189999999,627,N,=,Write,Missing ACK/NAK +11.656451519999999,628,N,9,Write,NAK +11.656686029999999,629,N,'253',Write,NAK +11.656915410000000,630,N,'249',Write,ACK +11.657154860000000,631,N,=,Write,NAK +11.657389370000001,633,N,9,Write,Missing ACK/NAK +11.657623879999999,634,N,'253',Write,NAK +11.657853390000000,635,N,'249',Write,ACK +11.658092840000000,636,N,=,Write,NAK +11.658322350000001,637,N,9,Write,ACK +11.658556859999999,638,N,'253',Write,ACK +11.658786370000000,639,N,'249',Write,NAK +11.659025820000000,641,N,=,Write,Missing ACK/NAK +11.659255330000001,642,N,9,Write,ACK +11.659489850000000,643,N,'253',Write,ACK +11.659719360000000,644,N,'249',Write,NAK +11.659958809999999,645,N,=,Write,ACK +11.660188320000000,646,N,9,Write,NAK +11.660422830000000,647,N,'253',Write,NAK +11.660652340000000,648,N,'249',Write,NAK +11.660891790000001,649,N,=,Write,ACK +11.661121300000000,650,N,9,Write,NAK +11.661360000000000,651,N,'253',Write,ACK +11.661589380000001,652,N,'249',Write,NAK +11.661828829999999,653,N,=,Write,NAK +11.662058340000000,654,N,9,Write,NAK +11.662292850000000,655,N,'253',Write,NAK +11.662522360000001,656,N,'249',Write,NAK +11.662761809999999,657,N,=,Write,NAK +11.662991320000000,658,N,9,Write,NAK +11.663225830000000,659,N,'253',Write,NAK +11.663455219999999,660,N,'249',Write,NAK +11.663694599999999,662,N,=,Write,Missing ACK/NAK +11.663923990000001,663,N,9,Write,NAK +11.664158499999999,664,N,'253',Write,NAK +11.664387890000000,665,N,'249',Write,NAK +11.664627270000000,667,N,=,Write,Missing ACK/NAK +11.664856660000000,668,N,9,Write,NAK +11.665091170000000,669,N,'253',Write,NAK +11.665320560000000,670,N,'249',Write,NAK +11.665564939999999,671,N,=,Write,NAK +11.665794330000001,672,N,9,Write,NAK +11.666028839999999,673,N,'253',Write,NAK +11.666258220000000,674,N,'249',Write,ACK +11.666497610000000,675,N,=,Write,NAK +11.666727000000000,676,N,9,Write,ACK +11.666961510000000,677,N,'253',Write,NAK +11.667190890000001,679,N,'249',Write,Missing ACK/NAK +11.667430339999999,680,N,=,Write,NAK +11.667659660000000,681,N,9,Write,ACK +11.667894170000000,682,N,'253',Write,NAK +11.668123560000000,683,N,'249',Write,NAK +11.668363010000000,684,N,-,Write,NAK +11.668592400000000,685,N,),Write,NAK +11.668826839999999,686,N,\r,Write,ACK +11.669056230000001,687,N,\t,Write,NAK +13.668859030000000,688,N,'12',Write,ACK +13.669093540000000,689,N,'8',Write,ACK +13.669328060000000,690,N,'28',Write,ACK +13.669557570000000,691,N,'24',Write,ACK +13.671806510000000,692,N,'12',Write,ACK +13.672035890000000,693,N,'8',Write,ACK +13.672270340000001,694,N,COMMA,Write,ACK +13.672499730000000,695,N,(,Write,ACK +13.674753730000001,696,N,],Write,NAK +13.674983120000000,697,N,Y,Write,NAK +13.675217630000001,698,N,},Write,NAK +13.675447020000000,699,N,y,Write,NAK +13.675686460000000,700,N,m,Write,NAK +13.675915970000000,701,N,i,Write,ACK +13.676150420000001,702,N,'141',Write,NAK +13.676379930000000,703,N,'137',Write,ACK +13.676619380000000,704,N,m,Write,NAK +13.676848890000000,705,N,i,Write,ACK +13.677083339999999,706,N,],Write,NAK +13.677312669999999,707,N,Y,Write,ACK +13.677552120000000,709,N,m,Write,Missing ACK/NAK +13.677781619999999,710,N,i,Write,ACK +13.678016010000000,711,N,'237',Write,NAK +13.678245400000000,712,N,'233',Write,NAK +13.678484839999999,713,N,-,Write,ACK +13.678714350000000,714,N,),Write,ACK +13.678948860000000,715,N,\r,Write,NAK +13.679178380000000,716,N,\t,Write,NAK +13.679417890000000,717,N,},Write,NAK +13.679647270000000,718,N,y,Write,ACK +13.679881659999999,719,N,},Write,NAK +13.680111050000001,720,N,y,Write,NAK +13.680355430000001,721,N,m,Write,NAK +13.680584820000000,722,N,i,Write,NAK +13.680819260000000,723,N,'29',Write,ACK +13.681048649999999,725,N,'25',Write,Missing ACK/NAK +13.681288040000000,726,N,},Write,NAK +13.681517550000001,727,N,y,Write,NAK +13.681751999999999,728,N,=,Write,ACK +13.681981510000000,729,N,9,Write,NAK +13.682220960000000,730,N,-,Write,ACK +13.682450469999999,731,N,),Write,NAK +13.682684979999999,732,N,\r,Write,NAK +13.682914490000000,733,N,\t,Write,NAK +13.683153940000000,734,N,m,Write,NAK +13.683383449999999,735,N,i,Write,NAK +13.683617959999999,736,N,},Write,NAK +13.683847340000000,737,N,y,Write,ACK +13.684086790000000,739,N,m,Write,Missing ACK/NAK +13.684316300000001,740,N,i,Write,ACK +13.684550809999999,741,N,'253',Write,NAK +13.684780330000001,742,N,'249',Write,NAK +13.685019710000001,743,N,},Write,NAK +13.685249100000000,744,N,y,Write,NAK +13.685488480000000,746,N,m,Write,Missing ACK/NAK +13.685717870000000,747,N,i,Write,NAK +13.685957250000000,748,N,},Write,ACK +13.686186640000001,749,N,y,Write,NAK +13.686421090000000,750,N,M,Write,NAK +13.686650600000000,751,N,I,Write,NAK +13.686890050000001,752,N,m,Write,NAK +13.687119559999999,753,N,i,Write,NAK +13.687354010000000,754,N,],Write,NAK +13.687583330000001,755,N,Y,Write,NAK +13.687822779999999,756,N,m,Write,NAK +13.688052290000000,757,N,i,Write,NAK +13.688286740000001,758,N,=,Write,NAK +13.688516249999999,759,N,9,Write,NAK +13.688755640000000,760,N,m,Write,ACK +13.688985020000001,761,N,i,Write,NAK +13.689219469999999,762,N,'141',Write,NAK +13.689448860000001,763,N,'137',Write,NAK +13.689693240000000,764,N,'204',Write,ACK +13.689922630000000,765,N,'200',Write,ACK +13.690157140000000,766,N,'12',Write,ACK +13.690386520000001,767,N,'8',Write,ACK +13.690631030000000,768,N,-,Write,ACK +13.690860420000000,769,N,),Write,NAK +13.691094930000000,770,N,\r,Write,NAK +13.691324440000001,771,N,\t,Write,ACK +13.691563830000000,772,N,m,Write,NAK +13.691793210000000,773,N,i,Write,ACK +13.692027660000001,774,N,m,Write,NAK +13.692257170000000,775,N,i,Write,ACK +13.692496620000000,776,N,m,Write,NAK +13.692725950000000,777,N,i,Write,ACK +13.692960460000000,778,N,'253',Write,NAK +13.693189840000001,779,N,'249',Write,ACK +13.693429230000000,780,N,},Write,NAK +13.693663740000000,781,N,y,Write,NAK +13.693898190000001,782,N,],Write,ACK +13.694127699999999,783,N,Y,Write,NAK +13.694367150000000,784,N,m,Write,ACK +13.694596660000000,785,N,i,Write,NAK +13.694831170000000,786,N,'237',Write,NAK +13.695060550000001,787,N,'233',Write,NAK +13.695300010000000,788,N,m,Write,NAK +13.695529510000000,789,N,i,Write,ACK +13.695763960000001,790,N,M,Write,NAK +13.695993469999999,791,N,I,Write,ACK +13.696232920000000,792,N,m,Write,NAK +13.696462430000000,793,N,i,Write,NAK +13.696696820000000,794,N,],Write,NAK +13.696926200000000,795,N,Y,Write,ACK +13.697165650000001,796,N,m,Write,NAK +13.697395159999999,797,N,i,Write,ACK +13.697629610000000,798,N,M,Write,NAK +13.697859120000000,799,N,I,Write,ACK +13.698098570000001,800,N,=,Write,NAK +13.698328080000000,802,N,9,Write,Missing ACK/NAK +13.698562590000000,804,N,'253',Write,Missing ACK/NAK +13.698797100000000,806,N,'249',Write,Missing ACK/NAK +13.699036550000001,807,N,-,Write,NAK +13.699265940000000,808,N,),Write,NAK +13.699500450000000,809,N,\r,Write,NAK +13.699729960000001,810,N,\t,Write,NAK +15.699532789999999,811,N,'12',Write,ACK +15.699762300000000,812,N,'8',Write,ACK +15.699996810000000,813,N,'28',Write,ACK +15.700226320000001,814,N,'24',Write,ACK +15.702475390000000,815,N,'12',Write,ACK +15.702704779999999,816,N,'8',Write,ACK +15.702939290000000,817,N,COMMA,Write,ACK +15.703168800000000,818,N,(,Write,ACK +15.705422739999999,819,N,},Write,NAK +15.705652120000000,820,N,y,Write,ACK +15.705886630000000,821,N,\r,Write,ACK +15.706116150000000,822,N,\t,Write,ACK +15.706355589999999,823,N,-,Write,ACK +15.706585110000001,824,N,),Write,ACK +15.706819490000001,825,N,'237',Write,NAK +15.707048869999999,826,N,'233',Write,NAK +15.707288260000000,827,N,},Write,NAK +15.707517770000001,828,N,y,Write,ACK +15.707752220000000,829,N,=,Write,NAK +15.707981730000000,831,N,9,Write,Missing ACK/NAK +15.708221180000001,832,N,-,Write,NAK +15.708455689999999,833,N,),Write,NAK +15.708690199999999,834,N,\r,Write,NAK +15.708919720000001,835,N,\t,Write,ACK +15.709159100000001,836,N,},Write,NAK +15.709388490000000,837,N,y,Write,ACK +15.709622939999999,838,N,M,Write,ACK +15.709852440000001,839,N,I,Write,NAK +15.710091889999999,840,N,m,Write,NAK +15.710321400000000,841,N,i,Write,ACK +15.710555850000000,843,N,'141',Write,Missing ACK/NAK +15.710785359999999,844,N,'137',Write,ACK +15.711024810000000,845,N,m,Write,NAK +15.711254320000000,846,N,i,Write,ACK +15.711488709999999,847,N,],Write,NAK +15.711718090000000,848,N,Y,Write,ACK +15.711957540000000,849,N,-,Write,NAK +15.712186930000000,850,N,),Write,NAK +15.712421440000000,851,N,\r,Write,NAK +15.712650760000001,852,N,\t,Write,ACK +15.712890150000000,853,N,},Write,NAK +15.713119539999999,854,N,y,Write,NAK +15.713353980000001,855,N,M,Write,ACK +15.713588489999999,856,N,I,Write,ACK +15.713827940000000,857,N,m,Write,NAK +15.714057450000000,858,N,i,Write,ACK +15.714291899999999,860,N,'157',Write,Missing ACK/NAK +15.714521410000000,862,N,'153',Write,Missing ACK/NAK +15.714760800000001,863,N,m,Write,NAK +15.714990179999999,864,N,i,Write,ACK +15.715224570000000,865,N,'221',Write,NAK +15.715453960000000,866,N,'217',Write,NAK +15.715693340000000,867,N,m,Write,NAK +15.715922730000001,868,N,i,Write,NAK +15.716157180000000,869,N,],Write,NAK +15.716386690000000,870,N,Y,Write,NAK +15.716626140000001,871,N,-,Write,NAK +15.716855649999999,872,N,),Write,NAK +15.717090160000000,873,N,\r,Write,NAK +15.717319670000000,874,N,\t,Write,NAK +15.717559059999999,875,N,},Write,ACK +15.717788560000001,876,N,y,Write,NAK +15.718022950000000,877,N,},Write,NAK +15.718252339999999,878,N,y,Write,NAK +15.718491780000001,879,N,m,Write,ACK +15.718721110000001,880,N,i,Write,NAK +15.718955559999999,881,N,'29',Write,NAK +15.719184940000000,882,N,'25',Write,ACK +15.719424330000001,883,N,},Write,NAK +15.719653720000000,884,N,y,Write,NAK +15.719888100000000,885,N,=,Write,NAK +15.720117490000000,886,N,9,Write,NAK +15.720361940000000,887,N,'204',Write,ACK +15.720591440000000,888,N,'200',Write,ACK +15.720825960000001,889,N,'12',Write,ACK +15.721055470000000,890,N,'8',Write,ACK +15.721299849999999,892,N,-,Write,Missing ACK/NAK +15.721529240000001,893,N,),Write,NAK +15.721768689999999,894,N,\r,Write,NAK +15.721998070000000,896,N,\t,Write,Missing ACK/NAK +15.722237520000000,897,N,=,Write,NAK +15.722467030000001,898,N,9,Write,NAK +15.722701420000000,899,N,'157',Write,NAK +15.722930800000000,900,N,'153',Write,ACK +15.723170250000001,901,N,=,Write,NAK +15.723399770000000,902,N,9,Write,ACK +15.723634210000000,903,N,'173',Write,NAK +15.723863540000000,904,N,'169',Write,NAK +15.724102980000000,905,N,=,Write,NAK +15.724332499999999,906,N,9,Write,ACK +15.724567000000000,907,N,\r,Write,ACK +15.724796520000000,908,N,\t,Write,NAK +15.725035900000000,909,N,=,Write,NAK +15.725265289999999,910,N,9,Write,NAK +15.725499740000000,911,N,m,Write,ACK +15.725729250000001,912,N,i,Write,NAK +15.725968630000001,913,N,=,Write,NAK +15.726198020000000,914,N,9,Write,NAK +15.726432470000001,915,N,'173',Write,NAK +15.726661979999999,916,N,'169',Write,NAK +15.726906359999999,918,N,=,Write,Missing ACK/NAK +15.727135750000000,919,N,9,Write,NAK +15.727370199999999,920,N,],Write,NAK +15.727599710000000,921,N,Y,Write,NAK +15.727839090000000,922,N,=,Write,ACK +15.728068479999999,923,N,9,Write,NAK +15.728303000000000,925,N,\r,Write,Missing ACK/NAK +15.728532500000000,926,N,\t,Write,ACK +15.728771950000001,927,N,-,Write,NAK +15.729001470000000,928,N,),Write,ACK +15.729235970000000,929,N,\r,Write,NAK +15.729465480000000,930,N,\t,Write,NAK +15.729704930000000,931,N,M,Write,NAK +15.729934450000000,932,N,I,Write,ACK +15.730168830000000,933,N,},Write,NAK +15.730398210000001,934,N,y,Write,NAK +15.730637659999999,936,N,M,Write,Missing ACK/NAK +15.730867050000001,937,N,I,Write,NAK +15.731101560000001,938,N,'221',Write,NAK +15.731330950000000,939,N,'217',Write,NAK +15.731570390000000,940,N,],Write,ACK +15.731799909999999,941,N,Y,Write,NAK +15.732034349999999,942,N,M,Write,ACK +15.732263870000001,943,N,I,Write,NAK +15.732503310000000,944,N,-,Write,ACK +15.732732700000000,945,N,),Write,NAK +15.732967090000001,946,N,'189',Write,NAK +15.733196599999999,947,N,'185',Write,NAK +15.733436050000000,948,N,=,Write,ACK +15.733665560000000,949,N,9,Write,NAK +15.733900070000001,950,N,\r,Write,NAK +15.734129390000000,951,N,\t,Write,NAK +15.734368840000000,952,N,=,Write,NAK +15.734598350000001,953,N,9,Write,NAK +15.734832800000000,954,N,'141',Write,NAK +15.735067310000000,955,N,'137',Write,NAK +15.735306760000000,956,N,-,Write,NAK +15.735536140000001,958,N,),Write,Missing ACK/NAK +15.735770660000000,959,N,\r,Write,ACK +15.736000160000000,960,N,\t,Write,ACK +17.735802929999998,961,N,'12',Write,ACK +17.736032320000000,962,N,'8',Write,ACK +17.736266830000002,963,N,'28',Write,ACK +17.736496339999999,964,N,'24',Write,ACK +17.739010220000001,965,N,'12',Write,ACK +17.739239609999998,966,N,'8',Write,ACK +17.739474120000001,967,N,COMMA,Write,ACK +17.739703440000000,968,N,(,Write,ACK +17.741952510000001,969,N,=,Write,NAK +17.742182020000001,970,N,9,Write,NAK +17.742416530000000,971,N,\r,Write,NAK +17.742646050000001,972,N,\t,Write,ACK +17.742885430000001,973,N,=,Write,NAK +17.743114819999999,974,N,9,Write,NAK +17.743349259999999,975,N,'157',Write,ACK +17.743578780000000,976,N,'153',Write,ACK +17.743818220000001,977,N,-,Write,NAK +17.744047739999999,978,N,),Write,ACK +17.744282250000001,979,N,'253',Write,ACK +17.744511630000002,981,N,'249',Write,Missing ACK/NAK +17.744756020000001,982,N,=,Write,NAK +17.744985400000001,983,N,9,Write,NAK +17.745219850000002,984,N,'29',Write,NAK +17.745449239999999,985,N,'25',Write,NAK +17.745688619999999,986,N,=,Write,NAK +17.745918010000000,987,N,9,Write,NAK +17.746152460000001,988,N,'29',Write,NAK +17.746381840000002,989,N,'25',Write,ACK +17.746621290000000,990,N,-,Write,NAK +17.746850800000001,991,N,),Write,NAK +17.747085309999999,993,N,'253',Write,Missing ACK/NAK +17.747314700000000,994,N,'249',Write,NAK +17.747554139999998,995,N,=,Write,NAK +17.747783660000000,996,N,9,Write,NAK +17.748018110000000,997,N,-,Write,NAK +17.748247620000001,998,N,),Write,NAK +17.748487059999999,999,N,=,Write,ACK +17.748719520000002,1000,N,9,Write,ACK +17.748954019999999,1001,N,\r,Write,ACK +17.749183540000001,1002,N,\t,Write,NAK +17.749422979999999,1003,N,-,Write,NAK +17.749652370000000,1004,N,),Write,NAK +17.749886820000000,1005,N,\r,Write,NAK +17.750116210000002,1006,N,\t,Write,NAK +17.750355649999999,1007,N,=,Write,NAK +17.750585160000000,1008,N,9,Write,ACK +17.750819610000001,1010,N,'29',Write,Missing ACK/NAK +17.751049120000001,1011,N,'25',Write,ACK +17.751288570000000,1012,N,=,Write,NAK +17.751518080000000,1014,N,9,Write,Missing ACK/NAK +17.751752589999999,1015,N,\r,Write,ACK +17.751981919999999,1016,N,\t,Write,NAK +17.752221360000000,1017,N,=,Write,NAK +17.752450880000001,1018,N,9,Write,NAK +17.752685320000001,1019,N,'173',Write,NAK +17.752919840000001,1020,N,'169',Write,ACK +17.753159220000001,1021,N,=,Write,NAK +17.753388609999998,1022,N,9,Write,NAK +17.753623059999999,1023,N,M,Write,NAK +17.753852439999999,1024,N,I,Write,NAK +17.754091830000000,1025,N,=,Write,NAK +17.754321210000001,1026,N,9,Write,ACK +17.754555660000001,1027,N,M,Write,NAK +17.754785049999999,1028,N,I,Write,NAK +17.755024429999999,1030,N,=,Write,Missing ACK/NAK +17.755253820000000,1031,N,9,Write,NAK +17.755488270000001,1032,N,'173',Write,NAK +17.755717780000001,1033,N,'169',Write,NAK +17.755957169999999,1034,N,=,Write,ACK +17.756186549999999,1035,N,9,Write,NAK +17.756421000000000,1036,N,],Write,NAK +17.756650510000000,1037,N,Y,Write,NAK +17.756894960000000,1038,N,'204',Write,ACK +17.757124279999999,1039,N,'200',Write,ACK +17.757358790000001,1040,N,'12',Write,ACK +17.757588179999999,1041,N,'8',Write,ACK +17.757872620000001,1042,N,=,Write,NAK +17.758102130000001,1043,N,9,Write,NAK +17.758336640000000,1044,N,\r,Write,NAK +17.758566150000000,1045,N,\t,Write,NAK +17.758805599999999,1046,N,-,Write,NAK +17.759034979999999,1047,N,),Write,ACK +17.759269430000000,1048,N,\r,Write,NAK +17.759498810000000,1049,N,\t,Write,NAK +17.759738270000000,1050,N,-,Write,NAK +17.759967650000000,1052,N,),Write,Missing ACK/NAK +17.760202100000001,1053,N,\r,Write,NAK +17.760431489999998,1054,N,\t,Write,NAK +17.760670930000000,1055,N,-,Write,ACK +17.760900320000001,1056,N,),Write,NAK +17.761139770000000,1057,N,\r,Write,NAK +17.761369160000001,1058,N,\t,Write,ACK +17.761608599999999,1059,N,-,Write,ACK +17.761837990000000,1060,N,),Write,NAK +17.762072440000001,1061,N,\r,Write,NAK +17.762301820000001,1062,N,\t,Write,ACK +17.762541270000000,1063,N,-,Write,NAK +17.762770660000001,1064,N,),Write,NAK +17.763005170000000,1065,N,\r,Write,NAK +17.763234489999999,1067,N,\t,Write,Missing ACK/NAK +17.763473940000001,1068,N,-,Write,NAK +17.763703320000001,1069,N,),Write,NAK +17.763937840000001,1070,N,\r,Write,NAK +17.764170279999998,1071,N,\t,Write,NAK +17.764409730000001,1073,N,-,Write,Missing ACK/NAK +17.764639119999998,1074,N,),Write,NAK +17.764873630000000,1075,N,\r,Write,NAK +17.765103140000001,1076,N,\t,Write,NAK +17.765342520000001,1077,N,=,Write,NAK +17.765571909999998,1078,N,9,Write,ACK +17.765806359999999,1079,N,M,Write,NAK +17.766035750000000,1080,N,I,Write,NAK +17.766275130000000,1082,N,=,Write,Missing ACK/NAK +17.766504520000002,1083,N,9,Write,NAK +17.766738969999999,1084,N,m,Write,NAK +17.766968479999999,1085,N,i,Write,NAK +17.767207859999999,1086,N,=,Write,ACK +17.767437250000000,1087,N,9,Write,NAK +17.767671700000001,1088,N,'29',Write,NAK +17.767901080000001,1089,N,'25',Write,NAK +17.768140530000000,1090,N,=,Write,NAK +17.768369860000000,1091,N,9,Write,NAK +17.768604310000001,1092,N,'29',Write,ACK +17.768833690000001,1094,N,'25',Write,Missing ACK/NAK +17.769073140000000,1095,N,=,Write,NAK +17.769307649999998,1096,N,9,Write,NAK +17.769542160000000,1097,N,},Write,NAK +17.769771550000002,1098,N,y,Write,NAK +17.770010989999999,1099,N,=,Write,ACK +17.770240510000001,1100,N,9,Write,ACK +17.770475009999998,1101,N,},Write,NAK +17.770704400000000,1102,N,y,Write,ACK +17.770943849999998,1103,N,-,Write,NAK +17.771173240000000,1104,N,),Write,NAK +17.771407690000000,1105,N,\r,Write,NAK +17.771637070000001,1107,N,\t,Write,Missing ACK/NAK +22.770782229999998,1108,N,'12',Write,ACK +22.771011619999999,1109,N,'8',Write,ACK +22.771246130000002,1110,N,'28',Write,ACK +22.771480640000000,1111,N,'24',Write,ACK +22.773729639999999,1112,N,'12',Write,ACK +22.773959150000000,1113,N,'8',Write,ACK +22.774193660000002,1114,N,COMMA,Write,ACK +22.774425239999999,1115,N,(,Write,ACK +22.776674239999998,1116,N,=,Write,NAK +22.776903749999999,1118,N,9,Write,Missing ACK/NAK +22.777138260000001,1119,N,\r,Write,ACK +22.777367770000001,1120,N,\t,Write,ACK +22.777612160000000,1121,N,=,Write,NAK +22.777841540000001,1122,N,9,Write,ACK +22.778075990000001,1123,N,'157',Write,ACK +22.778305509999999,1124,N,'153',Write,ACK +22.778544960000001,1125,N,-,Write,NAK +22.778774460000001,1127,N,),Write,Missing ACK/NAK +22.779008970000000,1128,N,'253',Write,ACK +22.779238360000001,1129,N,'249',Write,NAK +22.779477809999999,1130,N,=,Write,NAK +22.779707129999998,1132,N,9,Write,Missing ACK/NAK +22.779941579999999,1133,N,'29',Write,NAK +22.780170960000000,1134,N,'25',Write,NAK +22.780410410000002,1135,N,=,Write,ACK +22.780639919999999,1136,N,9,Write,NAK +22.780874369999999,1137,N,'29',Write,ACK +22.781103890000001,1138,N,'25',Write,NAK +22.781343329999999,1140,N,-,Write,Missing ACK/NAK +22.781572720000000,1141,N,),Write,NAK +22.781807229999998,1142,N,'253',Write,NAK +22.782036739999999,1144,N,'249',Write,Missing ACK/NAK +22.782276190000001,1145,N,=,Write,NAK +22.782505700000002,1146,N,9,Write,NAK +22.782745150000000,1147,N,-,Write,NAK +22.782974660000001,1148,N,),Write,NAK +22.783214109999999,1149,N,=,Write,NAK +22.783443620000000,1150,N,9,Write,NAK +22.783678070000001,1151,N,\r,Write,NAK +22.783907450000001,1152,N,\t,Write,ACK +22.784146900000000,1153,N,-,Write,NAK +22.784376290000001,1154,N,),Write,NAK +22.784610799999999,1155,N,\r,Write,NAK +22.784840119999998,1156,N,\t,Write,NAK +22.785079570000001,1157,N,=,Write,NAK +22.785309080000001,1158,N,9,Write,NAK +22.785543530000002,1159,N,'29',Write,NAK +22.785772919999999,1160,N,'25',Write,ACK +22.786012299999999,1161,N,=,Write,NAK +22.786241690000001,1162,N,9,Write,NAK +22.786476199999999,1163,N,\r,Write,NAK +22.786710580000001,1164,N,\t,Write,ACK +22.786949969999998,1165,N,=,Write,NAK +22.787179479999999,1166,N,9,Write,NAK +22.787413930000000,1167,N,'173',Write,NAK +22.787643440000000,1168,N,'169',Write,NAK +22.787882830000001,1169,N,=,Write,ACK +22.788112210000001,1170,N,9,Write,NAK +22.788346659999998,1171,N,M,Write,NAK +22.788576039999999,1172,N,I,Write,NAK +22.788815430000000,1173,N,=,Write,NAK +22.789044820000001,1174,N,9,Write,NAK +22.789279270000002,1175,N,],Write,NAK +22.789508779999998,1176,N,Y,Write,NAK +22.789748220000000,1177,N,=,Write,ACK +22.789977550000000,1178,N,9,Write,NAK +22.790211990000000,1179,N,'173',Write,NAK +22.790441500000000,1180,N,'169',Write,NAK +22.790680949999999,1181,N,=,Write,ACK +22.790915470000002,1182,N,9,Write,ACK +22.791149850000000,1184,N,],Write,Missing ACK/NAK +22.791379240000001,1185,N,Y,Write,NAK +22.791623680000001,1186,N,'204',Write,ACK +22.791853190000001,1187,N,'200',Write,ACK +22.792087710000001,1188,N,'12',Write,ACK +22.792317220000001,1189,N,'8',Write,ACK +22.792601650000002,1190,N,=,Write,NAK +22.792831039999999,1192,N,9,Write,Missing ACK/NAK +22.793065490000000,1193,N,\r,Write,NAK +22.793294880000001,1194,N,\t,Write,NAK +22.793534330000000,1195,N,-,Write,ACK +22.793763710000000,1197,N,),Write,Missing ACK/NAK +22.794003159999999,1198,N,\r,Write,NAK +22.794232539999999,1199,N,\t,Write,ACK +22.794471990000002,1200,N,-,Write,NAK +22.794701379999999,1201,N,),Write,NAK +22.794935830000000,1202,N,\r,Write,NAK +22.795165210000000,1203,N,\t,Write,ACK +22.795404659999999,1204,N,-,Write,NAK +22.795634050000000,1205,N,),Write,NAK +22.795868559999999,1206,N,\r,Write,NAK +22.796097880000001,1207,N,\t,Write,NAK +22.796337330000000,1208,N,-,Write,NAK +22.796566710000000,1209,N,),Write,NAK +22.796801230000000,1210,N,\r,Write,NAK +22.797030740000000,1211,N,\t,Write,NAK +22.797270180000002,1212,N,-,Write,ACK +22.797499699999999,1213,N,),Write,NAK +22.797734210000002,1214,N,\r,Write,NAK +22.797963719999998,1215,N,\t,Write,NAK +22.798203170000001,1216,N,-,Write,NAK +22.798432680000001,1217,N,),Write,NAK +22.798667190000000,1218,N,\r,Write,NAK +22.798896700000000,1219,N,\t,Write,NAK +22.799140019999999,1221,N,-,Write,Missing ACK/NAK +22.799369410000001,1222,N,),Write,NAK +22.799603919999999,1223,N,\r,Write,NAK +22.799833430000000,1224,N,\t,Write,NAK +22.800072810000000,1225,N,=,Write,NAK +22.800302200000001,1227,N,9,Write,Missing ACK/NAK +22.800536650000002,1228,N,'29',Write,NAK +22.800766039999999,1229,N,'25',Write,NAK +22.801005490000001,1230,N,=,Write,ACK +22.801234810000000,1231,N,9,Write,NAK +22.801469319999999,1232,N,\r,Write,NAK +22.801698829999999,1233,N,\t,Write,NAK +22.801938280000002,1234,N,=,Write,NAK +22.802172790000000,1235,N,9,Write,NAK +22.802407299999999,1236,N,},Write,NAK +22.802636679999999,1237,N,y,Write,NAK +22.802876130000001,1238,N,=,Write,NAK +22.803105639999998,1239,N,9,Write,ACK +22.803340030000001,1240,N,=,Write,NAK +22.803569419999999,1241,N,9,Write,NAK +22.803808870000001,1242,N,=,Write,ACK +22.804038370000001,1243,N,9,Write,NAK +22.804272820000001,1244,N,\r,Write,ACK +22.804502209999999,1245,N,\t,Write,NAK +22.804741660000001,1246,N,=,Write,NAK +22.804971170000002,1247,N,9,Write,NAK +22.805205560000001,1248,N,},Write,ACK +22.805435070000001,1249,N,y,Write,NAK +22.805674520000000,1250,N,-,Write,ACK +22.805903900000001,1251,N,),Write,NAK +22.806138409999999,1253,N,\r,Write,Missing ACK/NAK +22.806367739999999,1254,N,\t,Write,NAK +27.805517980000001,1255,N,'12',Write,ACK +27.805747499999999,1256,N,'8',Write,ACK +27.805982010000001,1257,N,'28',Write,ACK +27.806211520000002,1258,N,'24',Write,ACK +27.808460520000001,1259,N,'12',Write,ACK +27.808690030000001,1260,N,'8',Write,ACK +27.808924540000000,1261,N,COMMA,Write,ACK +27.809154060000001,1262,N,(,Write,ACK +27.811403060000000,1263,N,=,Write,NAK +27.811632450000001,1264,N,9,Write,ACK +27.811866960000000,1265,N,\r,Write,NAK +27.812096470000000,1266,N,\t,Write,NAK +27.812335919999999,1267,N,=,Write,ACK +27.812565240000001,1268,N,9,Write,NAK +27.812799689999999,1269,N,'157',Write,NAK +27.813029199999999,1270,N,'153',Write,NAK +27.813268650000001,1271,N,-,Write,NAK +27.813498030000002,1273,N,),Write,Missing ACK/NAK +27.813732540000000,1275,N,'253',Write,Missing ACK/NAK +27.813962060000001,1276,N,'249',Write,ACK +27.814201499999999,1277,N,=,Write,NAK +27.814431020000001,1279,N,9,Write,Missing ACK/NAK +27.814665460000001,1280,N,'29',Write,NAK +27.814894970000001,1281,N,'25',Write,ACK +27.815134420000000,1282,N,=,Write,NAK +27.815363930000000,1284,N,9,Write,Missing ACK/NAK +27.815603379999999,1285,N,'29',Write,NAK +27.815832889999999,1286,N,'25',Write,NAK +27.816072340000002,1287,N,-,Write,NAK +27.816301729999999,1288,N,),Write,ACK +27.816536240000001,1289,N,'253',Write,NAK +27.816765749999998,1290,N,'249',Write,NAK +27.817005190000000,1291,N,=,Write,ACK +27.817234710000001,1292,N,9,Write,ACK +27.817469150000001,1293,N,-,Write,ACK +27.817698660000001,1294,N,),Write,ACK +27.817938110000000,1295,N,=,Write,NAK +27.818167620000001,1296,N,9,Write,ACK +27.818402140000000,1297,N,\r,Write,ACK +27.818631650000000,1298,N,\t,Write,NAK +27.818871099999999,1299,N,-,Write,ACK +27.819100610000000,1300,N,),Write,NAK +27.819335120000002,1301,N,\r,Write,NAK +27.819564629999999,1302,N,\t,Write,NAK +27.819804009999999,1304,N,=,Write,Missing ACK/NAK +27.820033400000000,1305,N,9,Write,NAK +27.820267850000000,1306,N,'29',Write,NAK +27.820497230000001,1307,N,'25',Write,ACK +27.820741620000000,1308,N,=,Write,NAK +27.820971000000000,1309,N,9,Write,ACK +27.821205509999999,1310,N,\r,Write,ACK +27.821435030000000,1311,N,\t,Write,NAK +27.821674410000000,1312,N,=,Write,NAK +27.821903800000001,1313,N,9,Write,NAK +27.822138249999998,1314,N,'173',Write,NAK +27.822367759999999,1315,N,'169',Write,NAK +27.822607210000001,1316,N,=,Write,ACK +27.822836530000000,1317,N,9,Write,NAK +27.823070980000001,1318,N,M,Write,NAK +27.823300360000001,1319,N,I,Write,ACK +27.823539810000000,1320,N,=,Write,NAK +27.823772259999998,1321,N,9,Write,NAK +27.824006709999999,1322,N,m,Write,NAK +27.824236220000000,1323,N,i,Write,NAK +27.824475670000002,1324,N,=,Write,ACK +27.824705179999999,1325,N,9,Write,NAK +27.824939560000001,1326,N,'173',Write,ACK +27.825168949999998,1327,N,'169',Write,NAK +27.825408400000001,1328,N,=,Write,NAK +27.825637910000001,1329,N,9,Write,NAK +27.825872300000000,1330,N,],Write,NAK +27.826101680000001,1332,N,Y,Write,Missing ACK/NAK +27.826346130000001,1333,N,'204',Write,ACK +27.826575640000001,1334,N,'200',Write,ACK +27.826810150000000,1335,N,'12',Write,ACK +27.827039660000001,1336,N,'8',Write,ACK +27.827324099999998,1337,N,=,Write,NAK +27.827553479999999,1338,N,9,Write,NAK +27.827787930000000,1339,N,\r,Write,ACK +27.828017320000001,1340,N,\t,Write,NAK +27.828256769999999,1341,N,-,Write,NAK +27.828486150000000,1342,N,),Write,ACK +27.828720669999999,1343,N,\r,Write,ACK +27.828949990000002,1344,N,\t,Write,NAK +27.829189440000000,1345,N,-,Write,NAK +27.829418830000002,1346,N,),Write,ACK +27.829653329999999,1348,N,\r,Write,Missing ACK/NAK +27.829882840000000,1349,N,\t,Write,ACK +27.830122299999999,1350,N,-,Write,NAK +27.830351799999999,1351,N,),Write,ACK +27.830586310000001,1352,N,\r,Write,ACK +27.830815829999999,1353,N,\t,Write,NAK +27.831055270000000,1354,N,-,Write,ACK +27.831284780000001,1355,N,),Write,ACK +27.831519300000000,1356,N,\r,Write,NAK +27.831748810000001,1357,N,\t,Write,NAK +27.831993260000001,1358,N,-,Write,ACK +27.832222770000001,1359,N,),Write,NAK +27.832457280000000,1360,N,\r,Write,ACK +27.832686780000000,1361,N,\t,Write,NAK +27.832926230000002,1362,N,-,Write,ACK +27.833155750000000,1363,N,),Write,NAK +27.833390260000002,1364,N,\r,Write,NAK +27.833619769999999,1365,N,\t,Write,NAK +27.833859220000001,1366,N,-,Write,NAK +27.834088730000001,1367,N,),Write,NAK +27.834323240000000,1368,N,\r,Write,NAK +27.834552750000000,1369,N,\t,Write,NAK +27.834792199999999,1370,N,=,Write,NAK +27.835021709999999,1371,N,9,Write,NAK +27.835256160000000,1372,N,-,Write,ACK +27.835485670000001,1373,N,),Write,NAK +27.835725119999999,1374,N,=,Write,ACK +27.835954630000000,1375,N,9,Write,NAK +27.836189009999998,1376,N,=,Write,NAK +27.836418399999999,1377,N,9,Write,NAK +27.836657850000002,1378,N,=,Write,NAK +27.836887359999999,1379,N,9,Write,NAK +27.837126120000001,1380,N,=,Write,NAK +27.837355509999998,1381,N,9,Write,ACK +27.837594950000000,1382,N,=,Write,NAK +27.837824470000001,1383,N,9,Write,ACK +27.838058849999999,1384,N,},Write,NAK +27.838288360000000,1385,N,y,Write,NAK +27.838527809999999,1386,N,=,Write,NAK +27.838757319999999,1387,N,9,Write,NAK +27.838991770000000,1388,N,'157',Write,NAK +27.839221089999999,1390,N,'153',Write,Missing ACK/NAK +27.839460540000001,1391,N,=,Write,NAK +27.839690050000002,1392,N,9,Write,NAK +27.839924560000000,1393,N,\r,Write,NAK +27.840154070000001,1394,N,\t,Write,ACK +27.840393519999999,1395,N,-,Write,NAK +27.840623030000000,1396,N,),Write,NAK +27.840857539999998,1397,N,\r,Write,NAK +27.841087060000000,1398,N,\t,Write,ACK +32.840231950000003,1399,N,'12',Write,ACK +32.840461329999997,1400,N,'8',Write,ACK +32.840695840000002,1401,N,'28',Write,ACK +32.840925349999999,1402,N,'24',Write,ACK +32.843174359999999,1403,N,'12',Write,ACK +32.843403870000003,1404,N,'8',Write,ACK +32.843638380000002,1405,N,COMMA,Write,ACK +32.843867889999999,1406,N,(,Write,ACK +32.846116960000003,1407,N,=,Write,NAK +32.846346470000000,1408,N,9,Write,NAK +32.846580920000001,1409,N,\r,Write,NAK +32.846810300000001,1411,N,\t,Write,Missing ACK/NAK +32.847049749999996,1412,N,=,Write,NAK +32.847279260000001,1414,N,9,Write,Missing ACK/NAK +32.847513650000003,1415,N,'157',Write,NAK +32.847743039999997,1416,N,'153',Write,ACK +32.847982479999999,1417,N,-,Write,NAK +32.848211870000000,1418,N,),Write,NAK +32.848446379999999,1419,N,'253',Write,NAK +32.848675890000003,1420,N,'249',Write,NAK +32.848915339999998,1421,N,=,Write,NAK +32.849144850000002,1422,N,9,Write,NAK +32.849383480000000,1423,N,'29',Write,ACK +32.849612870000001,1424,N,'25',Write,NAK +32.849852319999997,1425,N,=,Write,NAK +32.850081830000001,1426,N,9,Write,NAK +32.850316280000001,1427,N,'29',Write,NAK +32.850545789999998,1428,N,'25',Write,NAK +32.850785240000000,1429,N,-,Write,NAK +32.851014620000001,1431,N,),Write,Missing ACK/NAK +32.851249129999999,1432,N,'253',Write,ACK +32.851478520000001,1433,N,'249',Write,NAK +32.851717899999997,1434,N,=,Write,ACK +32.851947289999998,1435,N,9,Write,NAK +32.852181739999999,1436,N,-,Write,NAK +32.852411130000000,1437,N,),Write,NAK +32.852650509999997,1438,N,=,Write,NAK +32.852879899999998,1439,N,9,Write,NAK +32.853114410000003,1440,N,\r,Write,NAK +32.853343920000000,1441,N,\t,Write,NAK +32.853588360000003,1442,N,-,Write,NAK +32.853817880000001,1443,N,),Write,NAK +32.854052390000000,1444,N,\r,Write,NAK +32.854281899999997,1445,N,\t,Write,NAK +32.854521290000001,1446,N,=,Write,ACK +32.854750670000001,1447,N,9,Write,NAK +32.854985120000002,1448,N,'29',Write,NAK +32.855214510000003,1449,N,'25',Write,NAK +32.855453949999998,1450,N,=,Write,ACK +32.855683280000001,1451,N,9,Write,NAK +32.855917789999999,1452,N,\r,Write,NAK +32.856147300000003,1453,N,\t,Write,NAK +32.856386739999998,1454,N,=,Write,NAK +32.856616260000003,1455,N,9,Write,NAK +32.856850639999998,1456,N,'173',Write,ACK +32.857080029999999,1457,N,'169',Write,NAK +32.857319480000001,1458,N,=,Write,NAK +32.857548989999998,1459,N,9,Write,NAK +32.857783439999999,1460,N,M,Write,NAK +32.858012950000003,1461,N,I,Write,NAK +32.858252389999997,1462,N,=,Write,NAK +32.858481910000002,1463,N,9,Write,NAK +32.858721420000002,1464,N,},Write,NAK +32.858950800000002,1465,N,y,Write,ACK +32.859190249999997,1467,N,=,Write,Missing ACK/NAK +32.859419760000002,1468,N,9,Write,ACK +32.859654149999997,1469,N,'173',Write,NAK +32.859883539999998,1470,N,'169',Write,NAK +32.860122980000000,1471,N,=,Write,NAK +32.860352499999998,1472,N,9,Write,ACK +32.860586939999997,1474,N,],Write,Missing ACK/NAK +32.860816270000001,1475,N,Y,Write,NAK +32.861060709999997,1476,N,'204',Write,ACK +32.861290220000001,1477,N,'200',Write,ACK +32.861524740000000,1478,N,'12',Write,ACK +32.861754120000001,1479,N,'8',Write,ACK +32.862038560000002,1480,N,=,Write,NAK +32.862268069999999,1481,N,9,Write,NAK +32.862502579999997,1482,N,\r,Write,NAK +32.862732090000002,1483,N,\t,Write,ACK +32.862971539999997,1484,N,-,Write,NAK +32.863201050000001,1486,N,),Write,Missing ACK/NAK +32.863435559999999,1487,N,\r,Write,NAK +32.863665070000003,1488,N,\t,Write,ACK +32.863904519999998,1489,N,-,Write,NAK +32.864134040000003,1491,N,),Write,Missing ACK/NAK +32.864368540000001,1493,N,\r,Write,Missing ACK/NAK +32.864598059999999,1494,N,\t,Write,ACK +32.864837500000000,1495,N,-,Write,NAK +32.865067009999997,1497,N,),Write,Missing ACK/NAK +32.865301530000004,1498,N,\r,Write,ACK +32.865531040000000,1499,N,\t,Write,ACK +32.865770490000003,1500,N,-,Write,ACK +32.865999989999999,1501,N,),Write,ACK +32.866234509999998,1502,N,\r,Write,ACK +32.866464020000002,1503,N,\t,Write,NAK +32.866703459999997,1504,N,-,Write,ACK +32.866932970000001,1505,N,),Write,NAK +32.867167490000000,1506,N,\r,Write,NAK +32.867396999999997,1507,N,\t,Write,NAK +32.867636439999998,1508,N,-,Write,NAK +32.867865830000000,1510,N,),Write,Missing ACK/NAK +32.868100280000000,1511,N,\r,Write,NAK +32.868329670000001,1512,N,\t,Write,NAK +32.868569110000003,1513,N,-,Write,ACK +32.868798499999997,1514,N,),Write,NAK +32.869032949999998,1515,N,\r,Write,NAK +32.869262339999999,1516,N,\t,Write,NAK +32.869501780000000,1517,N,=,Write,ACK +32.869731289999997,1518,N,9,Write,NAK +32.869970799999997,1519,N,},Write,ACK +32.870200189999998,1520,N,y,Write,NAK +32.870439640000001,1521,N,=,Write,NAK +32.870669149999998,1522,N,9,Write,NAK +32.870903599999998,1523,N,-,Write,NAK +32.871133110000002,1524,N,),Write,NAK +32.871372559999998,1525,N,=,Write,NAK +32.871602070000002,1526,N,9,Write,NAK +32.871836520000002,1527,N,-,Write,ACK +32.872066029999999,1528,N,),Write,NAK +32.872305480000001,1529,N,=,Write,ACK +32.872534989999998,1530,N,9,Write,NAK +32.872769429999998,1531,N,-,Write,ACK +32.872998819999999,1532,N,),Write,NAK +32.873238209999997,1533,N,=,Write,NAK +32.873467589999997,1535,N,9,Write,Missing ACK/NAK +32.873701980000000,1536,N,},Write,NAK +32.873931370000001,1537,N,y,Write,NAK +32.874170749999998,1538,N,=,Write,NAK +32.874400139999999,1539,N,9,Write,NAK +32.874634520000001,1540,N,},Write,NAK +32.874863910000002,1541,N,y,Write,NAK +32.875108349999998,1542,N,-,Write,ACK +32.875337870000003,1543,N,),Write,NAK +32.875572380000001,1544,N,\r,Write,NAK +32.875801889999998,1545,N,\t,Write,NAK diff --git a/stack-2020/iot-challenge-5/writeup/arduino-i2c/iot-5/iot-5.ino b/stack-2020/iot-challenge-5/writeup/arduino-i2c/iot-5/iot-5.ino new file mode 100644 index 0000000..6d54fe0 --- /dev/null +++ b/stack-2020/iot-challenge-5/writeup/arduino-i2c/iot-5/iot-5.ino @@ -0,0 +1,33 @@ +#include +#include + +LiquidCrystal_I2C lcd(0x27,16,2); + +void setup() { + // put your setup code here, to run once: + Serial.begin(9600); + lcd.init(); + lcd.backlight(); + + delay(500); + lcd.clear(); +// lcd.print("Hello"); + +} + +void loop() { +// put your main code here, to run repeatedly: +// Serial.println("hello"); + +// Wire.beginTransmission(0x27); + if(Serial.available()){ + Wire.beginTransmission(0x27); + String str=Serial.readStringUntil('\n'); + byte x=str.toInt(); + Serial.println(x); + Wire.write(x); + Wire.endTransmission(); + } +// Wire.endTransmission(); +// delay(100); +} diff --git a/stack-2020/iot-challenge-5/writeup/arduino-i2c/processed.csv b/stack-2020/iot-challenge-5/writeup/arduino-i2c/processed.csv new file mode 100644 index 0000000..f0aaa0f --- /dev/null +++ b/stack-2020/iot-challenge-5/writeup/arduino-i2c/processed.csv @@ -0,0 +1,1443 @@ +0 +52 +48 +52 +48 +52 +48 +36 +32 +36 +32 +132 +128 +4 +0 +196 +192 +4 +0 +20 +16 +4 +0 +100 +96 +0 +8 +12 +8 +44 +40 +45 +41 +13 +9 +109 +105 +125 +121 +109 +105 +253 +249 +125 +121 +109 +105 +125 +121 +77 +73 +109 +105 +93 +89 +109 +105 +61 +57 +109 +105 +141 +137 +45 +41 +13 +9 +109 +105 +61 +57 +125 +121 +77 +73 +109 +105 +109 +105 +45 +41 +13 +9 +204 +200 +12 +8 +45 +41 +13 +9 +125 +121 +125 +121 +109 +105 +93 +89 +109 +105 +205 +201 +109 +105 +61 +57 +109 +105 +253 +249 +109 +105 +221 +217 +109 +105 +93 +89 +45 +41 +13 +9 +125 +121 +77 +73 +109 +105 +253 +249 +45 +41 +13 +9 +109 +105 +157 +153 +109 +105 +253 +249 +125 +121 +77 +73 +45 +41 +13 +9 +12 +8 +28 +24 +12 +8 +44 +40 +45 +41 +13 +9 +125 +121 +93 +89 +125 +121 +61 +57 +109 +105 +93 +89 +125 +121 +45 +41 +109 +105 +237 +233 +109 +105 +29 +25 +109 +105 +221 +217 +109 +105 +93 +89 +61 +57 +173 +169 +45 +41 +13 +9 +204 +200 +12 +8 +45 +41 +13 +9 +109 +105 +125 +121 +109 +105 +253 +249 +125 +121 +109 +105 +125 +121 +77 +73 +109 +105 +93 +89 +109 +105 +61 +57 +109 +105 +141 +137 +125 +121 +61 +57 +125 +121 +77 +73 +109 +105 +29 +25 +109 +105 +61 +57 +109 +105 +189 +185 +45 +41 +13 +9 +12 +8 +28 +24 +12 +8 +44 +40 +45 +41 +13 +9 +125 +121 +13 +9 +109 +105 +29 +25 +125 +121 +61 +57 +125 +121 +61 +57 +125 +121 +125 +121 +109 +105 +253 +249 +125 +121 +45 +41 +109 +105 +77 +73 +61 +57 +173 +169 +45 +41 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +77 +73 +125 +121 +61 +57 +13 +9 +204 +200 +12 +8 +125 +121 +109 +105 +93 +89 +77 +73 +61 +57 +61 +57 +109 +105 +61 +57 +77 +73 +141 +137 +45 +41 +29 +25 +61 +57 +61 +57 +125 +121 +61 +57 +93 +89 +13 +9 +77 +73 +13 +9 +45 +41 +77 +73 +45 +41 +77 +73 +125 +121 +125 +121 +61 +57 +13 +9 +125 +121 +45 +41 +77 +73 +77 +73 +12 +8 +28 +24 +12 +8 +44 +40 +45 +41 +13 +9 +109 +105 +189 +185 +109 +105 +93 +89 +125 +121 +157 +153 +61 +57 +173 +169 +45 +41 +13 +9 +109 +105 +77 +73 +109 +105 +93 +89 +109 +105 +93 +89 +109 +105 +77 +73 +109 +105 +29 +25 +61 +57 +29 +25 +61 +57 +29 +25 +61 +57 +61 +57 +61 +57 +125 +121 +109 +105 +29 +25 +204 +200 +12 +8 +109 +105 +45 +41 +61 +57 +13 +9 +61 +57 +29 +25 +61 +57 +45 +41 +61 +57 +13 +9 +61 +57 +45 +41 +45 +41 +13 +9 +12 +8 +28 +24 +12 +8 +44 +40 +45 +41 +13 +9 +93 +89 +29 +25 +109 +105 +237 +233 +125 +121 +61 +57 +45 +41 +13 +9 +109 +105 +253 +249 +109 +105 +109 +105 +45 +41 +13 +9 +125 +121 +77 +73 +109 +105 +141 +137 +109 +105 +93 +89 +45 +41 +13 +9 +109 +105 +77 +73 +109 +105 +29 +25 +125 +121 +157 +153 +204 +200 +12 +8 +45 +41 +13 +9 +61 +57 +253 +249 +61 +57 +253 +249 +61 +57 +253 +249 +61 +57 +253 +249 +61 +57 +253 +249 +61 +57 +253 +249 +61 +57 +253 +249 +61 +57 +253 +249 +61 +57 +253 +249 +61 +57 +253 +249 +61 +57 +253 +249 +61 +57 +253 +249 +61 +57 +253 +249 +61 +57 +253 +249 +45 +41 +13 +9 +12 +8 +28 +24 +12 +8 +44 +40 +93 +89 +125 +121 +109 +105 +141 +137 +109 +105 +93 +89 +109 +105 +237 +233 +45 +41 +13 +9 +125 +121 +125 +121 +109 +105 +29 +25 +125 +121 +61 +57 +45 +41 +13 +9 +109 +105 +125 +121 +109 +105 +253 +249 +125 +121 +109 +105 +125 +121 +77 +73 +109 +105 +93 +89 +109 +105 +61 +57 +109 +105 +141 +137 +204 +200 +12 +8 +45 +41 +13 +9 +109 +105 +109 +105 +109 +105 +253 +249 +125 +121 +93 +89 +109 +105 +237 +233 +109 +105 +77 +73 +109 +105 +93 +89 +109 +105 +77 +73 +61 +57 +253 +249 +45 +41 +13 +9 +12 +8 +28 +24 +12 +8 +44 +40 +125 +121 +13 +9 +45 +41 +237 +233 +125 +121 +61 +57 +45 +41 +13 +9 +125 +121 +77 +73 +109 +105 +141 +137 +109 +105 +93 +89 +45 +41 +13 +9 +125 +121 +77 +73 +109 +105 +157 +153 +109 +105 +221 +217 +109 +105 +93 +89 +45 +41 +13 +9 +125 +121 +125 +121 +109 +105 +29 +25 +125 +121 +61 +57 +204 +200 +12 +8 +45 +41 +13 +9 +61 +57 +157 +153 +61 +57 +173 +169 +61 +57 +13 +9 +61 +57 +109 +105 +61 +57 +173 +169 +61 +57 +93 +89 +61 +57 +13 +9 +45 +41 +13 +9 +77 +73 +125 +121 +77 +73 +221 +217 +93 +89 +77 +73 +45 +41 +189 +185 +61 +57 +13 +9 +61 +57 +141 +137 +45 +41 +13 +9 +12 +8 +28 +24 +12 +8 +44 +40 +61 +57 +13 +9 +61 +57 +157 +153 +45 +41 +253 +249 +61 +57 +29 +25 +61 +57 +29 +25 +45 +41 +253 +249 +61 +57 +45 +41 +61 +57 +13 +9 +45 +41 +13 +9 +61 +57 +29 +25 +61 +57 +13 +9 +61 +57 +173 +169 +61 +57 +77 +73 +61 +57 +77 +73 +61 +57 +173 +169 +61 +57 +93 +89 +204 +200 +12 +8 +61 +57 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +61 +57 +77 +73 +61 +57 +109 +105 +61 +57 +29 +25 +61 +57 +29 +25 +61 +57 +125 +121 +61 +57 +125 +121 +45 +41 +13 +9 +12 +8 +28 +24 +12 +8 +44 +40 +61 +57 +13 +9 +61 +57 +157 +153 +45 +41 +253 +249 +61 +57 +29 +25 +61 +57 +29 +25 +45 +41 +253 +249 +61 +57 +45 +41 +61 +57 +13 +9 +45 +41 +13 +9 +61 +57 +29 +25 +61 +57 +13 +9 +61 +57 +173 +169 +61 +57 +77 +73 +61 +57 +93 +89 +61 +57 +173 +169 +61 +57 +93 +89 +204 +200 +12 +8 +61 +57 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +61 +57 +29 +25 +61 +57 +13 +9 +61 +57 +125 +121 +61 +57 +61 +57 +61 +57 +13 +9 +61 +57 +125 +121 +45 +41 +13 +9 +12 +8 +28 +24 +12 +8 +44 +40 +61 +57 +13 +9 +61 +57 +157 +153 +45 +41 +253 +249 +61 +57 +29 +25 +61 +57 +29 +25 +45 +41 +253 +249 +61 +57 +45 +41 +61 +57 +13 +9 +45 +41 +13 +9 +61 +57 +29 +25 +61 +57 +13 +9 +61 +57 +173 +169 +61 +57 +77 +73 +61 +57 +109 +105 +61 +57 +173 +169 +61 +57 +93 +89 +204 +200 +12 +8 +61 +57 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +61 +57 +45 +41 +61 +57 +61 +57 +61 +57 +61 +57 +61 +57 +125 +121 +61 +57 +157 +153 +61 +57 +13 +9 +45 +41 +13 +9 +12 +8 +28 +24 +12 +8 +44 +40 +61 +57 +13 +9 +61 +57 +157 +153 +45 +41 +253 +249 +61 +57 +29 +25 +61 +57 +29 +25 +45 +41 +253 +249 +61 +57 +45 +41 +61 +57 +13 +9 +45 +41 +13 +9 +61 +57 +29 +25 +61 +57 +13 +9 +61 +57 +173 +169 +61 +57 +77 +73 +61 +57 +125 +121 +61 +57 +173 +169 +61 +57 +93 +89 +204 +200 +12 +8 +61 +57 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +45 +41 +13 +9 +61 +57 +125 +121 +61 +57 +45 +41 +61 +57 +45 +41 +61 +57 +45 +41 +61 +57 +125 +121 +61 +57 +125 +121 +45 +41 +13 +9 diff --git a/stack-2020/iot-challenge-5/writeup/arduino-i2c/utility.py b/stack-2020/iot-challenge-5/writeup/arduino-i2c/utility.py new file mode 100644 index 0000000..169ddf2 --- /dev/null +++ b/stack-2020/iot-challenge-5/writeup/arduino-i2c/utility.py @@ -0,0 +1,74 @@ +# out=(0b1111<<4) | 0b1000 +# print(out) + +import serial +import sys +import os +import numpy as np +import pandas as pd +import ast +import time + + +def main(): + + print("textin") + convertNumpy("textin") + print("traces") + convertNumpy("traces") + return + + dir=os.getcwd() + path=os.path.join(dir,"decoded_i2c.txt") + outPath=os.path.join(dir,"processed.csv") + in_data=pd.read_csv(path,sep=',') + vectConvert=np.vectorize(convertStr,otypes=[np.int32]) + data_np=vectConvert(in_data["Data"].to_numpy()) + print(data_np) + np.savetxt(outPath,data_np,fmt="%i",delimiter="\t") + +class sender(): + # For sending stuff to arduino + def __init__(self,serialPath="/dev/ttyACM0",csvPath="processed.csv"): + # Opens serial port and loads data from file + self.serObj=serial.Serial(serialPath,9600) + self.data=np.genfromtxt(os.path.join(os.getcwd(),csvPath),dtype=np.int32) + self.index=0 + print(self.data) + + def send_a_bunch(self,n): + # Sends n lines of data to Arduino + startIndex=self.index + for i in range(n): + toSend=self.data[startIndex+i] + toSend=(str(toSend)+"\n") + print(toSend) + self.serObj.write(toSend.encode()) + self.index+=1 + # Some delay is necessary to let the LCD respond + time.sleep(0.1) + +def convertStr(string): + # converts shittily formatted string into nice integers so that we can feed it to arduino + # print(string) + if(string=="' '"): + return 32 + elif(string=="COMMA"): + return 44 + elif(string[0]=="'"): + return int(string.strip(string[0])) + elif(string=="\\r"): + return 13 + elif(string=="\\t"): + return 9 + else: + return ord(string) + +def convertNumpy(fileName): + path=os.path.join(os.getcwd(),"RESULT",fileName+".npy") + array=np.load(path) + print(array) + np.savetxt(os.path.join(os.getcwd(),"RESULT",fileName+".txt"),array,delimiter="\t") + +if __name__=="__main__": + main() \ No newline at end of file diff --git a/stack-2020/iot-challenge-5/writeup/pictures/1.png b/stack-2020/iot-challenge-5/writeup/pictures/1.png new file mode 100644 index 0000000..c4c258a Binary files /dev/null and b/stack-2020/iot-challenge-5/writeup/pictures/1.png differ diff --git a/stack-2020/iot-challenge-5/writeup/pictures/10.jpg b/stack-2020/iot-challenge-5/writeup/pictures/10.jpg new file mode 100644 index 0000000..aa332da Binary files /dev/null and b/stack-2020/iot-challenge-5/writeup/pictures/10.jpg differ diff --git a/stack-2020/iot-challenge-5/writeup/pictures/2.png b/stack-2020/iot-challenge-5/writeup/pictures/2.png new file mode 100644 index 0000000..3b5ed6c Binary files /dev/null and b/stack-2020/iot-challenge-5/writeup/pictures/2.png differ diff --git a/stack-2020/iot-challenge-5/writeup/pictures/3.png b/stack-2020/iot-challenge-5/writeup/pictures/3.png new file mode 100644 index 0000000..4a36869 Binary files /dev/null and b/stack-2020/iot-challenge-5/writeup/pictures/3.png differ diff --git a/stack-2020/iot-challenge-5/writeup/pictures/4.png b/stack-2020/iot-challenge-5/writeup/pictures/4.png new file mode 100644 index 0000000..b085efd Binary files /dev/null and b/stack-2020/iot-challenge-5/writeup/pictures/4.png differ diff --git a/stack-2020/iot-challenge-5/writeup/pictures/5.png b/stack-2020/iot-challenge-5/writeup/pictures/5.png new file mode 100644 index 0000000..de16d0d Binary files /dev/null and b/stack-2020/iot-challenge-5/writeup/pictures/5.png differ diff --git a/stack-2020/iot-challenge-5/writeup/pictures/6.png b/stack-2020/iot-challenge-5/writeup/pictures/6.png new file mode 100644 index 0000000..198ad46 Binary files /dev/null and b/stack-2020/iot-challenge-5/writeup/pictures/6.png differ diff --git a/stack-2020/iot-challenge-5/writeup/pictures/7.jpg b/stack-2020/iot-challenge-5/writeup/pictures/7.jpg new file mode 100644 index 0000000..e935bee Binary files /dev/null and b/stack-2020/iot-challenge-5/writeup/pictures/7.jpg differ diff --git a/stack-2020/iot-challenge-5/writeup/pictures/8.jpg b/stack-2020/iot-challenge-5/writeup/pictures/8.jpg new file mode 100644 index 0000000..c1e46ca Binary files /dev/null and b/stack-2020/iot-challenge-5/writeup/pictures/8.jpg differ diff --git a/stack-2020/iot-challenge-5/writeup/pictures/9.jpg b/stack-2020/iot-challenge-5/writeup/pictures/9.jpg new file mode 100644 index 0000000..3bd2e74 Binary files /dev/null and b/stack-2020/iot-challenge-5/writeup/pictures/9.jpg differ diff --git a/stack-2020/iot-challenge-5/writeup/pictures/Screenshot from 2020-12-10 12-55-51.png b/stack-2020/iot-challenge-5/writeup/pictures/Screenshot from 2020-12-10 12-55-51.png new file mode 100644 index 0000000..d16adcb Binary files /dev/null and b/stack-2020/iot-challenge-5/writeup/pictures/Screenshot from 2020-12-10 12-55-51.png differ diff --git a/stack-2020/iot-challenge-5/writeup/pictures/Screenshot from 2020-12-10 12-59-09.png b/stack-2020/iot-challenge-5/writeup/pictures/Screenshot from 2020-12-10 12-59-09.png new file mode 100644 index 0000000..0f0bdb0 Binary files /dev/null and b/stack-2020/iot-challenge-5/writeup/pictures/Screenshot from 2020-12-10 12-59-09.png differ diff --git a/stack-2020/iot-challenge-5/writeup/pictures/distr-graph.png b/stack-2020/iot-challenge-5/writeup/pictures/distr-graph.png new file mode 100644 index 0000000..90ee3a4 Binary files /dev/null and b/stack-2020/iot-challenge-5/writeup/pictures/distr-graph.png differ diff --git a/stack-2020/iot-challenge-5/writeup/pictures/rsa_token_setup.png b/stack-2020/iot-challenge-5/writeup/pictures/rsa_token_setup.png new file mode 100644 index 0000000..2747af6 Binary files /dev/null and b/stack-2020/iot-challenge-5/writeup/pictures/rsa_token_setup.png differ diff --git a/stack-2020/iot-challenge-5/writeup/token-generation/key-analysis.xlsx b/stack-2020/iot-challenge-5/writeup/token-generation/key-analysis.xlsx new file mode 100644 index 0000000..447cd9a Binary files /dev/null and b/stack-2020/iot-challenge-5/writeup/token-generation/key-analysis.xlsx differ diff --git a/stack-2020/iot-challenge-5/writeup/token-generation/key-dist.csv b/stack-2020/iot-challenge-5/writeup/token-generation/key-dist.csv new file mode 100644 index 0000000..abe5b43 --- /dev/null +++ b/stack-2020/iot-challenge-5/writeup/token-generation/key-dist.csv @@ -0,0 +1,469 @@ +Generating tokens between: +Mon Nov 9 08:42:00 2020 +Thu Dec 10 18:02:17 2020 +Total keys generated: 22601 +Number of unique keys: 464 +835746 6082 +997494 1208 +578454 1142 +461177 1044 +233790 962 +779476 721 +779954 568 +189054 468 +798569 382 +976961 320 +236795 312 +396570 282 +533152 272 +743997 255 +777507 255 +395139 250 +172572 222 +119032 208 +749353 204 +743539 202 +303574 196 +773899 168 +571193 158 +779423 156 +387393 156 +417765 136 +138591 124 +559914 120 +683719 113 +397973 112 +649732 101 +657197 99 +728115 96 +927337 96 +695983 94 +075766 94 +211759 89 +477197 87 +287032 86 +016768 86 +635777 84 +602634 78 +325127 75 +364116 70 +089650 68 +711912 67 +627937 67 +633576 64 +229148 64 +774071 62 +157417 60 +329776 59 +858187 58 +069695 58 +660055 56 +154511 54 +711410 52 +221073 50 +157752 50 +117299 48 +523930 48 +571729 47 +749059 44 +709716 43 +737079 41 +775371 41 +966928 40 +618712 40 +651628 40 +732835 40 +770952 39 +191597 39 +335555 38 +324951 38 +877645 38 +989270 37 +573394 36 +962345 36 +579405 36 +357354 35 +785273 32 +276563 32 +737101 31 +575567 31 +595767 31 +393959 30 +503045 30 +362109 28 +138159 28 +594497 27 +732657 26 +953136 26 +874889 26 +657719 26 +788173 25 +879543 25 +237009 24 +527958 24 +139538 24 +251677 24 +673832 24 +598698 24 +593967 23 +549777 23 +550977 22 +139271 22 +118149 22 +737063 22 +277794 22 +393397 22 +194537 22 +170387 22 +757843 21 +295517 20 +746711 20 +722172 19 +897120 19 +707163 18 +738156 18 +317460 18 +285317 18 +169573 18 +979175 18 +557517 17 +729723 17 +983794 17 +853755 17 +797039 17 +697717 17 +271158 16 +987739 16 +301305 16 +956761 16 +242958 16 +355517 16 +990651 16 +467738 16 +700181 16 +178326 16 +819918 16 +399701 16 +575471 16 +979289 16 +701381 16 +071004 16 +276872 15 +975639 15 +942629 15 +173991 15 +991677 15 +359062 14 +338722 14 +650802 14 +816672 13 +369155 12 +569393 12 +090387 12 +957138 12 +053345 12 +193737 12 +302119 12 +998457 12 +577755 12 +798119 12 +257896 12 +177774 12 +566971 11 +741333 11 +971791 11 +289757 11 +724350 11 +999632 10 +712241 10 +378188 10 +991057 10 +757369 10 +904455 10 +514333 10 +907678 10 +221969 9 +319632 9 +532582 9 +959150 9 +633348 9 +637665 9 +290919 8 +771156 8 +464259 8 +937776 8 +761553 8 +773915 8 +913634 8 +993713 8 +679595 8 +311531 8 +095836 8 +036503 8 +053979 8 +556356 8 +677811 8 +853935 8 +663627 8 +575552 8 +157930 8 +706762 8 +905393 8 +145775 8 +909761 8 +639754 8 +111314 8 +377327 8 +905812 8 +977595 8 +896254 8 +199699 8 +391493 8 +154550 8 +253794 7 +970546 7 +517135 7 +577511 7 +398857 7 +249978 7 +976199 7 +118307 7 +269535 7 +557723 7 +266013 7 +957651 7 +697679 6 +508671 6 +381177 6 +643705 6 +339965 6 +977335 6 +030333 6 +799054 6 +777736 6 +577112 6 +308760 6 +788551 6 +954833 6 +547801 6 +187001 6 +544067 6 +227817 6 +256773 6 +698417 5 +426113 5 +523377 5 +376536 5 +125771 5 +971326 5 +307378 5 +119591 5 +503659 4 +533271 4 +863668 4 +786336 4 +936401 4 +933379 4 +347378 4 +362776 4 +370153 4 +908953 4 +792463 4 +233963 4 +995019 4 +631775 4 +967941 4 +997887 4 +489729 4 +752355 4 +794931 4 +876478 4 +757916 4 +737594 4 +513608 4 +650433 4 +996353 4 +571535 4 +273776 4 +978539 4 +837808 4 +703915 4 +555733 4 +557297 4 +183806 4 +339911 4 +271338 4 +967457 4 +713695 4 +159833 4 +782735 4 +579765 4 +659433 4 +111511 4 +531321 4 +589283 4 +515577 4 +745295 4 +377597 4 +944758 4 +249737 4 +417716 4 +581173 4 +723075 4 +153979 3 +973186 3 +158923 3 +983116 3 +792867 3 +717593 3 +517478 3 +207873 3 +591777 3 +599967 3 +157833 3 +834174 3 +735374 3 +967426 3 +217263 3 +857752 3 +245576 3 +950709 3 +797179 3 +616527 3 +830551 3 +917147 3 +792339 3 +685756 2 +318173 2 +425937 2 +971581 2 +209059 2 +934057 2 +597573 2 +872992 2 +638108 2 +797791 2 +576897 2 +440113 2 +349843 2 +937033 2 +927790 2 +716364 2 +786273 2 +913773 2 +390718 2 +133350 2 +973611 2 +147837 2 +533755 2 +370307 2 +432258 2 +355959 2 +666656 2 +499935 2 +599803 2 +557032 2 +434179 2 +787317 2 +856571 2 +357911 2 +175053 2 +786713 2 +733179 2 +225157 2 +939101 2 +652517 2 +273778 2 +731570 2 +366551 2 +154007 2 +348557 2 +055979 2 +599021 2 +859522 2 +325263 2 +971346 2 +059616 2 +751595 2 +923566 2 +017751 2 +935949 2 +666274 2 +695567 2 +511475 2 +173456 2 +677193 2 +372520 2 +726976 2 +371196 2 +352659 2 +851977 2 +483113 2 +211706 2 +547911 2 +330517 2 +969391 2 +577335 2 +179159 2 +293322 2 +155159 2 +771799 2 +251637 2 +562579 2 +777709 2 +890765 2 +733133 2 +776768 2 +035963 2 +113573 2 +915335 2 +178795 2 +221769 2 +921595 2 +277611 2 +954643 1 +935096 1 +129935 1 +300677 1 +138937 1 +393063 1 +304557 1 +887753 1 +396104 1 +014373 1 +276647 1 +375435 1 +115539 1 +967799 1 +743639 1 +899665 1 +903399 1 +130941 1 +915358 1 +975136 1 +910575 1 +553764 1 +482929 1 +911843 1 +531253 1 +612399 1 +134171 1 +894677 1 +393119 1 +087505 1 +133581 1 +754092 1 +319893 1 +972757 1 +912452 1 +900350 1 +760737 1 +997469 1 +797049 1 +475757 1 +573178 1 +342998 1 +427771 1 +996759 1 +637962 1 +729778 1 diff --git a/stack-2020/iot-challenge-5/writeup/token-generation/key-output.txt b/stack-2020/iot-challenge-5/writeup/token-generation/key-output.txt new file mode 100644 index 0000000..ab1f4cb --- /dev/null +++ b/stack-2020/iot-challenge-5/writeup/token-generation/key-output.txt @@ -0,0 +1,246 @@ + +Token is behind your clock by 2 minutes. + +Time now: Mon Nov 9 10:42:00 2020 + + +Mon Nov 9 08:42:00 2020 1604882520 835746 +Mon Nov 9 08:43:00 2020 1604882520 193775 +Mon Nov 9 08:44:00 2020 1604882640 835746 +Mon Nov 9 08:45:00 2020 1604882640 193775 +Mon Nov 9 08:46:00 2020 1604882760 835746 +Mon Nov 9 08:47:00 2020 1604882760 193775 +Mon Nov 9 08:48:00 2020 1604882880 395139 +Mon Nov 9 08:49:00 2020 1604882880 237356 +Mon Nov 9 08:50:00 2020 1604883000 461177 +Mon Nov 9 08:51:00 2020 1604883000 107307 +Mon Nov 9 08:52:00 2020 1604883120 236795 +Mon Nov 9 08:53:00 2020 1604883120 325533 +Mon Nov 9 08:54:00 2020 1604883240 236795 +Mon Nov 9 08:55:00 2020 1604883240 325533 +Mon Nov 9 08:56:00 2020 1604883360 578454 +Mon Nov 9 08:57:00 2020 1604883360 319548 +Mon Nov 9 08:58:00 2020 1604883480 578454 +Mon Nov 9 08:59:00 2020 1604883480 319548 +Mon Nov 9 09:00:00 2020 1604883600 233790 +Mon Nov 9 09:01:00 2020 1604883600 722277 +Mon Nov 9 09:02:00 2020 1604883720 236795 +Mon Nov 9 09:03:00 2020 1604883720 325533 +Mon Nov 9 09:04:00 2020 1604883840 835746 +Mon Nov 9 09:05:00 2020 1604883840 193775 +Mon Nov 9 09:06:00 2020 1604883960 835746 +Mon Nov 9 09:07:00 2020 1604883960 193775 +Mon Nov 9 09:08:00 2020 1604884080 233790 +Mon Nov 9 09:09:00 2020 1604884080 722277 +Mon Nov 9 09:10:00 2020 1604884200 461177 +Mon Nov 9 09:11:00 2020 1604884200 107307 +Mon Nov 9 09:12:00 2020 1604884320 835746 +Mon Nov 9 09:13:00 2020 1604884320 193775 +Mon Nov 9 09:14:00 2020 1604884440 835746 +Mon Nov 9 09:15:00 2020 1604884440 193775 +Mon Nov 9 09:16:00 2020 1604884560 233790 +Mon Nov 9 09:17:00 2020 1604884560 722277 +Mon Nov 9 09:18:00 2020 1604884680 461177 +Mon Nov 9 09:19:00 2020 1604884680 107307 +Mon Nov 9 09:20:00 2020 1604884800 835746 +Mon Nov 9 09:21:00 2020 1604884800 193775 +Mon Nov 9 09:22:00 2020 1604884920 835746 +Mon Nov 9 09:23:00 2020 1604884920 193775 +Mon Nov 9 09:24:00 2020 1604885040 835746 +Mon Nov 9 09:25:00 2020 1604885040 193775 +Mon Nov 9 09:26:00 2020 1604885160 533152 +Mon Nov 9 09:27:00 2020 1604885160 289103 +Mon Nov 9 09:28:00 2020 1604885280 835746 +Mon Nov 9 09:29:00 2020 1604885280 193775 +Mon Nov 9 09:30:00 2020 1604885400 835746 +Mon Nov 9 09:31:00 2020 1604885400 193775 +Mon Nov 9 09:32:00 2020 1604885520 749353 +Mon Nov 9 09:33:00 2020 1604885520 416529 +Mon Nov 9 09:34:00 2020 1604885640 533152 +Mon Nov 9 09:35:00 2020 1604885640 289103 +Mon Nov 9 09:36:00 2020 1604885760 233790 +Mon Nov 9 09:37:00 2020 1604885760 722277 +Mon Nov 9 09:38:00 2020 1604885880 835746 +Mon Nov 9 09:39:00 2020 1604885880 193775 +Mon Nov 9 09:40:00 2020 1604886000 835746 +Mon Nov 9 09:41:00 2020 1604886000 193775 +Mon Nov 9 09:42:00 2020 1604886120 835746 +Mon Nov 9 09:43:00 2020 1604886120 193775 +Mon Nov 9 09:44:00 2020 1604886240 835746 +Mon Nov 9 09:45:00 2020 1604886240 193775 +Mon Nov 9 09:46:00 2020 1604886360 835746 +Mon Nov 9 09:47:00 2020 1604886360 193775 +Mon Nov 9 09:48:00 2020 1604886480 835746 +Mon Nov 9 09:49:00 2020 1604886480 193775 +Mon Nov 9 09:50:00 2020 1604886600 835746 +Mon Nov 9 09:51:00 2020 1604886600 193775 +Mon Nov 9 09:52:00 2020 1604886720 835746 +Mon Nov 9 09:53:00 2020 1604886720 193775 +Mon Nov 9 09:54:00 2020 1604886840 172572 +Mon Nov 9 09:55:00 2020 1604886840 995234 +Mon Nov 9 09:56:00 2020 1604886960 578454 +Mon Nov 9 09:57:00 2020 1604886960 319548 +Mon Nov 9 09:58:00 2020 1604887080 578454 +Mon Nov 9 09:59:00 2020 1604887080 319548 +Mon Nov 9 10:00:00 2020 1604887200 835746 +Mon Nov 9 10:01:00 2020 1604887200 193775 +Mon Nov 9 10:02:00 2020 1604887320 835746 +Mon Nov 9 10:03:00 2020 1604887320 193775 +Mon Nov 9 10:04:00 2020 1604887440 578454 +Mon Nov 9 10:05:00 2020 1604887440 319548 +Mon Nov 9 10:06:00 2020 1604887560 578454 +Mon Nov 9 10:07:00 2020 1604887560 319548 +Mon Nov 9 10:08:00 2020 1604887680 835746 +Mon Nov 9 10:09:00 2020 1604887680 193775 +Mon Nov 9 10:10:00 2020 1604887800 835746 +Mon Nov 9 10:11:00 2020 1604887800 193775 +Mon Nov 9 10:12:00 2020 1604887920 835746 +Mon Nov 9 10:13:00 2020 1604887920 193775 +Mon Nov 9 10:14:00 2020 1604888040 835746 +Mon Nov 9 10:15:00 2020 1604888040 193775 +Mon Nov 9 10:16:00 2020 1604888160 835746 +Mon Nov 9 10:17:00 2020 1604888160 193775 +Mon Nov 9 10:18:00 2020 1604888280 835746 +Mon Nov 9 10:19:00 2020 1604888280 193775 +Mon Nov 9 10:20:00 2020 1604888400 835746 +Mon Nov 9 10:21:00 2020 1604888400 193775 +Mon Nov 9 10:22:00 2020 1604888520 835746 +Mon Nov 9 10:23:00 2020 1604888520 193775 +Mon Nov 9 10:24:00 2020 1604888640 835746 +Mon Nov 9 10:25:00 2020 1604888640 193775 +Mon Nov 9 10:26:00 2020 1604888760 835746 +Mon Nov 9 10:27:00 2020 1604888760 193775 +Mon Nov 9 10:28:00 2020 1604888880 835746 +Mon Nov 9 10:29:00 2020 1604888880 193775 +Mon Nov 9 10:30:00 2020 1604889000 835746 +Mon Nov 9 10:31:00 2020 1604889000 193775 +Mon Nov 9 10:32:00 2020 1604889120 835746 +Mon Nov 9 10:33:00 2020 1604889120 193775 +Mon Nov 9 10:34:00 2020 1604889240 835746 +Mon Nov 9 10:35:00 2020 1604889240 193775 +Mon Nov 9 10:36:00 2020 1604889360 578454 +Mon Nov 9 10:37:00 2020 1604889360 319548 +Mon Nov 9 10:38:00 2020 1604889480 578454 +Mon Nov 9 10:39:00 2020 1604889480 319548 +Mon Nov 9 10:40:00 2020 1604889600 798569 +Mon Nov 9 10:41:00 2020 1604889600 983957 +Mon Nov 9 10:42:00 2020 1604889720 461177 +Mon Nov 9 10:43:00 2020 1604889720 107307 +Mon Nov 9 10:44:00 2020 1604889840 835746 +Mon Nov 9 10:45:00 2020 1604889840 193775 +Mon Nov 9 10:46:00 2020 1604889960 835746 +Mon Nov 9 10:47:00 2020 1604889960 193775 +Mon Nov 9 10:48:00 2020 1604890080 233790 +Mon Nov 9 10:49:00 2020 1604890080 722277 +Mon Nov 9 10:50:00 2020 1604890200 233790 +Mon Nov 9 10:51:00 2020 1604890200 722277 +Mon Nov 9 10:52:00 2020 1604890320 835746 +Mon Nov 9 10:53:00 2020 1604890320 193775 +Mon Nov 9 10:54:00 2020 1604890440 835746 +Mon Nov 9 10:55:00 2020 1604890440 193775 +Mon Nov 9 10:56:00 2020 1604890560 461177 +Mon Nov 9 10:57:00 2020 1604890560 107307 +Mon Nov 9 10:58:00 2020 1604890680 461177 +Mon Nov 9 10:59:00 2020 1604890680 107307 +Mon Nov 9 11:00:00 2020 1604890800 236795 +Mon Nov 9 11:01:00 2020 1604890800 325533 +Mon Nov 9 11:02:00 2020 1604890920 236795 +Mon Nov 9 11:03:00 2020 1604890920 325533 +Mon Nov 9 11:04:00 2020 1604891040 835746 +Mon Nov 9 11:05:00 2020 1604891040 193775 +Mon Nov 9 11:06:00 2020 1604891160 835746 +Mon Nov 9 11:07:00 2020 1604891160 193775 +Mon Nov 9 11:08:00 2020 1604891280 233790 +Mon Nov 9 11:09:00 2020 1604891280 722277 +Mon Nov 9 11:10:00 2020 1604891400 236795 +Mon Nov 9 11:11:00 2020 1604891400 325533 +Mon Nov 9 11:12:00 2020 1604891520 835746 +Mon Nov 9 11:13:00 2020 1604891520 193775 +Mon Nov 9 11:14:00 2020 1604891640 835746 +Mon Nov 9 11:15:00 2020 1604891640 193775 +Mon Nov 9 11:16:00 2020 1604891760 233790 +Mon Nov 9 11:17:00 2020 1604891760 722277 +Mon Nov 9 11:18:00 2020 1604891880 461177 +Mon Nov 9 11:19:00 2020 1604891880 107307 +Mon Nov 9 11:20:00 2020 1604892000 835746 +Mon Nov 9 11:21:00 2020 1604892000 193775 +Mon Nov 9 11:22:00 2020 1604892120 835746 +Mon Nov 9 11:23:00 2020 1604892120 193775 +Mon Nov 9 11:24:00 2020 1604892240 233790 +Mon Nov 9 11:25:00 2020 1604892240 722277 +Mon Nov 9 11:26:00 2020 1604892360 461177 +Mon Nov 9 11:27:00 2020 1604892360 107307 +Mon Nov 9 11:28:00 2020 1604892480 835746 +Mon Nov 9 11:29:00 2020 1604892480 193775 +Mon Nov 9 11:30:00 2020 1604892600 835746 +Mon Nov 9 11:31:00 2020 1604892600 193775 +Mon Nov 9 11:32:00 2020 1604892720 835746 +Mon Nov 9 11:33:00 2020 1604892720 193775 +Mon Nov 9 11:34:00 2020 1604892840 533152 +Mon Nov 9 11:35:00 2020 1604892840 289103 +Mon Nov 9 11:36:00 2020 1604892960 835746 +Mon Nov 9 11:37:00 2020 1604892960 193775 +Mon Nov 9 11:38:00 2020 1604893080 835746 +Mon Nov 9 11:39:00 2020 1604893080 193775 +Mon Nov 9 11:40:00 2020 1604893200 749353 +Mon Nov 9 11:41:00 2020 1604893200 416529 +Mon Nov 9 11:42:00 2020 1604893320 533152 +Mon Nov 9 11:43:00 2020 1604893320 289103 +Mon Nov 9 11:44:00 2020 1604893440 835746 +Mon Nov 9 11:45:00 2020 1604893440 193775 +Mon Nov 9 11:46:00 2020 1604893560 835746 +Mon Nov 9 11:47:00 2020 1604893560 193775 +Mon Nov 9 11:48:00 2020 1604893680 233790 +Mon Nov 9 11:49:00 2020 1604893680 722277 +Mon Nov 9 11:50:00 2020 1604893800 835746 +Mon Nov 9 11:51:00 2020 1604893800 193775 +Mon Nov 9 11:52:00 2020 1604893920 233790 +Mon Nov 9 11:53:00 2020 1604893920 722277 +Mon Nov 9 11:54:00 2020 1604894040 461177 +Mon Nov 9 11:55:00 2020 1604894040 107307 +Mon Nov 9 11:56:00 2020 1604894160 233790 +Mon Nov 9 11:57:00 2020 1604894160 722277 +Mon Nov 9 11:58:00 2020 1604894280 835746 +Mon Nov 9 11:59:00 2020 1604894280 193775 +Mon Nov 9 12:00:00 2020 1604894400 835746 +Mon Nov 9 12:01:00 2020 1604894400 193775 +Mon Nov 9 12:02:00 2020 1604894520 172572 +Mon Nov 9 12:03:00 2020 1604894520 995234 +Mon Nov 9 12:04:00 2020 1604894640 417765 +Mon Nov 9 12:05:00 2020 1604894640 165199 +Mon Nov 9 12:06:00 2020 1604894760 417765 +Mon Nov 9 12:07:00 2020 1604894760 165199 +Mon Nov 9 12:08:00 2020 1604894880 835746 +Mon Nov 9 12:09:00 2020 1604894880 193775 +Mon Nov 9 12:10:00 2020 1604895000 172572 +Mon Nov 9 12:11:00 2020 1604895000 995234 +Mon Nov 9 12:12:00 2020 1604895120 976961 +Mon Nov 9 12:13:00 2020 1604895120 341165 +Mon Nov 9 12:14:00 2020 1604895240 976961 +Mon Nov 9 12:15:00 2020 1604895240 341165 +Mon Nov 9 12:16:00 2020 1604895360 233790 +Mon Nov 9 12:17:00 2020 1604895360 722277 +Mon Nov 9 12:18:00 2020 1604895480 395139 +Mon Nov 9 12:19:00 2020 1604895480 237356 +Mon Nov 9 12:20:00 2020 1604895600 461177 +Mon Nov 9 12:21:00 2020 1604895600 107307 +Mon Nov 9 12:22:00 2020 1604895720 461177 +Mon Nov 9 12:23:00 2020 1604895720 107307 +Mon Nov 9 12:24:00 2020 1604895840 233790 +Mon Nov 9 12:25:00 2020 1604895840 722277 +Mon Nov 9 12:26:00 2020 1604895960 835746 +Mon Nov 9 12:27:00 2020 1604895960 193775 +Mon Nov 9 12:28:00 2020 1604896080 461177 +Mon Nov 9 12:29:00 2020 1604896080 107307 +Mon Nov 9 12:30:00 2020 1604896200 835746 +Mon Nov 9 12:31:00 2020 1604896200 193775 +Mon Nov 9 12:32:00 2020 1604896320 798569 +Mon Nov 9 12:33:00 2020 1604896320 983957 +Mon Nov 9 12:34:00 2020 1604896440 461177 +Mon Nov 9 12:35:00 2020 1604896440 107307 +Mon Nov 9 12:36:00 2020 1604896560 798569 +Mon Nov 9 12:37:00 2020 1604896560 983957 +Mon Nov 9 12:38:00 2020 1604896680 397973 +Mon Nov 9 12:39:00 2020 1604896680 901024 +Mon Nov 9 12:40:00 2020 1604896800 835746 +Mon Nov 9 12:41:00 2020 1604896800 193775 diff --git a/stack-2020/iot-challenge-5/writeup/token-generation/keygen-brute b/stack-2020/iot-challenge-5/writeup/token-generation/keygen-brute new file mode 100644 index 0000000..03b007e Binary files /dev/null and b/stack-2020/iot-challenge-5/writeup/token-generation/keygen-brute differ diff --git a/stack-2020/iot-challenge-5/writeup/token-generation/keygen-brute.cpp b/stack-2020/iot-challenge-5/writeup/token-generation/keygen-brute.cpp new file mode 100644 index 0000000..5ce2b12 --- /dev/null +++ b/stack-2020/iot-challenge-5/writeup/token-generation/keygen-brute.cpp @@ -0,0 +1,311 @@ + +// Used by Sig0ct for Stack the Flags IOT-RSA Challenge +// Least Significant First byte order is assumed + +/* (c) 1999-3001 I.C. Wiener */ +/* modified by vint */ + +#ifdef _MSC_VER + #pragma intrinsic (_lrotr, _lrotl) +#else /* GCC or CC */ + #define __int64 long long + #define __forceinline __inline__ + #define _lrotr(x, n) ((((unsigned long)(x)) >> ((int) ((n) & 31))) | (((unsigned long)(x)) << ((int) ((-(n)) & 31)))) + #define _lrotl(x, n) ((((unsigned long)(x)) << ((int) ((n) & 31))) | (((unsigned long)(x)) >> ((int) ((-(n)) & 31)))) +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ror32(x, n) _lrotr (x, n) +#define rol32(x, n) _lrotl (x, n) +#define bswap32(x) (rol32 ((unsigned long)(x), 8) & 0x00ff00ff | ror32 ((unsigned long)(x), 8) & 0xff00ff00) + +static __forceinline unsigned char ror8 (const unsigned char x, const int n) { return (x >> (n & 7)) | (x << ((-n) & 7)); } +static __forceinline unsigned __int64 rol64 (const unsigned __int64 x, const int n) { return (x << (n & 63)) | (x >> ((-n) & 63)); } +static __forceinline unsigned __int64 bswap64 (const unsigned __int64 x) { unsigned long a = (unsigned long) x, b = (unsigned long) (x >> 32); return (((unsigned __int64) bswap32 (a)) << 32) | bswap32(b); } + +typedef union _OCTET +{ + unsigned __int64 Q[1]; + unsigned long D[2]; + unsigned short W[4]; + unsigned char B[8]; +} OCTET; + +void securid_expand_key_to_4_bit_per_byte (const OCTET source, char *target) +{ + int i; + + for (i = 0; i < 8; i++) + { + target[i*2 ] = source.B[i] >> 4; + target[i*2+1] = source.B[i] & 0x0F; + } +} + +void securid_expand_data_to_1_bit_per_byte (const OCTET source, char *target) +{ + int i, j, k; + + for (i = 0, k = 0; i < 8; i++) for (j = 7; j >= 0; j--) target[k++] = (source.B[i] >> j) & 1; +} + +void securid_reassemble_64_bit_from_64_byte (const unsigned char *source, OCTET *target) +{ + int i = 0, j, k = 0; + + for (target->Q[0] = 0; i < 8; i++) for (j = 7; j >= 0; j--) target->B[i] |= source[k++] << j; +} + +void securid_permute_data (OCTET *data, const OCTET key) +{ + unsigned char bit_data[128]; + unsigned char hex_key[16]; + + unsigned long i, k, b, m, bit; + unsigned char j; + unsigned char *hkw, *permuted_bit; + + memset (bit_data, 0, sizeof (bit_data)); + + securid_expand_data_to_1_bit_per_byte (*data, (char *)bit_data); + securid_expand_key_to_4_bit_per_byte (key, (char *)hex_key); + + for (bit = 32, hkw = hex_key, m = 0; bit <= 32; hkw += 8, bit -= 32) + { + permuted_bit = bit_data + 64 + bit; + for (k = 0, b = 28; k < 8; k++, b -= 4) + { + for (j = hkw[k]; j; j--) + { + bit_data[(bit + b + m + 4) & 0x3F] = bit_data[m]; + m = (m + 1) & 0x3F; + } + + for (i = 0; i < 4; i++) + { + permuted_bit[b + i] |= bit_data[(bit + b + m + i) & 0x3F]; + } + } + } + + securid_reassemble_64_bit_from_64_byte (bit_data + 64, data); +} + +void securid_do_4_rounds (OCTET *data, OCTET *key) +{ + unsigned char round, i, j; + unsigned char t; + + for (round = 0; round < 4; round++) + { + for (i = 0; i < 8; i++) + { + for (j = 0; j < 8; j++) + { + if ((((key->B[i] >> (j ^ 7)) ^ (data->B[0] >> 7)) & 1) != 0) + { + t = data->B[4]; + data->B[4] = 100 - data->B[0]; + data->B[0] = t; + } + else + { + data->B[0] = (unsigned char) (ror8 ((unsigned char) (ror8 (data->B[0], 1) - 1), 1) - 1) ^ +data->B[4]; + } + data->Q[0] = bswap64 (rol64 (bswap64 (data->Q[0]), 1)); + } + } + key->Q[0] ^= data->Q[0]; + } +} + +void securid_convert_to_decimal (OCTET *data, const OCTET key) +{ + unsigned long i; + unsigned char c, hi, lo; + + c = (key.B[7] & 0x0F) % 5; + + for (i = 0; i < 8; i++) + { + hi = data->B[i] >> 4; + lo = data->B[i] & 0x0F; + c = (c + (key.B[i] >> 4)) % 5; if (hi > 9) data->B[i] = ((hi = (hi - (c + 1) * 2) % 10) << 4) | lo; + c = (c + (key.B[i] & 0x0F)) % 5; if (lo > 9) data->B[i] = (lo = ((lo - (c + 1) * 2) % 10)) | (hi << 4); + } +} + +void securid_hash_data (OCTET *data, OCTET key, unsigned char convert_to_decimal) +{ + securid_permute_data (data, key); // data bits are permuted depending on the key + securid_do_4_rounds (data, &key); // key changes as well + securid_permute_data (data, key); // final permutation is based on the new key + if (convert_to_decimal) + securid_convert_to_decimal (data, key); // decimal conversion depends on the key too +} + +void securid_hash_time (unsigned long time, OCTET *hash, OCTET key) +{ + hash->B[0] = (unsigned char) (time >> 16); + hash->B[1] = (unsigned char) (time >> 8); + hash->B[2] = (unsigned char) time; + hash->B[3] = (unsigned char) time; + hash->B[4] = (unsigned char) (time >> 16); + hash->B[5] = (unsigned char) (time >> 8); + hash->B[6] = (unsigned char) time; + hash->B[7] = (unsigned char) time; + + securid_hash_data (hash, key, 1); +} + +unsigned char hex (const char c) +{ + unsigned char n = c - '0'; + + if (n < 10) return n; + n -= 7; + if ((n > 9) && (n < 16)) return n; + n -= 32; + if ((n > 9) && (n < 16)) return n; + exit (17); +} + +unsigned char read_line (FILE *fi, OCTET *outb) +{ + unsigned char n; + unsigned long i; + char ins[80], *s; + + if (!fgets (ins, sizeof (ins), fi)) return -1; + s = ins; + if (*s == '#') s++; + if (strncmp (ins, "0000:", 5) == 0) return -1; + for (i = 0; i < 38; i++) + { + n = hex (*s++) << 4; + n |= hex (*s++); + outb->B[i] = n; + } + + // securid bullshit import file decryption (how much do they pay their programmers???) + // anyway, I replaced their 16 stupid xor-D69E36D2/rol-1 "rounds" with one rol-16/xor + // doing exactly the same thing (I wonder what they used to generate their token secrets? ;) + + // btw, we ignore the last two bytes that are just a silly checksum + + for (i = 0; i < 9; i++) outb->D[i] = rol32 (outb->D[i], 16) ^ 0x88BF88BF; + return 0; +} + +unsigned long convert_time(signed long t){ + signed long t0=1604889720; + return ( ((t-t0)/120)*3*120 ) + t0; +} + +signed long unconvert_time(signed long t){ + signed long t0=1604889720; + return ( ((t-t0)/(120*3))*120 ) + t0; +} + +bool cmp(std::pair& a,std::pair& b){ + return a.second>b.second; +} + +std::vector> map_to_vector(std::unordered_map map1){ + using namespace std; + vector> output; + for(auto it=map1.begin();it!=map1.end();it++){ + // printf("%06d:\t%d\n",it->first,it->second); + output.push_back(*it); + } + return output; +} + +void print_vector(std::vector> vect1){ + using namespace std; + for(auto it=vect1.begin();it!=vect1.end();it++){ + printf("%06d\t%d\n",it->first,it->second); + } +} + +int main (int argc, char **argv) +{ + using namespace std; + signed long i, j, k, t, serial; + OCTET key, hi, hj, token, input, data[5]; + FILE *fi; + char *s; + + // So, we need: + // key needs to be set to the key: de ed a1 13 7a b0 12 02 + // j needs to be set to serial number, which is D[1] of key + // input needs to be current 6-digit number on the token (supplied as base 10, read as base 16?) + // time needs to be set to something close to token's time + + unsigned char keyb[]={0xde,0xed,0xa1,0x13,0x7a,0xb0,0x12,0x02}; //this is definitely correct + // unsigned char keyb[]={0x02,0x12,0xb0,0x7a,0x13,0xa1,0xed,0xde}; + for (int xx=0;xx<8;xx++){ + key.B[xx]=keyb[xx]; + } + // j = key.D[1]; + input.D[0] = strtoul ("461177", &s, 16); + + unsigned long timestamp=1604889890; //10:44:50 + // unsigned long timestamp=1604890010; //10:46:50 + + // Magic number: + // Govtech founded on 1 Oct 2016, 9:06:50 GMT+8 + // timestamp is 1475284010 + // magic number is therefore 24588066 + + // t = (timestamp / 60 - 0x806880)*2; + + signed long t1=time(NULL); + signed long t0=1604889720; + printf("Time now: %s",ctime((time_t *)&t1)); + printf("T_0: %s",ctime((time_t *)&t0)); + unordered_map freqMap; + + // for (unsigned long tx = t0-(200*3600); tx < t1+(200*3600); tx += 120) + int number_of_keys=0; + for (unsigned long tx = t0-(2*3600); tx < t1+(2*3600); tx += 120) + { + OCTET ans; + signed long i_space=(tx / 60 - 0x806880)*2; + securid_hash_time (i_space, &ans, key); + + time_t t1=60*((i_space)/2 + 0x806880); + time_t t2=60*((i_space)/2 + 0x806880)+60; + + char new_key[7]; + snprintf(new_key,7,"%02X%02X%02X",ans.B[0], ans.B[1], ans.B[2]); + int token_out=atoi(new_key); + freqMap[token_out]++; + number_of_keys++; + // printf ("\t\t\t\t\t\t%d\n",token_out); + // printf ("%s\t%lu\t%02X%02X%02X\n", strtok(ctime(&t1),"\n"), 60*((i_space)/2 + 0x806880), ans.B[0], ans.B[1], ans.B[2]); + // printf ("%s\t%lu\t%02X%02X%02X\n", strtok(ctime(&t2),"\n"), 60*((i_space)/2 + 0x806880), ans.B[3], ans.B[4], ans.B[5]); + + } + + vector> freqVector; + + freqVector=map_to_vector(freqMap); + printf("Total keys generated:\t%d\n",number_of_keys); + printf("Number of unique keys:\t%d\n",(int)freqVector.size()); + + sort(freqVector.begin(),freqVector.end(),cmp); + print_vector(freqVector); + return 0; +} + diff --git a/stack-2020/iot-challenge-5/writeup/token-generation/keygen-original.c b/stack-2020/iot-challenge-5/writeup/token-generation/keygen-original.c new file mode 100644 index 0000000..270e3cc --- /dev/null +++ b/stack-2020/iot-challenge-5/writeup/token-generation/keygen-original.c @@ -0,0 +1,285 @@ +/* (c) 1999-3001 I.C. Wiener */ + +#ifdef _MSC_VER + #pragma intrinsic (_lrotr, _lrotl) +#else /* GCC or CC */ + #define __int64 long long + #define __forceinline __inline__ + #define _lrotr(x, n) ((((unsigned long)(x)) >> ((int) ((n) & 31))) | (((unsigned long)(x)) << ((int) ((-(n)) & 31)))) + #define _lrotl(x, n) ((((unsigned long)(x)) << ((int) ((n) & 31))) | (((unsigned long)(x)) >> ((int) ((-(n)) & 31)))) +#endif + +#include +#include +#include +#include + + +#define ror32(x, n) _lrotr (x, n) +#define rol32(x, n) _lrotl (x, n) +#define bswap32(x) (rol32 ((unsigned long)(x), 8) & 0x00ff00ff | ror32 ((unsigned long)(x), 8) & 0xff00ff00) + +static __forceinline unsigned char ror8 (const unsigned char x, const int n) { return (x >> (n & 7)) | (x << ((-n) +& 7)); } +static __forceinline unsigned __int64 rol64 (const unsigned __int64 x, const int n) { return (x << (n & 63)) | (x >> +((-n) & 63)); } +static __forceinline unsigned __int64 bswap64 (const unsigned __int64 x) { unsigned long a = (unsigned long) x, b = +(unsigned long) (x >> 32); return (((unsigned __int64) bswap32 (a)) << 32) | bswap32(b); } + +typedef union _OCTET +{ + unsigned __int64 Q[1]; + unsigned long D[2]; + unsigned short W[4]; + unsigned char B[8]; +} OCTET; + +void securid_expand_key_to_4_bit_per_byte (const OCTET source, char *target) +{ + int i; + + for (i = 0; i < 8; i++) + { + target[i*2 ] = source.B[i] >> 4; + target[i*2+1] = source.B[i] & 0x0F; + } +} + +void securid_expand_data_to_1_bit_per_byte (const OCTET source, char *target) +{ + int i, j, k; + + for (i = 0, k = 0; i < 8; i++) for (j = 7; j >= 0; j--) target[k++] = (source.B[i] >> j) & 1; +} + +void securid_reassemble_64_bit_from_64_byte (const unsigned char *source, OCTET *target) +{ + int i = 0, j, k = 0; + + for (target->Q[0] = 0; i < 8; i++) for (j = 7; j >= 0; j--) target->B[i] |= source[k++] << j; +} + +void securid_permute_data (OCTET *data, const OCTET key) +{ + unsigned char bit_data[128]; + unsigned char hex_key[16]; + + unsigned long i, k, b, m, bit; + unsigned char j; + unsigned char *hkw, *permuted_bit; + + memset (bit_data, 0, sizeof (bit_data)); + + securid_expand_data_to_1_bit_per_byte (*data, bit_data); + securid_expand_key_to_4_bit_per_byte (key, hex_key); + + for (bit = 32, hkw = hex_key, m = 0; bit <= 32; hkw += 8, bit -= 32) + { + permuted_bit = bit_data + 64 + bit; + for (k = 0, b = 28; k < 8; k++, b -= 4) + { + for (j = hkw[k]; j; j--) + { + bit_data[(bit + b + m + 4) & 0x3F] = bit_data[m]; + m = (m + 1) & 0x3F; + } + + for (i = 0; i < 4; i++) + { + permuted_bit[b + i] |= bit_data[(bit + b + m + i) & 0x3F]; + } + } + } + + securid_reassemble_64_bit_from_64_byte (bit_data + 64, data); +} + +void securid_do_4_rounds (OCTET *data, OCTET *key) +{ + unsigned char round, i, j; + unsigned char t; + + for (round = 0; round < 4; round++) + { + for (i = 0; i < 8; i++) + { + for (j = 0; j < 8; j++) + { + if ((((key->B[i] >> (j ^ 7)) ^ (data->B[0] >> 7)) & 1) != 0) + { + t = data->B[4]; + data->B[4] = 100 - data->B[0]; + data->B[0] = t; + } + else + { + data->B[0] = (unsigned char) (ror8 ((unsigned char) (ror8 (data->B[0], 1) - 1), 1) - 1) ^ data->B[4]; + } + data->Q[0] = bswap64 (rol64 (bswap64 (data->Q[0]), 1)); + } + } + key->Q[0] ^= data->Q[0]; + } +} + +void securid_convert_to_decimal (OCTET *data, const OCTET key) +{ + unsigned long i; + unsigned char c, hi, lo; + + c = (key.B[7] & 0x0F) % 5; + + for (i = 0; i < 8; i++) + { + hi = data->B[i] >> 4; + lo = data->B[i] & 0x0F; + c = (c + (key.B[i] >> 4)) % 5; if (hi > 9) data->B[i] = ((hi = (hi - (c + 1) * 2) % 10) << 4) | lo; + c = (c + (key.B[i] & 0x0F)) % 5; if (lo > 9) data->B[i] = (lo = ((lo - (c + 1) * 2) % 10)) | (hi << 4); + } +} + +void securid_hash_data (OCTET *data, OCTET key, unsigned char convert_to_decimal) +{ + securid_permute_data (data, key); // data bits are permuted depending on the key + securid_do_4_rounds (data, &key); // key changes as well + securid_permute_data (data, key); // final permutation is based on the new key + if (convert_to_decimal) + securid_convert_to_decimal (data, key); // decimal conversion depends on the key too +} + +void securid_hash_time (unsigned long time, OCTET *hash, OCTET key) +{ + hash->B[0] = (unsigned char) (time >> 16); + hash->B[1] = (unsigned char) (time >> 8); + hash->B[2] = (unsigned char) time; + hash->B[3] = (unsigned char) time; + hash->B[4] = (unsigned char) (time >> 16); + hash->B[5] = (unsigned char) (time >> 8); + hash->B[6] = (unsigned char) time; + hash->B[7] = (unsigned char) time; + + securid_hash_data (hash, key, 1); +} + +unsigned char hex (const char c) +{ + unsigned char n = c - '0'; + + if (n < 10) return n; + n -= 7; + if ((n > 9) && (n < 16)) return n; + n -= 32; + if ((n > 9) && (n < 16)) return n; + exit (17); +} + +unsigned char read_line (FILE *fi, OCTET *outb) +{ + unsigned char n; + unsigned long i; + char ins[80], *s; + + if (!fgets (ins, sizeof (ins), fi)) return -1; + s = ins; + if (*s == '#') s++; + if (strncmp (ins, "0000:", 5) == 0) return -1; + for (i = 0; i < 38; i++) + { + n = hex (*s++) << 4; + n |= hex (*s++); + outb->B[i] = n; + } + + // securid bullshit import file decryption (how much do they pay their programmers???) + // anyway, I replaced their 16 stupid xor-D69E36D2/rol-1 "rounds" with one rol-16/xor + // doing exactly the same thing (I wonder what they used to generate their token secrets? ;) + + // btw, we ignore the last two bytes that are just a silly checksum + + for (i = 0; i < 9; i++) outb->D[i] = rol32 (outb->D[i], 16) ^ 0x88BF88BF; + return 0; +} + +int main (int argc, char **argv) +{ + signed long i, j, k, t, serial; + OCTET key, hi, hj, input, data[5]; + FILE *fi; + char *s; + + if (argc != 4) + { + printf ("usage: securid \n"); + } + + fi = fopen (argv[1], "rt"); + serial = bswap32 (strtoul (argv[2], &s, 16)); // although it's base-16, it's still just a decimal number + input.D[0] = strtoul (argv[3], &s, 16); // although it's base-16, it's still just a decimal number as well + + if (!fi) + { + printf ("Cannot open token secret file.\n"); + return -1; + } + for (;;) + { + if (read_line (fi, data)) return 1; + j = data->D[1]; // printf ("%08X\n", j); + if (read_line (fi, data)) return 1; + if (j == serial) + { + key.Q[0] = data->Q[0]; + break; + } + } + fclose (fi); + + if (j != serial) + { + printf ("Token not found.\n"); + return -1; + } + + t = (time (NULL) / 60 - 0x806880) * 2; // (t & -4) for 60 sec periods, (t & -8) for 120 sec periods, etc. + + for (i = (t & -4), j = (t & -4) - 4; i < (t & -4) + 0x40560; i += 4, j -= 4) + { + securid_hash_time (i, &hi, key); + securid_hash_time (j, &hj, key); + if ((hi.B[0] == input.B[2]) && (hi.B[1] == input.B[1]) && (hi.B[2] == input.B[0])) + { + j = i; k = (i - (t & -4)) / 2; break; + } else if ((hi.B[3] == input.B[2]) && (hi.B[4] == input.B[1]) && (hi.B[5] == input.B[0])) + { + j = i; k = (i - (t & -4)) / 2 + 1; break; + } else if ((hj.B[0] == input.B[2]) && (hj.B[1] == input.B[1]) && (hj.B[2] == input.B[0])) + { + i = j; k = (j - (t & -4)) / 2; break; + } else if ((hj.B[3] == input.B[2]) && (hj.B[4] == input.B[1]) && (hj.B[5] == input.B[0])) + { + i = j; k = (j - (t & -4)) / 2 + 1; break; + } + } + if (i != j) + { + printf ("Either your clock is off by more than 1 year or invalid token secret file.\n"); + return -1; + } + if (k) + { + printf ("\nToken is %s your clock by %d minute%s.\n\n", (k > 0) ? "ahead of" : "behind", abs (k), (abs (k) == +1) ? "" : "s"); + } + else + { + printf ("\nToken clock is synchronised with yours.\n\n"); + } + for (j = 0; j < 40; j += 4) + { + securid_hash_time (i + j, &hi, key); + printf ("%X : %02X%02X%02X\n", i + j, hi.B[0], hi.B[1], hi.B[2]); + printf ("%X : %02X%02X%02X\n", i + j, hi.B[3], hi.B[4], hi.B[5]); + } + printf ("\nOK\n"); + return 0; +} diff --git a/stack-2020/iot-challenge-5/writeup/writeup.md b/stack-2020/iot-challenge-5/writeup/writeup.md index e1d6eb3..80680de 100644 --- a/stack-2020/iot-challenge-5/writeup/writeup.md +++ b/stack-2020/iot-challenge-5/writeup/writeup.md @@ -34,7 +34,127 @@ The data can be dumped to a CSV file, and we have two ways of proceeding: In a time-sensitive competition environment, the first step would probably be the smarter choice. +## Building the token +It turns out that the hardware solution is actually much faster, and simpler, to implement. Those are words I'd never thought I'd actually say, but it's true. The setup only requires a 16x2 LCD and a PCF8574T, which are *very* common (they are also, conveniently, often sold together), and a microcontroller (eg. Arduino). Using the hardware to effectively convert I2C signals into display characters not only saves us the trouble of poring over the HD44780 datasheet and painstaking effort of writing a script to decode the instructions *correctly* while keeping track of the LCD's state, but it also means we end up with an actual, physical, RSA token we can show to our friends, if we had any. I don't know about you, but I like to [*touch* my CTF solutions](https://www.youtube.com/watch?v=5TFDG-y-EHs), so this was the method we used. + +#### The Setup + +The goal here is to convert the I2C signals that we are given, and produce human-readable characters on the LCD display. + +To accomplish this, we first decode the raw logic signals using our logic analyzer, which gives us a sequence of I2C write commands stored on our computer. We then feed the commands over USB to an Arduino, which then performs the actual writes to the I2C connection with the IO expander. The rest is handled by the hardware. + +This setup has the advantage of making use of publicly available, easy-to-use libraries to do most of our work, which dramatically cuts down the time required. + +#### Computer to Arduino + +The raw output of our logic analyzer (Saleae Logic Analyzer v1) looks like this: + +``` +Time [s],Packet ID,Address,Data,Read/Write,ACK/NAK +1.396227940000000,1,N,'0',Write,ACK +1.496450310000000,2,N,4,Write,ACK +1.496679830000000,3,N,0,Write,ACK +1.501438270000000,4,N,4,Write,ACK +1.501667660000000,5,N,0,Write,ACK +... +``` + +Here, we only need the "Data" column - the timing is not important for writing to the LCD; all the commands are writes to the same address; and ACK/NAK is an acknowledge signal to be written by the IO expander, not the Arduino. However, there is a small complication: for some inexplicable reason, analyzer formats the "Data" column in the most inconvenient way possible, so we have to process it. Here `'0'` refers to 0x00 byte, while `0` refers to the ASCII character 0 (0x30). The script used is shown below: (for the rest of the code see `arduino-i2c/utility.py`) + +```python +def convertStr(string): + # Where the magic happens - this is called on each line of the input text file + # Converts poorly formatted string into nice integers so that we can feed it to arduino + if(string=="' '"): # WHY + return 32 + elif(string=="COMMA"): # IS + return 44 + elif(string[0]=="'"): # FORMATTING + return int(string.strip(string[0])) + elif(string=="\\r"): # SO + return 13 + elif(string=="\\t"): # BAD + return 9 + else: + return ord(string) + +# Loading analyzer output +dir=os.getcwd() +path=os.path.join(dir,"decoded_i2c.txt") +outPath=os.path.join(dir,"processed.csv") +in_data=pd.read_csv(path,sep=',') + +# Processing data +vectConvert=np.vectorize(convertStr,otypes=[np.int32]) +data_np=vectConvert(in_data["Data"].to_numpy()) +print(data_np) + +# Saving result +np.savetxt(outPath,data_np,fmt="%i",delimiter="\t") +``` + +Which gives us a consistent format where each line contains the decimal value of the byte to be sent over I2C: + +``` +0 +52 +48 +52 +48 +... +``` + +This is then sent to the Arduino with the following script: (see `arduino-i2c/utility.py`) + +```python +class sender(): + # For sending stuff to arduino + def __init__(self,serialPath="/dev/ttyACM0",csvPath="processed.csv"): + # Opens serial port and loads data from file + self.serObj=serial.Serial(serialPath,9600) + self.data=np.genfromtxt(os.path.join(os.getcwd(),csvPath),dtype=np.int32) + self.index=0 + print(self.data) + + def send_a_bunch(self,n): + # Sends n lines of data to Arduino + startIndex=self.index + for i in range(n): + toSend=self.data[startIndex+i] + toSend=(str(toSend)+"\n") + print(toSend) + self.serObj.write(toSend.encode()) + self.index+=1 + # Some delay is necessary to let the LCD respond + time.sleep(0.1) +``` + +#### Arduino to LCD + +The Arduino then receives the data, and for each line it receives, sends the appropriate byte over I2C (see `arduino-i2c/iot-5.ino`) using Arduino's Wire library. Crucially, we have to first initialize the LCD display using the proper library (shown below). This is especially important because we want to use the display in 4-bit mode rather than the display's default 8-bit mode, and we don't know whether the decoded I2C contains the instructions to do so (and other instructions needed for proper initialization). In any case, there isn't any harm in initializing the display twice. + +```c +#include +#include + +LiquidCrystal_I2C lcd(0x27,16,2); + +void setup() { + // initializes lcd and opens serial port + Serial.begin(9600); + lcd.init(); // sends instructions to use 4-bit mode, among other things + lcd.backlight(); + delay(500); + lcd.clear(); +} +``` + +#### The Result + +Putting everything together, we see a beautiful sight: hardware that actually works as intended, instead of short-circuiting everywhere and blowing up. The last screen displayed is shown below (the information on the other screens is shown in the next method): + +10 ## Reversing the entire protocol @@ -441,6 +561,51 @@ int main (int argc, char **argv) Successfully entering these credentials downloads a zip file containing the flag. +## The Fast Way + +We also found a faster way to get the flag, that doesn't require us to correct for the time drift by changing epochs. It might not be the intended solution, but it sure works. While playing with the code, we made an interesting observation: + +***Several of the 6-digit tokens keep appearing over and over again, even when the timestamp changed by months.*** + +How frequently? To find out, we generated every token within a ~1 month window, and tallied up the number of times each unique token appeared (see `token-generation/keygen-brute.cpp`). The assumption here is, of course, that the distribution of tokens in the real sequence is similar to the distribution in our generated sequence. If this assumption holds, rather than spending hours and hours *ahem* figuring out the problem and perfectly replicating the RSA token's behavior, we can just try the most frequently occurring 6-digit codes, perhaps using a script. + +If we do brute-force the logins, however, we can be more efficient by only generating half the tokens. This is because the tokens are generated in pairs for every 120s window, and the login server provides some leeway if the (physical) token's clock is slightly out of sync with the server's. This means that: + +- The frequency of the 2nd token is strongly correlated with the frequency of the 1st +- If the 2nd token in a pair is accepted, the 1st one will probably be accepted as well + +Which means that we can probably get away with generating only the 1st token in each pair, and tallying their frequencies. The results are shown below (first column is 6-digit token, second is frequency): + +``` +Generating tokens between: +Mon Nov 9 08:42:00 2020 +Thu Dec 10 18:02:17 2020 +Total tokens generated: 22601 +Number of unique tokens: 464 +835746 6082 +997494 1208 +578454 1142 +461177 1044 +233790 962 +... +``` + +Out of 22601 tokens generated in total, only 464 are unique, which means that an automated dictionary-attack that iterates over the 464 tokens wouldn't take very long. But it gets better (for us) - the top 5 most common tokens alone account for nearly half the tokens, which means trying those 5 already gives us a very good chance of getting in! + +Just out of curiosity, I also plotted the CDF of the N most common keys: + +distr-graph + +From this graph, we can see that N=10 has a ~55% success rate, with diminishing returns thereafter: N=40 gives a ~80% rate, while N=100 increases it to ~90%. + +At this point, we could still try an automated attack and iterate through all the tokens in our list, but why bother? Manually trying the top 5 keys already has a ~50% success rate (even "8935746" alone has a ~25% chance), and if those don't work, we can try again every 2 minutes anyways. + +Screenshot from 2020-12-10 12-59-09 + + + +## Conclusion + This was an extremely entertaining challenge requiring understanding of various fields. Ended up being more like 90% reversing / 10% IOT-relevant stuff, but still learnt a lot and had great fun. 10/10 would solve again.