House of Force
Базова інформація
Код
Цю техніку виправлено (тут) і вона викликає помилку:
malloc(): corrupted top size
Ви можете спробувати код звідси, щоб протестувати його, якщо хочете.
Мета
Метою цього нападу є можливість виділити фрагмент пам'яті за конкретною адресою.
Вимоги
Переповнення, яке дозволяє перезаписати розмір заголовка верхнього фрагмента (наприклад, -1).
Можливість контролювати розмір виділення купи.
Напад
Якщо зловмисник хоче виділити фрагмент пам'яті за адресою P, щоб перезаписати значення тут. Він починає з перезапису розміру верхнього фрагмента значенням -1
(можливо, з переповненням). Це гарантує, що malloc не буде використовувати mmap для будь-якого виділення, оскільки верхній фрагмент завжди матиме достатньо місця.
Потім розраховується відстань між адресою верхнього фрагмента та цільовим простором для виділення. Це тому, що malloc з таким розміром буде виконано для переміщення верхнього фрагмента на цю позицію. Ось як можна легко розрахувати різницю/розмір:
Отже, виділення розміру ціль - old_top - 4*sizeof(long)
(4 long через метадані верхнього фрагмента та нового фрагмента при виділенні) перемістить верхній фрагмент на адресу, яку ми хочемо перезаписати.
Потім знову виконайте malloc, щоб отримати фрагмент за цільовою адресою.
Посилання та Інші Приклади
Мета цього сценарію - ret2win, де потрібно змінити адресу функції, яка буде викликана адресою функції ret2win
У бінарному файлі є переповнення, яке можна використовувати для зміни розміру верхнього фрагмента, який змінено на -1 або p64(0xffffffffffffffff)
Потім обчислюється адреса місця, де існує вказівник для перезапису, і різниця від поточного положення верхнього фрагмента до туди виділяється за допомогою
malloc
Нарешті, виділяється новий фрагмент, який буде містити цю бажану ціль всередині, яка перезаписується функцією ret2win
У
Input your name:
є початкова вразливість, яка дозволяє витік адреси з купиПотім у функціоналі
Org:
таHost:
можна заповнити 64B вказівникаs
, коли запитують назву організації, яка на стеку слідує за адресою v2, яка потім слідує вказаною назвою хоста. Оскільки потім strcpy буде копіювати вміст s до фрагмента розміром 64B, можливо перезаписати розмір верхнього фрагмента даними, введеними в назву хоста.Тепер, коли можливий довільний запис, GOT
atoi
було перезаписано на адресу printf. тоді можливо витікати адресуIO_2_1_stderr
з%24$p
. Із цим витоком libc було можливо знову перезаписати GOTatoi
на адресуsystem
і викликати його, передаючи як параметр/bin/sh
Альтернативний метод запропонований у цьому іншому описі, полягає в перезаписі
free
наputs
, а потім додаванні адресиatoi@got
, в вказівник, який потім буде звільнений, щоб витікав і з цим витоком знову перезаписатиatoi@got
наsystem
і викликати його з/bin/sh
.Є UAF, що дозволяє повторно використовувати фрагмент, який був звільнений без очищення вказівника. Оскільки є деякі методи читання, можливо витікати адресу libc, записуючи вказівник на функцію free в GOT тут, а потім викликаючи функцію читання.
Потім було використано House of force (з використанням UAF) для перезапису розміру лівого простору на -1, виділення достатньо великого фрагмента для досягнення free hook, а потім виділення іншого фрагмента, який буде містити free hook. Потім записати в гачок адресу
system
, записати в фрагмент"/bin/sh"
і, нарешті, звільнити фрагмент з цим вмістом рядка.
Last updated