House of Force
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Цю техніку було виправлено (тут) і вона викликає цю помилку: malloc(): corrupted top size
Ви можете спробувати код звідси, щоб протестувати його, якщо хочете.
Мета цієї атаки полягає в тому, щоб мати можливість виділити шматок пам'яті за певною адресою.
Переповнення, яке дозволяє перезаписати розмір заголовка верхнього шматка (наприклад, -1).
Можливість контролювати розмір виділення пам'яті
Якщо зловмисник хоче виділити шматок пам'яті за адресою P, щоб перезаписати значення тут. Він починає з перезапису розміру верхнього шматка на -1
(можливо, з переповненням). Це забезпечує, що malloc не буде використовувати mmap для будь-якого виділення, оскільки верхній шматок завжди матиме достатньо місця.
Потім обчисліть відстань між адресою верхнього шматка та цільовим простором для виділення. Це тому, що malloc з таким розміром буде виконано для переміщення верхнього шматка на цю позицію. Ось як різницю/розмір можна легко обчислити:
Тому, виділення розміру target - 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 стало можливим знову перезаписати GOT atoi
на адресу 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. Потім запишіть у hook адресу system
, запишіть у блок "/bin/sh"
і нарешті звільніть блок з вмістом цього рядка.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)