Задание: Lex, SPbCTF Прохождение: Влад Росков, SPbCTF
Талантливый разработчик хочет устроиться в бигтех, но боится неудачи. Он планирует съесть сто счастливых билетиков. И у него нет времени их искать, да и в кармане только 5000 ₽.
Заставьте терминал городского транспорта выдать ему пачку счастливых билетов — с равной суммой первых и последних трех цифр.
Терминал: t-luckyticket-w8mg6qr0.spbctf.ru/
Исходный код терминала: luckyticket.tar.gz
Задание с исходниками, поэтому сначала немного подёргаем функциональность сайта, а потом пойдём смотреть логику внутри.
Купили несколько билетов — ни одного счастливого
В веб-интерфейсе нам доступны такие действия:
Быстро прикинем:
Значит, нужно научиться получать счастливые билеты неслучайным образом.
К заданию прикреплен архив с полными исходникам сервиса на Go, вместе с докерфайлом — будет легко, если что, поднять сервис локально.
Начнём раскручивать с конца — поймём, где флаг.
func **CheckLuckForInterview**(s storage.Store) gin.HandlerFunc {
return func(c *gin.Context) {
// ...
if user.Luck != 100 {
c.JSON(http.StatusBadRequest, gin.H{"luck": user.Luck, "error": errInterviewFailed.Error(), "message": helpers.GetReviewFailMsg()})
return
}
user.Luck = 0
_, err = s.Users().Update(user)
c.JSON(http.StatusOK, gin.H{**"flag": viper.GetString("flag")**})
}
}