Так что, если ваша компания не включает кофе в свой контракт, я покажу вам, как получить его бесплатно, используя трюк из 90-х.

Зависимость

Еще один день, еще дюжина чашек кофе, еще одно хакерское путешествие.

Я отдыхал в зоне отдыха компании, в которой работаю, но это был не обычный кофе-брейк. Мои глаза уставились на автомат с кофе в какой-то момент по-другому. Раньше я покупал кофе, сканируя QR-код с помощью приложения поставщика для оплаты кредитной картой, но торговый автомат также позволяет вставлять монеты и проприетарную ручку, с которой вы можете снимать деньги. Я спросил себя: «Почему эта ручка до сих пор используется?». На самом деле я видел много сотрудников, использующих его, возможно, бумеры недовольны этим приложением?

В любом случае, эта ручка не казалась мне такой уж надежной, и здесь началось путешествие.

«Библия» и эти легендарные ребята

Я был уверен, что кто-то уже должен был взломать эту штуку. Через несколько шагов, перескакивая с форума на форум, я наткнулся на настоящий киберпанк.

На дворе 2001 год, интернет — это куча гифок и разных неведомых форумов. Какие-то сумасшедшие анонимные электронные студенты выпускают документ о том, как они реконструировали кофейную ручку, они назвали его «Библией».

Статья написана в стиле proto-Medium, с большим количеством забавных комментариев между предложениями.

Ручка

В первой части статьи объясняется, как устроена ручка и как ее открыть. На самом деле печатная плата находится внутри блока твердой смолы, и для ее плавления необходим растворитель.
Поэтому я попросил у своей девушки жидкость для снятия лака и сказал ей, что мне небезразличен уход за руками.

После большой ручной работы, чтобы не повредить схему, печатная плата была чистой. Казалось, это просто EEPROM с LC-схемой.

Воспоминания

Большой! Я раскрыл распиновку EEPROM, в статье указана модель: Microchip 24c02 . EEPROM имеет 256 байт памяти, и всего с 4 проводами я могу читать и записывать через I2C.

Но мне нужен был программатор микроконтроллера, чтобы общаться с ним. Я порылся в своей старой школьной коробке, полной электроники, которую я паял, и нашел Pickit2, который я использовал для программирования PIC16F1827, когда был молодым.

Соединения

EEPROM имеет простую распиновку, 1,2,3,4 и 7 подключены к земле (это включает режим записи). Контакт 6 — это часы, 8 VCC (от 3,3 В до 4,5 В), а 5 — данные. Для Pickit2 требуется один подтягивающий резистор на 10 кОм между VCC и SDA. У меня его не было, поэтому я использовал тщательно откалиброванный триммер.

Признаюсь, прошло так много времени с момента последней пайки, которую я делал…

Дай мне эти байты

Хорошо, все было готово. Я запустил программу Pickit2, выбрал устройство EEPROM, нажал кнопку чтения, молясь Богу, чтобы я ничего не сжег, и…

А вот и свалка, ду-ду-ду-ду.

Вставьте монету

Дамп я получил, но что означали эти байты? К счастью, эти легендарные ребята проделали большую работу. Во второй части статьи рассказывается, как разбираются, вставляя монеты за монетами, где хранится кредит, видя, какие байты изменились.

Кредит имеет длину 4 байта, начиная с 0x44, и составляет 0,04 €.

Почему?

80C041C0

Для каждого байта берутся младшие шестнадцатеричные полубайты

0 0 1 0

Преобразуйте их в двоичный файл с заполнением четырьмя нулями.

n₃ = 0000
n₂ = 0000
n₁ = 0001
n₀ = 0000

Разделите каждый полубайт на 2 бита в высоком и 2 бита в низком

h₃= 00, l₃= 00
h₂ = 00, l₂= 00
h₁ = 00, l₁ = 01
h₀ = 00, l₀ = 00

Это основание 4коэффициенты показателей степени по основанию 2.

0*2¹⁴ + 0*2¹² + 0*2¹⁰ + 0*2⁸ + 0*2⁶ + 0*2⁴ + 1*2² + 0*2⁰ = 4 = 0.04 €

Чувствуете себя сбитым с толку? Не беспокойтесь, я тоже, поэтому я написал несколько строк кода на Python, чтобы лучше понять алгоритм.

Таким образом, максимальная доступная сумма кредита должна быть:
3*2¹⁴ + 3*2¹² + 3*2¹⁰ + 3*2⁸ + 3*2⁶ + 3*2⁴ + 3*2²+ 3*2⁰ = 65535 = 655,35 €

Возвращаясь к битовой записи

h₃= 11, l₃= 11
h₂ = 11, l₂= 11
h₁ = 11, l₁ = 11
h₀ = 11, l₀ = 11

Это приводит к нашим самым низким откусываниям в base16
F F F F

Прохладный! Итак, могу ли я заменить эти кусочки (8F CF 4F CF), чтобы получить 655,35 € вместо 0,04 €?

Неа.

Сумма «чека»

Требуется еще один небольшой шаг, взгляните на кредитные байты
80 C0 41 C 0
А как насчет самых старших фрагментов, которые мы еще не рассмотрели?
8 C 4 C
Кажется, это своего рода контрольная сумма, и они обнаружили, что она зависит только от стоимость кредита.

Форум это:

Эм, я не могу описать это в математических обозначениях, извините, вот код

Резервное копирование

По какой-то причине 4 байта, начиная с 0x54, являются резервными. Вероятно, в случае неисправности торговый автомат может восстановить правильный кредит. К счастью, он отличается всего одним полубайтом, фактически резервная копия вычисляется путем уменьшения второго полубайта контрольной суммы на 4.

Таким образом, если кредит
80 C0 41 C0
резервный
80 80 41 C0

C — 4 = 8

Легкий.

Редактор кофе

Да, мне было скучно, поэтому я сделал графический редактор из предыдущих фрагментов.
Кстати, tkinter — это круто.



Пишите и тестируйте, что может пойти не так?

Итак, начнем, я отредактировал дамп, добавив 10 €, успешно записанных в EEPROM с помощью Pickit2, и я оказался перед торговым автоматом.

Я подключил перо, но красный светодиод над портом начал мигать…
Перо не было правильно распознано.

В течение следующих дней я пытался выяснить, почему, я прочитал все ветки форума, говорящие об этой ручке, и нашел способ. Некоторые байты, вероятно, начиная с адреса 0x20, соответствуют коду поставщика. Каждый торговый автомат может считывать только свои ручки, мой не распознается, потому что я получил его от другой компании.

Еще я обнаружил интересную особенность. На самом деле, когда перьевая ручка впервые подключается к торговому автомату, она инициализируется своим кодом продавца!

как девственница

Так что мне нужна была девственная ручка. Первой попыткой была запись байта FF во всю EEPROM.
Но не получилось, мигает тот же красный светодиод.

Так что насчет того, чтобы найти свалку девственниц? Мне нужно было где-то купить девственное перо, переплавить его, прочитать снова, и в конце концов я получил то, что искал.

Но в какой-то момент случайно встреченный в группе Telegram спаситель сбросил мне драгоценный девственный дамп.

Я записал девственный дамп в EEPROM и подключил к автомату. На этот раз светодиод мигнул красным всего на 2 секунды, а затем загорелся ЗЕЛЕНЫМ светом!

Казалось, что ручка была правильно привязана к торговому автомату, поэтому я вставил монету в 10 центов, и ручка была успешно заряжена!

Я снова сбросил EEPROM и заметил, что многие байты изменились, подтверждая, что торговый автомат правильно инициализировал ручку своим кодом поставщика и моими 10 центами!

Через десятилетия и дальше

Хорошо, пока ничего интересного, но я был готов отредактировать кредит благодаря редактору кофе.

Итак, я превратил свои 10 центов в 10 евро, записал дамп в EEPROM, подключил ручку к автомату…

О БОЖЕ, правда? Он (до сих пор) работает!

Да, кредит был 9,47 евро на самом деле, потому что я украл 53 цента кофе, просто чтобы проверить его, а затем вручную погасил торговый автомат.

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

Почему они до сих пор позволяют это?

мой питомец дельфин

Моему дельфину нужна забота, внимание и его нужно кормить (правда, его надо халтурить, а то становится грустно). Вот почему я сделал FAP

(Пакет приложения Flipper)

Если вы еще не слышали о Flipper Zero, предлагаю вам прочитать мою предыдущую статью ниже, где я взломал ресторан благодаря ему.



Flipper Zero построен на основе известного микроконтроллера STM32, и вы можете управлять любыми устройствами I2C (например, EEPROM) через GPIO.

Идея заключалась в том, чтобы написать FAP, который прочитал кредит и установил его на 10 €.

Сначала я подключил EEPROM к Flipper:

SDA -> Контакт 15
SCL -> Контакт 16
VCC (3,3 В) -> Контакт 9
GND -> Контакт 18

Затем я поставил два подтягивающих резистора 4k7 Ом от SDA до VCC и один от SCL до VCC (опять же, я использовал два триммера…)

Я определенно не эксперт по C++, но, к счастью, прошивка Flipper имеет встроенный API I2C.

#include "furi_hal_i2c.h"

Мне просто нужна функция, которая считывает кредитные байты

и функция, которая записывает кредит

Благодаря репозиторию, на который я ссылался ниже, я получил пример Hello World FAP в качестве простого руководства по рисованию вещей на экране Flipper.



GitHub — mfulz/Flipper-Plugin-Tutorial: Начните работу с Flipper Zero, создав собственный «Hello…
Учебник о том, как создать базовый плагин Hello world для Флиппер Зеро. Это руководство включает: Шаблон исходного кода для…github.com»



И это результат, нажмите «Влево», чтобы сделать его девственным, нажмите «Вправо», чтобы установить 10 €, нажмите «ОК», чтобы сбросить EEPROM на терминал при подключении через последовательный порт USB.



Выводы

Что ж, это было действительно весело. Спасибо за внимание!

Отказ от ответственности

Вся информация и действия, описанные в этой статье, описываются только в образовательных целях. Все их можно легко найти на других форумах. Я не несу ответственности за любое незаконное использование этой информации. Изменить кредит — все равно, что украсть.