Задание: 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")**})
	}
}