Обновить
74.65

Assembler *

Язык программирования низкого уровня

Сначала показывать
Порог рейтинга
Уровень сложности

ELFийские трюки в Go

Время на прочтение6 мин
Охват и читатели12K


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


Предупреждение: ничему полезному эта мини-статья вас не научит.

Читать дальше →

GHIDRA vs. IDA Pro

Время на прочтение12 мин
Охват и читатели63K


Приветствую,


Думаю, пришла пора. Наболело/накипело/есть мнение. С выходом Гидры ситуация с инструментарием для реверс-инженеров достаточно сильно изменилась. Если раньше выбора чем пользоваться особо не было (здесь не будут упоминаться Binary Ninja, Hopper, JEB или Radare2, потому как в известных мне ИБ-компаниях и комьюнити ими пользуется очень малое количество человек, либо же порог вхождения в некоторые (привет, Радар) очень высок, либо же покрытие архитектур ограничено лишь x86/x64/ARM/ARM64/MIPS), то теперь мы имеем очень мощного конкурента Hex-Rays в лице АНБ с их GHIDRA.

Читать дальше →

Periwinkle: процессор с одной инструкцией

Время на прочтение3 мин
Охват и читатели9.1K
Хочу рассказать о процессоре, который я разработал в 2016 году. Он реализован на C как виртуальная машина. Мой друг Бьёрн написал для него ассемблер на F#.

Periwinkle представляет собой процессор OISC (one instruction set computer), в отличие от RISC и CISC. У него нет никакой конвейеризации. По сути, производительность не является главной задачей проекта, он создан скорее для удовольствия и в учебных целях.

Моя подруга Алёна придумала ему название Periwinkle, то есть барвинок (этот удивительно живучий цветок считается символом жизненной силы — прим. пер.)
Читать дальше →

Решение задания с pwnable.kr 26 — ascii_easy. Разбираемся с ROP-гаджетами с нуля раз и навсегда

Время на прочтение7 мин
Охват и читатели7K
image

В данной статье решим 26-е задание с сайта pwnable.kr и разберемся с тем, что же такое ROP, как это работает, почему это так опасно и составим ROP-цепочеку с дополнительными усложняющими файторами.

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

  • PWN;
  • криптография (Crypto);
  • cетевые технологии (Network);
  • реверс (Reverse Engineering);
  • стеганография (Stegano);
  • поиск и эксплуатация WEB-уязвимостей.

Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Читать дальше →

LeanChess — самые маленькие компьютерные шахматы в мире

Время на прочтение2 мин
Охват и читатели42K

Меня зовут Дмитрий Шехтман, и я автор самых маленьких компьютерных шахмат в мире.


Началось всё с того, что моя (ныне бывшая) девушка предложила написать компьютерные шахматы. Идея меня заинтересовала, и я решил этим заняться. Правда, почитав интернет, я понял, что опоздал лет на сорок. Особенно впечатляли шахматные разработки Оскара Толедо — на Си размером в 1257 байт, на JavaScript в 1023 байта и, наконец, Atomchess на ассемблере x86, компилирующийся в 392 байта.


Прежде, чем я вернулся к теме, прошло несколько месяцев. Как оказалось, за это время был установлен новый рекорд размера — ChesSkelet для ZX Spectrum занимал всего 352 байта. Правда, он не знал всех правил и играл весьма слабо, но всё же! А не замахнуться ли мне на шахматы на ассемблере? — подумал я.

Читать дальше →

Инкремент элементов вектора

Время на прочтение13 мин
Охват и читатели18K
В каком случае инкремент элементов вектора std::vector будет быстрее – если они имеют тип uint8_t или uint32_t?

Чтобы не рассуждать отвлечённо, рассмотрим две конкретные реализации:

void vector8_inc(std::vector<uint8_t>& v)
{
  for (size_t i = 0; i < v.size(); i++)
  {
    v[i]++;
  }
}

void vector32_inc(std::vector<uint32_t>& v)
{
  for (size_t i = 0; i < v.size(); i++)
  {
    v[i]++;
  }
}
Попробуем угадать

Безопасность в автоэлектронике — hello world на контроллере приборной панели

Время на прочтение4 мин
Охват и читатели14K
После экспериментов над CAN шиной в автомобиле появилось дикое желание копнуть несколько глубже, в самое святая святых. Думаю, всем известен такой термин, как «чип-тюнинг», в переводе на русский это простая прошивка блоков управления (двигатель, коробка передач и т.д.). Производитель оборудования изначально закладывает в свои устройства функционал для обновления либо смены ПО микроконтроллера, но его механизм никому не раскрывается по понятным причинам, и чтобы усложнить этот процесс, сама программа, с помощью которой происходит работа с энергонезависимой памятью не хранится в прошивке, а загружается в контроллер только в момент обслуживания. Эта статья о том, как заставить микроконтроллер приборной панели выполнять чужой код имея доступ к диагностическому разъему авто.

Реверсим MIPS и Golang — основы реверса. Решение задач на реверсинг с r0от-мi. Часть 2

Время на прочтение3 мин
Охват и читатели6K
image

В данной статье разберемся с декомпиляцией MIPS бинарника в Ghidra и пореверсим программу, написанную на golang, в IDA.

Часть 1 — C, C++ и DotNet decompile.

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

  • PWN;
  • криптография (Crypto);
  • cетевые технологии (Network);
  • реверс (Reverse Engineering);
  • стеганография (Stegano);
  • поиск и эксплуатация WEB-уязвимостей.

Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Читать дальше →

Описание архитектур процессоров в LLVM с помощью TableGen

Время на прочтение15 мин
Охват и читатели6.3K
На данный момент LLVM стала уже очень популярной системой, которую многие активно используют для создания различных компиляторов, анализаторов и т.п. Уже написано большое количество полезных материалов по данной тематике, в том числе и на русском языке, что не может не радовать. Однако в большинстве случаев основной уклон в статьях сделан на frontend и middleend LLVM. Конечно, при описании полной схемы работы LLVM генерация машинного кода не обходится стороной, но в основном данной темы касаются вскользь, особенно в публикациях на русском языке. А при этом у LLVM достаточно гибкий и интересный механизм описания архитектур процессоров. Поэтому данный материал будет посвящен несколько обделенной вниманием утилите TableGen, входящей в состав LLVM.

Причина, по которой компилятору необходимо иметь информацию об архитектуре каждой из целевых платформ вполне очевидна. Естественно, у каждой модели процессора свой набор регистров, свои машинные инструкции и т.д. И компилятору нужно иметь всю необходимую информацию о них, чтобы быть в состоянии генерировать валидный и эффективный машинный код. Компилятор решает различные платформенно-зависимые задачи: производит распределение регистров и т.д. К тому же в бэкендах LLVM также проводятся оптимизации уже на машинном IR, который больше приближен к реальным инструкциям, или же на самих ассемблерных командах. В подобных оптимизациях нужно заменять и преобразовывать инструкции, соответственно вся информация о них должна быть доступна.
Читать дальше →

Введение в эксплоитинг и реверсинг (уже не с нуля) с использованием IDA FREE и других бесплатных инструментов

Время на прочтение5 мин
Охват и читатели23K
Привет, Хабравчане.

Для тех кто не знает, совсем недавно Рикардо начал новый курс, который посвящен реверсингу и эксплоитингу. Это продолжение предыдущего оригинального авторского курса, который закончился на 67 главе. Я узнал про курс сразу, так как Рикардо подписал меня на свою рассылку КрэкЛатинос. После появления этой новости я сразу побежал искать папочку с английским переводом и очень обрадовался когда нашел его там. Над английским переводом постарался человек под ником Fare9, за что ему честь и хвала. Также я хочу передать привет и сказать спасибо Ильфаку Гильфанову за его прекрасный инструмент, которым пользуются в каждой стране. Перед ним я снимаю шляпу и делаю низкий поклон.
Читать дальше →

О том, как найти ошибку в микропроцессоре, выпущенном тридцать пять лет назад

Время на прочтение7 мин
Охват и читатели46K

К1801ВМ1А


В это трудно поверить, но иногда ошибки в процессорах по сути живут дольше, чем сами процессоры. Недавно мне довелось в этом убедиться на примере 16-разрядного микропроцессора 1801ВМ1А, на основе которого в свое время в СССР было создано семейство бытовых компьютеров БК-0010/11М. Об этом семействе на Хабре неоднократно писали.

Читать дальше →

Внутренности Go: оборачиваем переменные цикла в замыкании

Время на прочтение9 мин
Охват и читатели29K


Сегодня я решил перевести для вас небольшую статью о внутренностях реализации так называемых замыканий или closures. В дополнение вы узнаете о том, как Go пытается автоматически определить, нужно ли использовать указатель/ссылку или значение в разных случаях. Понимание этих вещей позволит избежать ошибок. Да и просто все эти внутренности чертовски интересны, как мне кажется!


А еще я хотел бы пригласить вас на Golang Conf 2019, которая пройдет 7 октября в Москве. Я член программного комитета конференции, и мы с коллегами выбрали много не менее хардкорных и очень, очень интересных докладов. То, что я люблю!


Под катом передаю слово автору.

Читать дальше →

Реверс-инжиниринг неизвестного процессора по единственной программе

Время на прочтение11 мин
Охват и читатели14K

TL;DR: мы выполнили обратную разработку программы, написанной для полностью неизвестной архитектуры ЦП без какой-либо документации на ЦП (без эмулятора, без ISA, без всего) всего за десять часов. Из статьи вы узнаете, как нам это удалось…

В прошлые выходные мы с командой CMU PPP поучаствовали Teaser CTF 2019 команды Dragon Sector, чтобы расслабиться и отойти от жёсткого дедлайна CHI 2020. Dragon Sector — это уважаемая польская команда, имеющая историю интересных CTF, поэтому мне было интересно, что у них есть в запасе.

Решив “ummmfpu”, — задачу, в которую входил реверс-инжиниринг байткода для сопроцессора с плавающей запятой Micromega uM-FPU, я решил поучаствовать в соревновании по решению задачи CPU Adventure, которая на тот момент не была решена ни одной из команд (в результате мы оказались единственными, кто справился с заданием).

Вот описание задачи CPU Adventure:

Мой дедушка в 60-х годах занимался разработкой компьютеров. Наводя порядок на его чердаке, я нашёл странную машину. Рядом с машиной лежала стопка перфокарт с пометкой “Dragon Adventure Game”. Спустя какое-то время мне удалось подключить её к современному оборудованию, но игра слишком сложная и я не могу добраться до конца без читерства. Сможете мне помочь? Прилагаю транскрипцию перфокарт, используемых в машине. Утверждается, что машина имеет 4 регистра общего назначения, 1 кибибайт памяти данных и 32 кибибайта памяти команд. Чтобы сыграть в игру, подключитесь к серверу следующим образом: socat tcp4-connect:cpuadventure.hackable.software:1234 fd:0,rawer Подсказка: процессор машины уникален, не пытайтесь гуглить информацию по нему.

game.bin
Читать дальше →

Ближайшие события

Решение задания с pwnable.kr 24 — simple login. Наложение стекового фрейма

Время на прочтение3 мин
Охват и читатели2.1K
image

В данной статье решим 24-е задание с сайта pwnable.krи узнаем про наложение стекового фрейма.

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

  • PWN;
  • криптография (Crypto);
  • cетевые технологии (Network);
  • реверс (Reverse Engineering);
  • стеганография (Stegano);
  • поиск и эксплуатация WEB-уязвимостей.

Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Читать дальше →

Разработка Unix подобной OS — Оболочка. Заключение (9)

Время на прочтение6 мин
Охват и читатели3.5K
Пришло время написать первую отдельную программу для нашего ядра — оболочку. Она будет храниться отдельным .elf файлом и запускаться init процессом при старте ядра.

Это последняя статья из цикла по разработке своей операционной системы.
Читать дальше →

Делись, рыбка, быстро и нацело

Время на прочтение4 мин
Охват и читатели15K
image

Деление — одна из самых дорогих операций в современных процессорах. За доказательством далеко ходить не нужно: Agner Fog[1] вещает, что на процессорах Intel / AMD мы легко можем получить Latency в 25-119 clock cycles, а reciprocal throughput — 25-120. В переводе на Русский — МЕДЛЕННО! Тем не менее, возможность избежать инструкции деления в вашем коде — есть. И в этой статье, я расскажу как это работает, в частности в современных компиляторах(они то, умеют так уже лет 20 как), а также, расскажу как полученное знание можно использовать для того чтобы сделать код лучше, быстрее, мощнее.
Читать дальше →

Разработка Unix подобной OS — Драйверы символьных устройств (8)

Время на прочтение9 мин
Охват и читатели3.3K
В предыдущей статье мы ввели многозадачность. Сегодня пришло время рассмотреть тему драйверов символьных устройств.

Конкретно сегодня мы напишем драйвер терминала, механизм отложенной обработки прерываний, рассмотрим тему обработчиков верхних и нижних половин прерываний.

Начнем с создания структуры устройства, затем введем базовую поддержку файлового ввода-вывода, рассмотрим структуру io_buf и функции для работы с файлами из stdio.h.
Читать дальше →

Разработка Unix подобной OS — Многозадачность и системные вызовы (7)

Время на прочтение8 мин
Охват и читатели2.6K
В предыдущей статье мы научились работать с виртуальным адресным пространством. Сегодня мы добавим поддержку многозадачности.
Читать дальше →

Архитектура и программирование Fairchild Channel F

Время на прочтение10 мин
Охват и читатели6.4K
«Channel F homebrew would be like programming sprites via hardware jumpers...»
/ chadtower, atariage forum /




Игровая приставка Fairchild Channel F, также известная как VES, появилась в ноябре 1976 года. В отличие от своих предшественников типа Ping-Pong, Tennis (в том же ряду — советский «Видеоспорт»), у неё было очень существенное отличие — наличие микропроцессора и картриджей с программами. До этого игры в приставках реализовывались на жёсткой логике — программа, в современном понимании, там отсутствовала.

Fairchild Channel F выпускалась вплоть до 1983 года. За это время было продано более четверти миллиона этих приставок и выпущено около 30-40 игр, некоторые из которых — уже в 2000-х годах.

Говоря о первенстве в плане использования микропроцессора стоит отметить, что RCA Studio II, о которой я рассказывал в прошлой статье, опоздала всего на пару месяцев, но оказалась существенно слабее Channel F, ввиду чего и провалилась по продажам. Впрочем, появление, менее чем через год, Atari VCS — вытеснило с рынка и Channel F.

Развития Fairchild_Channel_F, как такового, не было. В System II и нескольких клонах, типа Saba Videoplay 2 (1979), отличия состояли преимущественно в корпусе, джойстиках (кстати, все они понимали кроме обычных положений ещё и поворот ручки) и количестве микросхем. Архитектурно всё было практически идентично.

Что же собой представляет Channel F?

Профилирование со сверхсветовой скоростью: теория и практика. Часть 1

Время на прочтение13 мин
Охват и читатели13K
Привет! Из заголовка вы уже поняли, о чём я собираюсь рассказать. Тут будет много хардкора:
мы обсудим Java, С, С++, ассемблер, немного Linux, немного ядра операционной системы. А ещё разберём практический кейс, поэтому статья будет в трёх больших частях (достаточно объёмных).



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