Лично мне было не сложно 😅
Взял свежий таск с HackerLab, средне-сложный, решило всего 13 человек (наверное человек), ну теперь уже 14
Ghidra не понадобилась, даже Linux (отдельный) не понадобился, ai сам подключил pwntools и gdb в WSL
Морали не будет, но грустно 😅
🛠 Разбор от самого агента:
Корневая причина прошлой неудачи (подтверждена эмпирически)
Два чанка 0x500, освобождённые в unsorted bin, переиспользуются последующими malloc(0x400) через split. Поэтому раскладка слотов (A = адрес чанка slot0, он же fd, который отдаёт view(2)):
| слот | адрес | прошлая сессия |
|------|-------|----------------|
| slot4 (fake FILE) | A + 0x550 | A + 0xA90 ❌ |
| slot5 | A + 0x10 | — |
| slot6 | A + 0xA90 | — |
A+0xA90 — это slot6, заполненный 'C'*0x100, отсюда и наблюдавшееся «`'C'*8`».
Проверено `probe_layout.py`: чтение `apples[]` прямо из памяти процесса через
`/proc/<pid>/mem` (PIE base из `/proc/<pid>/maps`, смещение `apples=0x4080`), а не расчётом по макету кучи
Второе препятствие glibc 2.43: мангация cookie-колбэков
`_IO_cookie_read/write/seek/close` в 2.43 делают PTR_DEMANGLE:
`ror rax,0x11; xor rax, fs:0x30`. Значит cookie-путь требует pointer-guard и не
годится. Раскладка `_IO_cookie_file` (на будущее): vtable 0xd8, `__cookie` 0xe0,
read 0xe8, write 0xf0, seek 0xf8, close 0x100
Рабочий путь: House of Apple 2
`_IO_wdoallocbuf` (libc+0x92080) вызывает
`[[fp->_wide_data + 0xe0] + 0x68](fp)` — без мангации и без валидации vtable,
аргумент = fp. Достаточно:
- fp (0x400-чанк slot4 = A+0x550): `_flags = " /bin/sh\0"`, write_ptr>write_base,
`_mode=0`, `_wide_data` → внутренняя область, `vtable = _IO_wfile_jumps`
(libc+0x211228, реальный vtable → проходит проверку);
- fake `_IO_wide_data`: write_ptr=0, buf_base=0, `_wide_vtable` → внутренняя область;
- fake wide-vtable: `+0x68 = system` (libc+0x5c560).
Триггер — `exit` (меню «5») → `_IO_cleanup` → `_IO_flush_all_lockp(0)` →
`_IO_wfile_overflow` → `_IO_wdoallocbuf` → `system(" /bin/sh")`.
Запись `_IO_list_all` — через tcache poisoning (safe-linking, `next = (fp>>12)^_IO_list_all`)
Офсеты (libc 2.43-2ubuntu2 = libc.so.6 из задания)
main_arena+0x60 (unsorted fd) = 0x212ac8
_IO_list_all = 0x213480
_IO_file_jumps = 0x211030
_IO_wfile_jumps = 0x211228 <- используем
system (__libc_system) = 0x5c560
"/bin/sh" = 0x1db799
chall: apples = .bss 0x4080, PIE, Full RELRO
Эффект
- локально: `PWNED_exited3n` (fake flag `C0DEBY{FAKE_FLAG}`);
- удалённо: `PWNED_ctf` + `CODEBY{y............gl1bc}`
Артефакты
- `solve.py` — финальный эксплойт (`local`/`remote`).
- `probe_layout.py` — эмпирическая проверка адресов слотов.
- `vtabs.py`, `cookie_jumps.py`, `cookie_region.py`, `find_cookie.py`,
`wfile.py`, `wdoalloc.py` — разбор таблиц vtable и cookie/wide-путей
#reverse #pwn
✈️ Telegram 🔗 whlab.ru 💬 MAX



