Ghost in the Shellcode CTF 2014 (Gitzino)

Решения

http://ppp.cylab.cmu.edu/wordpress/?p=1140 (Plaid Parliament of Pwning) Назад к списку заданий

Задание (crypto)

Question 7 - Gitzino
Points: 400
Like all good bitcoin casinos, the gitscoin casino gitzino uses unbreakable Provably Fair technology. File running at gitzino.2014.ghostintheshellcode.com

Подробное описание

Перевод решения команды Plaid Parliament of Pwning.

Заголовок сообщает, что, как и bitcoin-казино, gitscoin-казино под названием Gitzino предоставляет нам не ломаемую доказуемо честную технологию. Для анализа нам доступен исполняемый файл сервера.

При подключении к сервису нас встречает меню.

Welcome to gitsZino, a Provably Fair gitscoin Casino.
As part of our introductions, you've been given 1000 gitsCoins.
If you can get to a Million, we've got a shiny key you can buy.

1)Learn about Provably Fair
2)Check Balance
3)Play Video Poker

Итак, gitsZino – это аналог видео-покера на игровых автоматах. Его правила такие же, как и в любом другом видео-покере. Игрок делает ставку, после чего ему раздают пять карт в открытую. Он оставляет те карты, которые захочет, а остальные меняет. После обмена у игрока образуется обычная пятикарточная комбинация. Все комбинации видео-покера полностью соответствуют комбинациям классического покера (флэш, каре, стрит и так далее). Из баннера мы узнаем, что для старта у нас есть 1000 gitsCoins (проверка баланса – 2-й пункт меню). Наша задача выиграть миллион.

Описание чудо-технологии, используемой в gitsZino при сдаче карт, получим, если отправить пункт меню 1.

1
We utilize a novel cryptographic approach which ensures that neither you nor us can possibly know the shuffle of a deck until the moment it is dealt.
First, we send you the SHA256 of our secret.
Then, you shuffle the deck however you want.
Once you've shuffled the deck, you send both the deck and a secret of your own to us.
Our servers then hash the combination of the server_seed and the client_seed (using SHA256 again). We use this hash to seed the Mersenne Twister pseudorandom number generator. We then fully reshuffle the deck using this random number generator. Since the random number > > generator was seeded using a number that only you knew before the deal, there is no possible way for us to know the outcome of this shuffle.

Мы используем новейший криптографический метод, предусматривающий то, что ни вы, ни мы не сможем узнать перетасованные карты до момента их сдачи.
Во-первых, мы высылаем Вам SHA256 нашего секрета.
Затем, вы как угодно тасуете колоду.
После перетасовки, вы посылаете нам колоду карт и свой собственный секрет.
Затем наши серверы объединяют server_seed и client_seed вместе (и снова с помощью SHA256). Этот хэш используется для инициализации "вихря Мерсенна" (генератора псевдослучайных чисел - ГПСЧ). Потом мы перетасовываем колоду с помощью этого генератора случайных чисел. Поскольку начальное значение (seed) генератора было задано с использованием числа, которое знаете только вы до сдачи карт, то у нас нет никакой возможности узнать конечный результат этой перетасовки

Судя по описанию, Gitzino похожа на проблему предсказывания внутреннего состояния генератора псевдослучайных чисел. Зная, как будет вести себя генератор, мы сможем угадывать, какие карты выпадут и делать соответствующие ставки, чтобы выиграть игру.

Но нашелся более простой способ. Даже не способ, а ошибка, связанная со слабым контролем входных значений. Изучая код сервера, выясняется, что ставка может быть отрицательной. Есть только единственная проверка на превышение текущего баланса:

.text:08048D7E                 call    _strtol                # eax = значение ставки (bet)
.text:08048D83                 mov     ebx, [esp+98h] #текущий баланс gitsCoins
.text:08048D8A                 cmp     eax, ebx
.text:08048D8C                 mov     [esp+0A8h], eax #сохраняем значение ставки
.text:08048D93                 jle     short bet_ok
.text:08048D95                 mov     eax, [esp+7C0h]
.text:08048D9C                 mov     dword ptr [esp+4], offset aBetTooBig_ ; "Bet too big.\n"
.text:08048DA4                 mov     [esp], eax
.text:08048DA7                 call    sendMsg

И в случае если карты не дали никакую комбинацию, то при отрицательном значении ставки – мы выиграем.

.text:080498AC                 mov     eax, [esp+7C0h]
.text:080498B3                 mov     dword ptr [esp+4], offset aNothing___ ; "Nothing...\n"
.text:080498BB                 mov     [esp], eax
.text:080498BE                 call    sendMsg
.text:080498C3                 mov     eax, [esp+0A8h] # eax = значение ставки
.text:080498CA                 sub     [esp+98h], eax    # баланс = баланс – ставка

Да, конечно, есть вариант, что выпадет флэш, "тройка", "валеты или выше" и т.п., то при отрицательном значении ставки – мы проиграем. Такая ситуация возможна, но как показывает жизнь - редко. Последовательность действий такая: каждый раз задаем максимальную отрицательную ставку (-99999) до тех пор, пока не наберем миллион (а значит, и получим флаг). Кстати, колода карт задается алфавитом (0-9a-zA-P), всего 52 карты.

Пример (наш ввод выделен жирным):

3
Bet:
-99999
Our Secret_hash is dbfa2c5a2cd919c24fc0c3047f11e18f863b4a86e40c44a2f2798b5fc47213df
Please supply your suffled deck
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP
The deck you supplied is 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP
Supply your secret (up to 256 bytes)
AAAAAAAAAAAAAAAAAAAAA…..AAAAAAAAAAAAAAAAAA
Your starting hand is 10sAs3h4s2
Which cards would you like to return?
Your ending hand is 10sAs3h4s2
The seed for our shuffle is 7d328989ecbd9215f759bf8b0ef85ffc85726a18e823aa90cbf76cd46f25ccf3
Nothing…
1)Learn about Provably Fair
2)Check Balance
3)Play Video Poker

2
Your currnet balance is 100999 gitsCoins.

Флаг:
Huh. That's not supposed to happen…
The key is: Twister? I hardly knew her

Пока не указано иное, содержимое этой страницы распространяется по лицензии Creative Commons Attribution-ShareAlike 3.0 License