SROP - Sigreturn-Oriented Programming
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Basic Information
Sigreturn
- це спеціальний syscall, який в основному використовується для очищення після завершення виконання обробника сигналів. Сигнали - це переривання, які надсилаються програмі операційною системою, часто для вказівки на те, що сталася якась виняткова ситуація. Коли програма отримує сигнал, вона тимчасово призупиняє свою поточну роботу, щоб обробити сигнал за допомогою обробника сигналів, спеціальної функції, призначеної для роботи з сигналами.
Після завершення обробника сигналів програма повинна відновити свій попередній стан, ніби нічого не сталося. Тут і вступає в гру sigreturn
. Він допомагає програмі повернутися з обробника сигналів і відновлює стан програми, очищаючи стековий фрейм (сектор пам'яті, що зберігає виклики функцій і локальні змінні), який використовувався обробником сигналів.
Цікава частина полягає в тому, як sigreturn
відновлює стан програми: він робить це, зберігаючи всі значення регістрів ЦП на стеку. Коли сигнал більше не заблокований, sigreturn
витягує ці значення зі стеку, ефективно скидаючи регістри ЦП до їх стану до обробки сигналу. Це включає регістр вказівника стеку (RSP), який вказує на поточну верхню частину стеку.
Виклик syscall sigreturn
з ROP-ланцюга та додавання значень регістрів, які ми хочемо завантажити в стек, дозволяє контролювати всі значення регістрів і, отже, викликати, наприклад, syscall execve
з /bin/sh
.
Зверніть увагу, що це буде типом Ret2syscall, який значно спрощує контроль параметрів для виклику інших Ret2syscalls:
Ret2syscallЯкщо вам цікаво, це структура sigcontext, що зберігається в стеку для подальшого відновлення значень (діаграма з тут):
Для кращого пояснення також перегляньте:
Приклад
Ви можете знайти приклад тут, де виклик signeturn конструюється через ROP (вставляючи в rxa значення 0xf
), хоча це фінальний експлойт звідти:
Перевірте також експлойт звідси, де бінар вже викликав sigreturn
, тому немає необхідності будувати це з ROP:
Інші приклади та посилання
Бінарний код на асемблері, який дозволяє записувати в стек і потім викликає
sigreturn
системний виклик. Можливо записати в стек ret2syscall через структуру sigreturn і прочитати прапорець, який знаходиться в пам'яті бінарного файлу.Бінарний код на асемблері, який дозволяє записувати в стек і потім викликає
sigreturn
системний виклик. Можливо записати в стек ret2syscall через структуру sigreturn (бінарний файл містить рядок/bin/sh
).64 біти, без relro, без canary, nx, без pie. Простий переповнення буфера, що зловживає функцією
gets
з нестачею гаджетів, які виконують ret2syscall. LOP-ланцюг записує/bin/sh
в.bss
, викликаючиgets
знову, зловживає функцієюalarm
, щоб встановити eax на0xf
, щоб викликати SROP і виконати оболонку.64 біти, програма на асемблері, без relro, без canary, nx, без pie. Потік дозволяє записувати в стек, контролювати кілька регістрів і викликати системний виклик, а потім викликає
exit
. Вибраний системний виклик - цеsigreturn
, який встановить регістри і переміститьeip
, щоб викликати попередню інструкцію системного виклику і виконатиmemprotect
, щоб встановити простір бінарного файлу наrwx
і встановити ESP в бінарному просторі. Далі програма знову викличеread
в ESP, але в цьому випадку ESP вказуватиме на наступну інструкцію, тому передача shellcode запише його як наступну інструкцію і виконає.SROP використовується для надання привілеїв виконання (memprotect) місцю, де був розміщений shellcode.
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Last updated