LINUX.ORG.RU

Объясните нубу про срыв стека

 , ,


1

1

Каким образом выход за его границы позволяет повысить привилегии?

Я вот сам делал выход за границы, получал значения каких-то левых ячеек, но как через это можно получить права рута, я не понимаю.

Для этого нужно, чтобы эксплуатируемая программа была запущена под root. Если вкратце - делаешь так, чтобы программа написала по какому-то адресу нужный машинный код, который, к примеру, делает exec("/bin/sh", "-c", "evil command"). А потом делаешь так, чтобы программа при выходе из функции перешла на этот код. Когда программа выходит из функции, она берёт адрес возврата из стека. Если тебе удалось перезаписать это значение в стеке, то программа при выходе из функции перейдёт куда ты ей указал.

Это всё так, на пальцах, на практике там нюансов больше. Тема обширная.

vbr ★★★
()
Ответ на: комментарий от alex1101

не дают перезаписывать адрес возврата

В новых процессорах иначе сделано: адреса возврата записываются во вторую копию стека. Если ret обнаруживает несовпадение адресов возврата в стеке потока и теневом стеке, то процессор выбрасывает эксепшн.

i586 ★★★★★
()
Ответ на: комментарий от alex1101

Вариантов много. Самое простое, про которое я знаю - компилятор генерирует код, который при вызове функции сразу после адреса возврата добавляет некое случайное значение (канарейку). А перед возвратом из функции проверяет это значение. Если значение изменилось, значит кто-то проехался по стеку и программа аварийно завершается.

Конечно это несколько замедляет программу.

Если ассемблер можешь читать, просто изучи выхлоп:

https://godbolt.org/

Программа:

// Type your code here, or load an example.
int square(int num) {
    int x[num];
    return num * num;
}

Опция -fstack-protector

square(int):
        push    rbp
        mov     rbp, rsp
        sub     rsp, 48
        mov     DWORD PTR [rbp-36], edi
        mov     rax, QWORD PTR fs:40
        mov     QWORD PTR [rbp-8], rax
        xor     eax, eax
        mov     rax, rsp
        mov     rcx, rax
        mov     eax, DWORD PTR [rbp-36]
        movsx   rdx, eax
        sub     rdx, 1
        mov     QWORD PTR [rbp-24], rdx
        cdqe
        lea     rdx, [0+rax*4]
        mov     eax, 16
        sub     rax, 1
        add     rax, rdx
        mov     esi, 16
        mov     edx, 0
        div     rsi
        imul    rax, rax, 16
        sub     rsp, rax
        mov     rax, rsp
        add     rax, 3
        shr     rax, 2
        sal     rax, 2
        mov     QWORD PTR [rbp-16], rax
        mov     eax, DWORD PTR [rbp-36]
        imul    eax, eax
        mov     rsp, rcx
        mov     rdx, QWORD PTR [rbp-8]
        sub     rdx, QWORD PTR fs:40
        je      .L3
        call    __stack_chk_fail
.L3:
        leave
        ret

Вот это fs:40 это и есть канарейка.

vbr ★★★
()
Последнее исправление: vbr (всего исправлений: 2)

Помнится мне в начале нулевых на срыве стека в embedded-мобилках было сделана огромная куча эксплоитов. К примеру, взлом RSA. Точнее как, вот инженеры создали телефон и защитили его прошивку ключём 1024-bit RSA взломать который тогда было невозможно да и сейчас очень сложно. А хакеры нашли возможность сорвать стек в одной из официальных программ и обходить этим RSA-защиту.

Я вот сам делал выход за границы, получал значения каких-то левых ячеек, но как через это можно получить права рута, я не понимаю.

Суть в том, что ты в эти заграницы можешь начать что-то писать, либо же искать в них что-то интересное. А когда нашёл или записал, можешь подготовить эксплоит таким образом, что он будет выполнять твой скомпилированный код.

Далее, если это конкретно про UNIX-системы и получение root-прав в них. Если у тебя, к примеру, на целевой атакуемой машине старая версия ядра и имеется список возможных эксплоитов для получения рута в нём – ты просто используешь эти трюки оттуда и добавляешь к своему эксплоиту через уязвимость (срыв стека) в программе, в которой ты это нашёл.

К примеру, если бы срыв стека был бы в адресной строке браузера и он не был изманан песочницей, то я мы мог опубликовать какую-нибудь хитрую ссылку, перейдя по которой у тебя бы выполнилось условное rm -Rf / из-под рута.

Срыв стека считай можно заменить простым запуском собственного кода. Как в том известном эпичном обосрамсе KDE-разработчиков: Незакрытая уязвимость в KDE там вместо срыва стека тупо можно подготовить архив, при открытии которого выполнится кастомный код, в котором может быть всё что угодно.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)

Срыв стека - это как срыв крыши у человека, плюс опьянение в зюзю. А когда люди пьяные в зюзю, они иногда такое себе могут позволить… С привилегиям уровня Бог.

seiken ★★★★★
()