Попала ко мне в руки игра Дракула в виде teledisk образа диска.
HxC софт понимает TD0 формат, поэтому все было просто переброшено на эмулятор дисковода и сразу заработало на живом львове.
Но вот, что интересно:
- игра стартует автоматом после сброса
- если поставить другой диск и выйти на командную строку хамелеона,
а потом поставить дракулу и сказать DIR, то каталога неувидим и игра снова стартует автоматом
- просмотр кода первого сектора показал, что там мусор и совсем непохоже на хамелеоновский каталог.
- копировть диск неполучается
Это было все очень интересно и заставило потратить пару часов на дизассемблирование хамелеона :-)
Вот как это работает.
Сам диск интересно размечен. Установить структуру очень просто: берем HxC софт, загружаем TD0 и сохраняем как XML.
Вот небольшая выдержка:
Код:
<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>
т.е. по 3 сектора на дорожке
номера секторов 1, 16, 19
размеры секторов 1024, 1024, 128
сектор 128 байт всегда заполнен нулями, два других неcут информацию.
Хамелеон пытается прочесть первый сектор каталога в буфер 0xBD00
ВГ93 читает сектор целиком, все 1024 байта.
Получается buffer overflow attack :-)
Начало стека известно из листинга хамелеона 0xBE80
0xBE80-0xBD00 = 0x180
вычислять положение указателя на момент чтения сектора совсем необязательно, можно просто пробить стек нужным адресом на некоторую глубину. В Дракуле 16 раз повторяется адрес 0xBD00
Вот такие люди в стране советской были! :-)
Справедливости ради стоит заметить, что авторы Хамелеона и Дракулы - одни и те же люди.