Описание:
Добродушный мужчина в форме расспрашивал меня о планах на жизнь, образовании и навыках информационной безопасности. По-видимому, мои ответы его устроили, поэтому он, загадочно улыбнувшись, указал мне на ближайший компьютер, сказав, что моё тестовое задание – передо мной. Первые секунды я непонимающе пялился в экран монитора, а потом меня осенило…
Прочитав задания, становится еще более не понятно что нужно найти! 🙂
Но картинка указывает нам на «copyright» — то что обычно пишут в низу сайтов. Просмотрев «инспектором» код главной страницы квеста, обнаружил вот такое:
В коде три файла:
http://2016.neoquest.ru/files/cert1_f2ad1569.asn1
http://2016.neoquest.ru/files/cert2_512243c0.asn1
http://2016.neoquest.ru/files/cert3_126ec46b.asn1
Используя один из парсеров asn1-файлов, можно увидеть такую структуру файла:
Структура всех трех файлов одинакова и из нее видно, что в каждом файле по три параметра и один из них одинаковый и равный 3. Это наталкивает на мысль, что это RSA и в каждом файле есть n, c и e. Где e = 3. Вывод такой, что можно использовать атаку Хастада.
Скрипт для проведения данной атаки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
import math c_flag1 = 258166178649724503599487742934802526287669691117141193813325965154020153722514921601647187648221919500612597559946901707669147251080002815987547531468665467566717005154808254718275802205355468913739057891997227 N1=770208589881542620069464504676753940863383387375206105769618980879024439269509554947844785478530186900134626128158103023729084548188699148790609927825292033592633940440572111772824335381678715673885064259498347 c_flag2 = 82342298625679176036356883676775402119977430710726682485896193234656155980362739001985197966750770180888029807855818454089816725548543443170829318551678199285146042967925331334056196451472012024481821115035402 N2=106029085775257663206752546375038215862082305275547745288123714455124823687650121623933685907396184977471397594827179834728616028018749658416501123200018793097004318016219287128691152925005220998650615458757301 c_flag3 = 22930648200320670438709812150490964905599922007583385162042233495430878700029124482085825428033535726942144974904739350649202042807155611342972937745074828452371571955451553963306102347454278380033279926425450 N3=982308372262755389818559610780064346354778261071556063666893379698883592369924570665565343844555904810263378627630061263713965527697379617881447335759744375543004650980257156437858044538492769168139674955430611 def chinese_remainder(n, a): sum = 0 prod = reduce(lambda a, b: a*b, n) for n_i, a_i in zip(n, a): p = prod / n_i sum += a_i * mul_inv(p, n_i) * p return sum % prod def mul_inv(a, b): b0 = b x0, x1 = 0, 1 if b == 1: return 1 while a > 1: q = a / b a, b = b, a%b x0, x1 = x1 - q * x0, x0 if x1 < 0: x1 += b0 return x1 def find_invpow(x,n): """Finds the integer component of the n'th root of x, an integer such that y ** n <= x < (y + 1) ** n. """ high = 1 while high ** n < x: high *= 2 low = high/2 while low < high: mid = (low + high) // 2 if low < mid and mid**n < x: low = mid elif high > mid and mid**n > x: high = mid else: return mid return mid + 1 flag_cubed = chinese_remainder( [N1, N2, N3], [c_flag1, c_flag2, c_flag3] ) flag=find_invpow(flag_cubed,3) print hex(flag)[ 2 : -1 ].decode("hex") |
На выходе данного скрипта мы получаем ключ!
rendle 30 Мар 2016
Если честно, слово на изображении не несло смысловой нагрузки — я просто подбирал симпатичные картинки к заданиям 🙂 Ссылки добавлялись динамически в конец контейнера, и это небольшое совпадение, что копирайт был рядом.