43
GOLANG РЕВЕРСИНГ

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

Embed Size (px)

Citation preview

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

GOLANGРЕВЕРСИНГ

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

MAINЧАСТЬ 1

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

НАЧАЛО

ПРИВЕТ

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

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

НАЧАЛО

ПРИВЕТ2

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

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

НАЧАЛО

КАК НАЙТИ MAIN?

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

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

НАЧАЛО

КАК НАЙТИ MAIN

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

ТЕКСТ

КАК НАЙТИ MAIN

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

ТЕКСТ

КАК НАЙТИ MAIN

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

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

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

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

ИДЕЯ

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

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

▸ Rizzo

▸ IDB2PAT

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

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

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

RIZZO

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

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

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

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

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

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

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

RIZZO

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

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

IDB2PAT

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

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

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

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

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

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

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

IDB2PAT

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

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

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

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

▸ .typelink

▸ .gopclntab

▸ .noptrdata

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

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

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

.GOPCLNTAB

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

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

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

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

FUNC_N STRUCTURE

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

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

FUNC_N STRUCTURE

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

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

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

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

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

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

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

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

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

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

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

ТИПЫЧАСТЬ 3

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

ТИПЫ

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

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

▸ Что такое unk_8560d40?

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

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

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

ТИПЫ

СТРУКТУРА _TYPE

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

▸ Go 1.2 Go 1.6 Go 1.7

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

ТИПЫ

СТРУКТУРА _TYPE

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

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

ТИПЫ

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

▸ String

▸ Slice

▸ Error

▸ iface

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

ТИПЫ

REFLECT

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

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

ТИПЫ

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

▸ WHAT?

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

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

ТИПЫ

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

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

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

ТИПЫ

UNK_8560D40

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

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

ТИПЫ

А ЕСЛИ ЕЩЕ?

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

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

ТИПЫ

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

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

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

ТИПЫ

ИНТЕРФЕЙСЫ

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

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

ТИПЫ

ИНТЕРФЕЙСЫ

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

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

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

ТИПЫ

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

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

ТИПЫ

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

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

ТИПЫ

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

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

ТИПЫ

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

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

ТИПЫ

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

ТИПЫ

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

ТЕКСТ

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

BONUS

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

BONUS

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

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

ВОПРОСЫ?

ТИПЫ