Попала ко мне в руки игра Дракула в виде teledisk образа диска.
HxC софт понимает TD0 формат, поэтому все было просто переброшено на эмулятор дисковода и сразу заработало на живом львове.
Но вот, что интересно:
- игра стартует автоматом после сброса
- если поставить другой диск и выйти на командную строку хамелеона,
а потом поставить дракулу и сказать DIR, то каталога неувидим и игра снова стартует автоматом
- просмотр кода первого сектора показал, что там мусор и совсем непохоже на хамелеоновский каталог.
- копировть диск неполучается
Это было все очень интересно и заставило потратить пару часов на дизассемблирование хамелеона :-)
Вот как это работает.
Сам диск интересно размечен. Установить структуру очень просто: берем HxC софт, загружаем TD0 и сохраняем как XML.
Вот небольшая выдержка:
т.е. по 3 сектора на дорожкеКод:<number_of_track>83</number_of_track> <number_of_side>2</number_of_side> <format>IBM_FM</format> <start_sector_id>1</start_sector_id> <sector_per_track>3</sector_per_track> <sector_size>1024</sector_size> <formatvalue>0</formatvalue> <gap3>255</gap3> <bitrate>250000</bitrate> <pregap>0</pregap> -<sector sector_size="1024" sector_id="1"> -<sector sector_size="1024" sector_id="16"> -<sector sector_size="128" sector_id="19"> <data_fill>0x00</data_fill>
номера секторов 1, 16, 19
размеры секторов 1024, 1024, 128
сектор 128 байт всегда заполнен нулями, два других неcут информацию.
Хамелеон пытается прочесть первый сектор каталога в буфер 0xBD00
ВГ93 читает сектор целиком, все 1024 байта.
Получается buffer overflow attack :-)
Начало стека известно из листинга хамелеона 0xBE80
0xBE80-0xBD00 = 0x180
вычислять положение указателя на момент чтения сектора совсем необязательно, можно просто пробить стек нужным адресом на некоторую глубину. В Дракуле 16 раз повторяется адрес 0xBD00
Вот такие люди в стране советской были! :-)
Справедливости ради стоит заметить, что авторы Хамелеона и Дракулы - одни и те же люди.




Ответить с цитированием