В этой статье будет представлен обзор того, как мы можем извлечь имена функций из двоичных файлов Windows GoLang, чтобы упростить реверс, а также кратко проанализировать Robbinhood Ransomware, который недавно атаковал Балтимор. GoLang - это язык программирования, разработанный для многопоточных приложений. Сложность обращения двоичных файлов GoLang состоит в том, что все библиотеки статически связаны, что означает, что в приложении будет большое количество функций, большинство из которых даже не используются во время выполнения. Например, в обычном скомпилированном двоичном файле GoLang Hello World, radare2 обнаруживает 1800 функций.
Раздел gopclntab в программе GoLang содержит таблицу расположений функций вместе с их именами. Radare2 может разобрать эту таблицу и соответствующим образом пометить каждую функцию, однако это работает только для двоичных файлов, скомпилированных для Linux. Когда дело доходит до Windows, Radare2 не может найти gopclntab, и мы остаемся с тысячами функций без меток, не зная, что они делают. Я решил узнать, как работает gopclntab, и создать парсер, используя r2pipe для обозначения всех функций.
Gopclntab
Кажется, что раздел gopclntab всегда начинается с байтов
Используя эту таблицу, мы можем получить всю информацию о функции для двоичного файла. Я создал небольшой скрипт на python, который использует r2pipe для разбора этой таблицы и переименования / создания необходимых функций. Вы можете получить скрипт на моем gitHub . Также вот вам ссылка на полную статью о gopclntab, вдруг кому-то будет интересно - http://lekstu.ga/posts/pclntab-function-recovery/
Robbinhood
В мае город Балтимор оказался заражен локером под названием Robbinhood. Сам ransomware был написан на GoLang, так что я подумал, что это хорошая возможность познакомиться с реверсом GoLang и проанализировать образец.
При обращении двоичного файла GoLang основная функция будет расположена в main.main . Обращаясь к этой функции в radare2, мы видим, что двоичный файл пытается открыть файл
Если файл
После вызова функции CoolMaker Robbinhood создаст 4 процесса функции main.main.func1, в которых, по-видимому, и происходит фактическое шифрование. Функция вызывает другую функцию,
Программа также записывает в лог имена зашифрованных файлов: rf_l, rf_s, ro_l, ro_s . Оба файла
Выдаваемое сообщение с требованием о выкупе содержится в двоичном виде, в виде закодированной строки в base64. Примечания (сумма платежа и ID пользователя), определяются другими переменными, чтобы сделать их легко заменяемыми в зависимости от того, кто является жертвой. Например, ID кошелька определяется как
В целом, это был не очень продвинутый локер. Он очень громкий из-за того, что выключает несколько антивирусов. Также, у рассмотренного локера не было способности распространяться вообще. Каждый зараженный компьютер должен был быть выбран индивидуально, чтобы причинить реальный ущерб.
Автор: Jacob Pimental
перевод tabac, специально для xss.pro
Раздел gopclntab в программе GoLang содержит таблицу расположений функций вместе с их именами. Radare2 может разобрать эту таблицу и соответствующим образом пометить каждую функцию, однако это работает только для двоичных файлов, скомпилированных для Linux. Когда дело доходит до Windows, Radare2 не может найти gopclntab, и мы остаемся с тысячами функций без меток, не зная, что они делают. Я решил узнать, как работает gopclntab, и создать парсер, используя r2pipe для обозначения всех функций.
Gopclntab
Кажется, что раздел gopclntab всегда начинается с байтов
0xfbffffff, и после этого содержит размер таблицы. Следующие 8 байтов содержат местоположение первой функции, а затем смещение этой функции от начала таблицы. Если вы перейдете к этому смещению от начала таблицы, вы получите смещение для имени функции.Используя эту таблицу, мы можем получить всю информацию о функции для двоичного файла. Я создал небольшой скрипт на python, который использует r2pipe для разбора этой таблицы и переименования / создания необходимых функций. Вы можете получить скрипт на моем gitHub . Также вот вам ссылка на полную статью о gopclntab, вдруг кому-то будет интересно - http://lekstu.ga/posts/pclntab-function-recovery/
Robbinhood
В мае город Балтимор оказался заражен локером под названием Robbinhood. Сам ransomware был написан на GoLang, так что я подумал, что это хорошая возможность познакомиться с реверсом GoLang и проанализировать образец.
При обращении двоичного файла GoLang основная функция будет расположена в main.main . Обращаясь к этой функции в radare2, мы видим, что двоичный файл пытается открыть файл
C:\Windows\Temp\pub.key. Строки в двоичном коде GoLang не заканчиваются нулем, как большинство языков программирования C-типа. Вместо этого у них есть переменная, которая содержит длину строки.
Если файл
pub.key не существует, программа выдает ошибку и завершает работу. Если он существует, программа получит список дисков, к которым у компьютера есть доступ, и запустит функцию main.CoolMaker. Функция CoolMaker порождает несколько процессов cmd.exe для запуска диспетчера управления службами, чтобы отключить все антивирусы на зараженном хосте.
После вызова функции CoolMaker Robbinhood создаст 4 процесса функции main.main.func1, в которых, по-видимому, и происходит фактическое шифрование. Функция вызывает другую функцию,
main.doit, которая создает ключ шифрования на основе файла pub.key, найденного в начале. Затем эти процессы будут рекурсивно проходить через файловую систему и шифровать любые найденные файлы.Программа также записывает в лог имена зашифрованных файлов: rf_l, rf_s, ro_l, ro_s . Оба файла
rf_* записывают в логи имена файлов, которые малваря считает «интересными». Журналы ro_* содержат все остальные имена файлов. Оба набора логов разделены на файлы большого размера (rf_l, ro_l) и файлы малого размера (rf_s, ro_s). Эти логи удаляются, как только завершается выполнение малвари.
Выдаваемое сообщение с требованием о выкупе содержится в двоичном виде, в виде закодированной строки в base64. Примечания (сумма платежа и ID пользователя), определяются другими переменными, чтобы сделать их легко заменяемыми в зависимости от того, кто является жертвой. Например, ID кошелька определяется как
#WALLAD# и заменяется строкой 14yos7dpe4bx3imnoGVUcMsNBwU1hLutfj. Я проверил, были ли сделаны какие-либо платежи на этот bitcoin кошелек, оказалось, что нет; город не заплатил выкуп.
В целом, это был не очень продвинутый локер. Он очень громкий из-за того, что выключает несколько антивирусов. Также, у рассмотренного локера не было способности распространяться вообще. Каждый зараженный компьютер должен был быть выбран индивидуально, чтобы причинить реальный ущерб.
Автор: Jacob Pimental
перевод tabac, специально для xss.pro