Георгий Зайцев - Reversing golang

Preview:

Citation preview

GOLANGРЕВЕРСИНГ

MAINЧАСТЬ 1

НАЧАЛО

ПРИВЕТ

▸ Точка входа 1

НАЧАЛО

ПРИВЕТ2

▸ Точка входа 2

НАЧАЛО

КАК НАЙТИ MAIN?

▸ Написать свой «hello, world» и найти по нему. Или поискать программу с отладочными символами.

НАЧАЛО

КАК НАЙТИ MAIN

ТЕКСТ

КАК НАЙТИ MAIN

ТЕКСТ

КАК НАЙТИ MAIN

ИМЕНА ФУНКЦИЙЧАСТЬ 2

ИМЕНА ФУНКЦИЙ

ИДЕЯ

▸ Желание восстановить имена хотя бы части функций естественно вытекает из предыдущей части

▸ Три подхода:

▸ Rizzo

▸ IDB2PAT

▸ Ультимативный способ, работающий только для golang

ИМЕНА ФУНКЦИЙ

RIZZO

▸ https://github.com/devttys0/ida/tree/master/plugins/rizzo

▸ Позволяет создавать сигнатуры по IDB файлу

▸ Не требует IDA FLAIR

▸ Нетороплив (субъективно)

▸ Не идеально работает - многое пропускает, но возможно это легко исправляется

ИМЕНА ФУНКЦИЙ

RIZZO

ИМЕНА ФУНКЦИЙ

IDB2PAT

▸ https://github.com/fireeye/flare-ida/blob/master/python/flare/idb2pat.py

▸ Создает PAT файл по данному idb файлу

▸ Необходим IDA FLAIR для генерации сигнатур

▸ После генерации сигнатуры все летает

▸ Где то полгода назад у меня был файл, на котором старая версия скрипта зависала

ИМЕНА ФУНКЦИЙ

IDB2PAT

ИМЕНА ФУНКЦИЙ

УЛЬТИМАТИВНЫЙ СПОСОБ

▸ Волшебные секции

▸ .typelink

▸ .gopclntab

▸ .noptrdata

▸ Нас будет интересовать .gopclntab

ИМЕНА ФУНКЦИЙ

.GOPCLNTAB

▸ http://golang.org/s/go12symtab

▸ go/src/cmd/link/internal/ld/pcln.go

ИМЕНА ФУНКЦИЙ

FUNC_N STRUCTURE

ИМЕНА ФУНКЦИЙ

FUNC_N STRUCTURE

▸ Вот так это выглядит

ИМЕНА ФУНКЦИЙ

АВТОМАТИЗАЦИЯ

▸ Это все восхитительно, но руками все восстанавливать крайне грустно

▸ Довольно несложно (зная все вышесказанное) это все делать автоматически

▸ https://gitlab.com/zaytsevgu/goutils/blob/master/go_renamer.py

ИМЕНА ФУНКЦИЙ

АВТОМАТИЗАЦИЯ. ДО И ПОСЛЕ

ТИПЫЧАСТЬ 3

ТИПЫ

ПОЛУЧЕНИЕ ИМЕН ТИПОВ

▸ Значение возвращается через стек :)

▸ Что такое unk_8560d40?

▸ Очень крутой сайт у GO :)

▸ Поиск по сорцам реально удобный

ТИПЫ

СТРУКТУРА _TYPE

▸ Имеет разный вид в зависимости от версии языка:

▸ Go 1.2 Go 1.6 Go 1.7

ТИПЫ

СТРУКТУРА _TYPE

▸ До версии 1.7 был указатель на строку. Теперь смещение от .rodata до типа name

ТИПЫ

СТАНДАРТНЫЕ ТИПЫ

▸ String

▸ Slice

▸ Error

▸ iface

ТИПЫ

REFLECT

▸ Я был почти доволен, но https://github.com/naoina/toml/

ТИПЫ

ВОССТАНОВЛЕНИЕ СТРУКТУР

▸ WHAT?

▸ Опять посмотрим на src/reflect/type.go (go1.2)

ТИПЫ

ВОССТАНОВЛЕНИЕ СТРУКТУР

▸ Так это выглядит для go 1.7

ТИПЫ

UNK_8560D40

▸ Восстанавливаем тип

ТИПЫ

А ЕСЛИ ЕЩЕ?

▸ enum kind. Определяет тип типа :)

ТИПЫ

ОСТАЛЬНЫЕ ТИПЫ

▸ Все в том же файле src/reflect/type.go находятся описания и для всех остальных типов

ТИПЫ

ИНТЕРФЕЙСЫ

▸ Довольно важная часть языка(наверное)

ТИПЫ

ИНТЕРФЕЙСЫ

▸ Определяет набор методов, которые должны быть реализованы

▸ Конкретный тип определяется следующим образом:

ТИПЫ

ИНТЕРФЕСЫ. ПРИМЕР

ТИПЫ

РЕАЛИЗАЦИЯ ИНТЕРФЕЙСОВ

ТИПЫ

РЕАЛИЗАЦИЯ ИНТЕРФЕЙСОВ

ТИПЫ

АВТОМАТИЗАЦИЯ

ТИПЫ

ТИПЫ

ТЕКСТ

BONUS

BONUS

ПОКА НА ЭТОМ ВСЕ. СПАСИБО ЗА ВНИМАНИЕ!

ВОПРОСЫ?

ТИПЫ