§7.2. Для самых маленьких

Разобраться, как работает программа — целое искусство. Однако глубокий анализ бывает нужен не всегда. Порой достаточно лишь посмотреть на данные, с которыми программа работает. Для этого существует два старых, известных и простых трюка.

Забиваем строки микроскопом

Какие-то программы — это текстовые файлы, которые легко открыть, прочитать или изменить. К таким программам относится абсолютно всё, что мы с вами писали на Python, например. Но попробуйте открыть в текстовом редакторе, скажем, ваш любимый браузер, и вы увидите, что он не то чтобы особо читаемый:

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

Примечание

  • Быстро извлечь все читаемые байты из программы можно и без текстового редактора — для этого на Linux и Mac OS есть встроенная утилита strings, которая принимает на вход любой бинарный файл и возвращает всё, что сможет в нём прочитать:

  • $ strings greeter9k-linux
    GREETER H
    9000 VERH
    SION. 1.H
    CopyH
    right (cH
    ) 2019 TH
    eemorka H
    ...
  • Бинарные файлы могут достигать неприлично больших размеров — вы уже сталкивались с этим явлением в задачах Энтерпрайз I и II, и, наверное, представляете, насколько тяжело изучать подобные файлы в текстовом редакторе.

В закромах внутренних архивов Ugra CTF мы нашли кросс-платформенное приложение Greeter 9000. Это приложение предназначено для приветствия некого Тимурки:

Маловероятно, что вас зовут так же, как и предполагаемого автора приложения, что делает его малополезным. Но эту досадную неприятность можно исправить! Откройте исполняемый файл для вашей платформы в любом HEX-редакторе. Вы обнаружите сперва некоторые служебные надписи, а в примерно в середине файла — тот самый текст, который отображает приложение.

Этот текст можно аккуратно заменить на любой другой, если соблюдать два важных условия: новая строка должна быть либо такой же по длине, либо короче — в этом случае её надо закончить нуль-символом (но не символом ноля! проще всего ввести нужный символ в режиме прямого ввода HEX-чисел — это буквально: 00), например:

Сохраните файл. Если вы всё сделали правильно, программа запустится и выдаст результат, радующий глаз:

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

IDDQD на максималках

Второй трюк тоже связан с простым анализом данных, но на этот раз изучать мы будем оперативную память. Когда вы запускаете программу, операционная система содаёт процесс и выделяет ему определённую область памяти. Сколько процесс попросит — столько и будет (при условии, что системе есть из чего выделять). Обладая правами администратора, на любой современной операционной системе можно получить доступ к области памяти почти любого процесса — причём мы сможем не только читать эту память, но и изменять её.

Для подобной работы с памятью существует много программ. Например, ArtMoney. Это легендарная программа, универсальный чит для почти любой игры. В качестве жертвы хорошо подойдёт Freedoom, свободный клон другой, не менее легендарной программы Doom.

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

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

Запустим Freedoom и ArtMoney. Укажем в ArtMoney процесс, с которым мы хотим работать, с помощью списка Выбери процесс — найдём там пункт ZDOOM. После этого у ArtMoney появится доступ к области памяти игры. Дело за малым: найти конкретные адреса, в которых хранятся значения, отвечающие за количество аммуниции и очки здоровья. Поскольку в памяти может храниться очень большое количество значений, которые к тому же никак не подписаны, сразу найти нужное среди огромного количества похожих практически невозможно, особенно в нашем случае. В этом легко убедиться. Загрузите любой уровень игры, после чего перейдите в ArtMoney и выполните поиск по значению 50 — ровно столько у вас сейчас патронов:

Результатов слишком много, но оно и понятно — не такое уж и редкое число 50. ArtMoney предлагает отсеивать значения по тому, как они изменяются во время игры. Адресов со значением 50 в разы больше, чем адресов, значение которых сначала было 50, а затем каким-то другим. Так сделаем же его каким-то другим: переключитесь в игру и выстрелите пару раз, чтобы патронов стало, допустим, 46. Переключитесь обратно и нажмите на кнопку Отсеять, где введите новое число патронов. Результатов станет примерно в семь тысяч раз меньше:

Перенесите все эти адреса в рабочую область программы, нажав на . Теперь наступает время экспериментов: каждое из найденных значений что-то означает, но понять, что именно, можно только опытным путём. Иногда бывает, что достаточно отредактировать значение по одному адресу из многих, иногда — что несколько адресов взаимосвязны, и мало изменить один из них, надо аккуратно поправить все. Поиграйтесь с результатами поиска и определите адрес, который отвечает за аммуницию у вас. Для наглядности можно дать ему имя в таблице:

Сделав изменение, вернитесь к игре и обратите внимание, что значение моментально обновилось.

Аналогичные манипуляции можно провести и с очками здоровья. Кроме того, для пущего веселья ArtMoney позволяет заморозить любой адрес: программа будет следить за попытками игры поменять значение по выбранному адресу и автоматически откатывать любое изменение. Вот теперь в игру действительно весело играть:

Кроме шуток

Данные в оперативной памяти особо не защитишь. В отличие от диска, оперативную память даже не зашифруешь, как минимум потому, что ключ шифрования всё равно придётся хранить в ней же в открытом виде.

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

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

Выводы

  1. Иногда файлы программ — каша из случайных байтов вперемешку с текстом. Прочитать этот текст можно с помощью любого текстового редактора или утилиты strings.

  2. Эти же файлы в некоторых случаях можено аккуратно редактировать, не нарушая их работоспособности.

  3. Имея соответствующие права, можно получить доступ к памяти любого процесса в системе и редактировать её как угодно.

  4. Теперь вы знаете, как работает ArtMoney.

§7.3. Что делает программа ⟶