Я изучаю методы шеллкода переполнения буфера в Linux. https://seedsecuritylabs.org/Labs_16.04/Software/Buffer_Overflow/
Шеллкод, который я использовал, заканчивается на movb $0x0b, %a1 и затем на int $0x80. Шелл-код выполняется, и я получаю командную строку. Я читал много мест, где execve и int 0x80 «не возвращаются». Хорошо.. хорошо, но куда ~ идет ~ поток выполнения программы, когда процесс execve завершается успешно и завершается (иначе я ввожу «выход» в командной строке)?
Я думал, что вызывающая программа заменяет свой кадр стека информацией о новом коде execve. Сохраняет ли новый исполняемый код адрес возврата перезаписанного процесса и возвращает ли он этот адрес, как если бы он был его собственным? (Значит, это своего рода возврат .. на заимствованный адрес?) Что касается int $0x80, разве выполнение не продолжается со следующего байта после инструкции int 0x80? Если нет, то какой следующий байт?
В контексте проблемы переполнения буфера и int 0x80, скажем (например), 517-байтовый хак перезаписывает 24-байтовый буфер. Байты заменят значения в адресах памяти стека за пределами буфера, включая адрес возврата, указывающий на его собственный исполняемый код выше в стеке. Но преднамеренный код топчет сотни других байтов стека выше в памяти, уничтожая кадры стека несвязанных процессов внешней области. Что происходит с этими уничтоженными кадрами стека, когда...
1) когда оболочка возвращается из int 0x80 и выполняет больше данных стека, что не является частью хака. Теперь есть неуказанные байты, которые, вероятно, являются недопустимыми кодами операций ЦП.
2) контекст фреймов внешнего стека был уничтожен, так как же система продолжает работу после того, как я ввожу «выход» в командной строке оболочки?
Любая помощь приветствуется!