SROP - Sigreturn-Oriented Programming
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)
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)