← Все комнаты Путь «Веб» →
СложныйВеб Флаг Осенний CTF

Медленное сравнение

Прогресс комнаты 0 / 4
Задание 1Введение

Цель: Атаки по сторонним каналам: время выполнения выдаёт секрет.

Сервис проверяет API-токен побайтно и выходит при первом несовпадении. Вы замерили среднее время ответа для разных вариантов каждого символа. Восстановите токен — это флаг.

Задание 2Теория и инструменты

Обычное сравнение строк останавливается на первом различии. Если угаданы первые k символов, сравнение длится чуть дольше.

Измерив время для разных вариантов очередного символа, атакующий находит верный — и так символ за символом.

Инструменты

  • Python re
  • Статистика: среднее и медиана по многим замерам

Больше теории — в разделе «Обучение: Веб».

Задание 3Практика: найдите флаг
Данные задания5997 символов
pos=00 guess='c' avg_ms=100.8
pos=00 guess='1' avg_ms=105.7
pos=00 guess='u' avg_ms=101.0
pos=00 guess='9' avg_ms=96.3
pos=00 guess='C' avg_ms=145.6
pos=00 guess='k' avg_ms=101.0
pos=00 guess='r' avg_ms=105.5
pos=00 guess='a' avg_ms=94.0
pos=01 guess='s' avg_ms=106.9
pos=01 guess='a' avg_ms=103.6
pos=01 guess='5' avg_ms=105.4
pos=01 guess='g' avg_ms=112.3
pos=01 guess='{' avg_ms=108.7
pos=01 guess='m' avg_ms=112.4
pos=01 guess='d' avg_ms=108.4
pos=01 guess='T' avg_ms=152.0
pos=02 guess='x' avg_ms=108.4
pos=02 guess='f' avg_ms=116.3
pos=02 guess='C' avg_ms=114.9
pos=02 guess='F' avg_ms=154.1
pos=02 guess='4' avg_ms=109.9
pos=02 guess='0' avg_ms=117.1
pos=02 guess='b' avg_ms=114.3
pos=02 guess='w' avg_ms=110.7
pos=03 guess='4' avg_ms=115.3
pos=03 guess='{' avg_ms=162.2
pos=03 guess='l' avg_ms=117.0
pos=03 guess='v' avg_ms=116.8
pos=03 guess='3' avg_ms=123.2
pos=03 guess='5' avg_ms=114.3
pos=03 guess='m' avg_ms=123.8
pos=03 guess='t' avg_ms=113.5
pos=04 guess='8' avg_ms=119.4
pos=04 guess='x' avg_ms=125.5
pos=04 guess='y' avg_ms=122.9
pos=04 guess='F' avg_ms=129.1
pos=04 guess='t' avg_ms=170.9
pos=04 guess='k' avg_ms=128.9
pos=04 guess='2' avg_ms=118.3
pos=04 guess='f' avg_ms=121.3
pos=05 guess='d' avg_ms=136.6
pos=05 guess='T' avg_ms=129.5
pos=05 guess='6' avg_ms=129.2
pos=05 guess='1' avg_ms=172.9
pos=05 guess='o' avg_ms=136.9
pos=05 guess='i' avg_ms=137.4
pos=05 guess='f' avg_ms=127.7
pos=05 guess='5' avg_ms=133.1
pos=06 guess='F' avg_ms=140.8
pos=06 guess='5' avg_ms=132.6
pos=06 guess='c' avg_ms=130.9
pos=06 guess='z' avg_ms=129.9
pos=06 guess='v' avg_ms=132.7
pos=06 guess='b' avg_ms=132.8
pos=06 guess='m' avg_ms=184.8
pos=06 guess='{' avg_ms=141.3
pos=07 guess='j' avg_ms=134.7
pos=07 guess='s' avg_ms=134.8
pos=07 guess='4' avg_ms=147.7
pos=07 guess='2' avg_ms=141.9
pos=07 guess='}' avg_ms=138.6
pos=07 guess='1' avg_ms=185.7
pos=07 guess='7' avg_ms=145.1
pos=07 guess='b' avg_ms=148.4
pos=08 guess='r' avg_ms=142.5
pos=08 guess='v' avg_ms=148.8
pos=08 guess='{' avg_ms=147.8
pos=08 guess='n' avg_ms=189.9
pos=08 guess='j' avg_ms=142.1
pos=08 guess='b' avg_ms=146.0
pos=08 guess='1' avg_ms=154.4
pos=08 guess='0' avg_ms=142.4
pos=09 guess='f' avg_ms=156.6
pos=09 guess='8' avg_ms=154.6
pos=09 guess='C' avg_ms=147.6
pos=09 guess='5' avg_ms=159.8
pos=09 guess='g' avg_ms=196.5
pos=09 guess='h' avg_ms=157.6
pos=09 guess='j' avg_ms=161.4
pos=09 guess='d' avg_ms=156.9
pos=10 guess='F' avg_ms=155.6
pos=10 guess='e' avg_ms=167.7
pos=10 guess='{' avg_ms=164.3
pos=10 guess='_' avg_ms=206.7
pos=10 guess='d' avg_ms=156.2
pos=10 guess='x' avg_ms=165.7
pos=10 guess='i' avg_ms=154.6
pos=10 guess='m' avg_ms=153.2
pos=11 guess='v' avg_ms=163.9
pos=11 guess='l' avg_ms=214.0
pos=11 guess='h' avg_ms=170.4
pos=11 guess='1' avg_ms=165.8
pos=11 guess='s' avg_ms=172.7
pos=11 guess='g' avg_ms=160.4
pos=11 guess='d' avg_ms=162.5
pos=11 guess='q' avg_ms=160.1
pos=12 guess='e' avg_ms=166.8
pos=12 guess='4' avg_ms=171.5
pos=12 guess='h' avg_ms=164.3
pos=12 guess='g' avg_ms=167.6
pos=12 guess='o' avg_ms=165.5
pos=12 guess='u' avg_ms=172.1
pos=12 guess='j' avg_ms=179.3
pos=12 guess='3' avg_ms=220.9
pos=13 guess='9' avg_ms=182.6
pos=13 guess='4' avg_ms=225.2
pos=13 guess='2' avg_ms=180.2
pos=13 guess='T' avg_ms=182.5
pos=13 guess='3' avg_ms=180.1
pos=13 guess='d' avg_ms=185.3
pos=13 guess='g' avg_ms=176.6
pos=13 guess='_' avg_ms=170.6
pos=14 guess='4' avg_ms=178.1
pos=14 guess='h' avg_ms=179.0
pos=14 guess='{' avg_ms=185.2
pos=14 guess='7' avg_ms=181.6
pos=14 guess='k' avg_ms=226.0
pos=14 guess='_' avg_ms=186.7
pos=14 guess='u' avg_ms=188.6
pos=14 guess='x' avg_ms=189.5
pos=15 guess='9' avg_ms=193.6
pos=15 guess='z' avg_ms=187.4
pos=15 guess='k' avg_ms=185.2
pos=15 guess='s' avg_ms=232.2
pos=15 guess='v' avg_ms=191.3
pos=15 guess='1' avg_ms=186.7
pos=15 guess='}' avg_ms=191.9
pos=15 guess='p' avg_ms=190.9
pos=16 guess='y' avg_ms=192.4
pos=16 guess='r' avg_ms=194.0
pos=16 guess='l' avg_ms=192.3
pos=16 guess='n' avg_ms=201.6
pos=16 guess='_' avg_ms=238.1
pos=16 guess='7' avg_ms=197.3
pos=16 guess='a' avg_ms=191.4
pos=16 guess='o' avg_ms=198.6
pos=17 guess='2' avg_ms=199.6
pos=17 guess='h' avg_ms=194.2
pos=17 guess='6' avg_ms=209.8
pos=17 guess='s' avg_ms=245.0
pos=17 guess='l' avg_ms=203.7
pos=17 guess='7' avg_ms=202.0
pos=17 guess='b' avg_ms=195.2
pos=17 guess='m' avg_ms=209.0
pos=18 guess='_' avg_ms=213.2
pos=18 guess='k' avg_ms=204.7
pos=18 guess='{' avg_ms=202.7
pos=18 guess='e' avg_ms=214.6
pos=18 guess='3' avg_ms=254.9
pos=18 guess='a' avg_ms=201.1
pos=18 guess='r' avg_ms=207.9
pos=18 guess='8' avg_ms=210.1
pos=19 guess='s' avg_ms=211.8
pos=19 guess='4' avg_ms=206.1
pos=19 guess='c' avg_ms=262.3
pos=19 guess='a' avg_ms=219.8
pos=19 guess='l' avg_ms=216.7
pos=19 guess='e' avg_ms=213.1
pos=19 guess='0' avg_ms=217.0
pos=19 guess='}' avg_ms=213.7
pos=20 guess='p' avg_ms=216.1
pos=20 guess='}' avg_ms=223.1
pos=20 guess='t' avg_ms=219.7
pos=20 guess='9' avg_ms=224.4
pos=20 guess='v' avg_ms=224.1
pos=20 guess='T' avg_ms=217.6
pos=20 guess='r' avg_ms=261.4
pos=20 guess='2' avg_ms=220.9
pos=21 guess='b' avg_ms=225.7
pos=21 guess='0' avg_ms=232.9
pos=21 guess='p' avg_ms=232.9
pos=21 guess='c' avg_ms=229.6
pos=21 guess='k' avg_ms=229.8
pos=21 guess='}' avg_ms=229.0
pos=21 guess='x' avg_ms=228.5
pos=21 guess='3' avg_ms=267.2
pos=22 guess='{' avg_ms=230.1
pos=22 guess='r' avg_ms=228.5
pos=22 guess='a' avg_ms=225.0
pos=22 guess='t' avg_ms=276.0
pos=22 guess='k' avg_ms=230.5
pos=22 guess='8' avg_ms=238.9
pos=22 guess='p' avg_ms=226.4
pos=22 guess='6' avg_ms=235.0
pos=23 guess='e' avg_ms=241.1
pos=23 guess='g' avg_ms=235.0
pos=23 guess='8' avg_ms=234.9
pos=23 guess='x' avg_ms=245.6
pos=23 guess='v' avg_ms=239.9
pos=23 guess='s' avg_ms=281.8
pos=23 guess='c' avg_ms=244.0
pos=23 guess='F' avg_ms=240.1
pos=24 guess='8' avg_ms=251.0
pos=24 guess='7' avg_ms=239.3
pos=24 guess='0' avg_ms=240.4
pos=24 guess='b' avg_ms=250.8
pos=24 guess='j' avg_ms=249.2
pos=24 guess='}' avg_ms=288.7
pos=24 guess='e' avg_ms=248.3
pos=24 guess='l' avg_ms=236.3
Войдите, чтобы ответить

Пошаговый план — открывайте по одному шагу

  1. 1
    Сгруппируйте замеры по позиции.

Подсказки — каждая до решения стоит −50 очков

Задание 4Как защититься

Сравнивайте секреты за постоянное время: hmac.compare_digest, crypto.timingSafeEqual.

Разборы участников

Разборы открываются после того, как вы решите комнату, — чтобы не спойлерить ответ.