Надеюсь это поможет!

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

Я вырос, играя в Pokémon Red and Blue, игры, которые были очень увлекательными, но несколько печально известны тем, что в них было много уязвимостей (например, см.этот смешной спидран игры который использует повреждение памяти, чтобы превратить экран элемента в шестнадцатеричный редактор).

Недавно я обнаружил интересный скоростной запуск игры, в котором используется сбой, называемый «сбой ZZAZZ», чтобы повредить важные области памяти и позволить игроку почти сразу же выиграть игру. Согласно савторское описание спидрунаГлюк ZZAZZ работает следующим образом:

Чтобы начать битву с трейнером, игре нужно загрузить много данных, например, [...] деньги, которые он уступит в случае поражения. Когда он загружает деньги, все может стать действительно безобразным. По независящим от меня причинам деньги хранятся совершенно по-другому, в игре используется структура данных из трех байтов, и вместо преобразования значения в двоичное, она хранится в «человеческом» представлении. Например, $ 123456 будет храниться как 0x123456 вместо 0x01E240, правильное преобразование.

[Некоторые неверные записи в таблице тренеров] указывают на местоположение с недействительными данными о деньгах. Когда игра пытается выполнить арифметику с этими данными в указанной структуре, она сходит с ума и начинает перезаписывать огромные порции оперативной памяти. Более конкретно, для каждого блока из трех байтов два из них будут содержать 0x9999 (максимальная сумма денег, которую может дать тренер). Этот шаблон повторяется много раз через RAM. Чтобы лучше это увидеть, я рекомендую приостановить воспроизведение видео на эмуляторе после того, как наложен трейнер ZZAZZ, и установить средство просмотра памяти VBA на 0xD070.

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

Мой вопрос - без специальной разработки алгоритма, чтобы потерпеть неудачу таким образом,Существует ли прямая реализация преобразования десятичного числа с шестнадцатеричным кодом в десятичное, что может привести к повреждению памяти такого рода при подаче недопустимого значения?

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

Ответы на вопрос(3)

Ваш ответ на вопрос