REpsych — это proof-of-concept тулсет от Christopher Domas, известного как @xoreaxeaxeax. Он умеет превращать картинки в работающие программы так, что control flow graph (CFG) этих программ рисует исходное изображение. Иначе говоря, если открыть такой бинарник в ревёрс-инжиниринговом инструменте, на графе переходов будет видна картинка, которую зашили внутрь. Никакой практической цели у проекта нет, просто чтобы показать, что такое возможно. Возможные применения, но несерьёзные, автор упоминает в презентации на DEF CON.
Работает REpsych стабильно со всеми протестированными версиями IDA Pro, а с другими просмотрщиками CFG — Hopper, BinNavi, radare2 и подобными — уже полустабильно. Тулсет переводит исходное изображение в функционирующую программу: каждый пиксель картинки становится отдельным basic block, то есть узлом CFG.
Чтобы сгенерировать новую программу из картинки, нужно сохранить изображение в папку gfx/ как 24 BPP bitmap. Затем в корне проекта запустить make image, где image — имя файла без расширения. На выходе получится два бинарника: repsych_v1 и repsych_v2. Они используют разные стратегии, чтобы CFG-рендерер правильно расставил узлы. Поскольку каждый пиксель требует отдельного узла, исходные картинки лучше брать небольшие, не больше 100×100. Возможно, придётся увеличить лимит допустимых узлов в просмотрщике CFG.
Если подать на вход тулсету изображение с текстом, сначала его стоит сконвертировать в чёрно-белый 2 BPP bitmap, а уже потом в 24 BPP. Это убирает все цвета, кроме чёрного и белого, и даёт лучший результат в control flow graph.
Детально техника разобрана в презентации с DEF CON, слайды тоже лежат в репозитории. Сам проект доступен на GitHub по адресу github.com/xoreaxeaxeax/repsych.