В своей программе я пытаюсь изменить EIP, чтобы он указывал на базовый адрес буфера, который содержит код оболочки.
пример: 0xbffff5f3 — это адрес в стеке, который указывает наcode[80] = "\x90\x90\x90\x90\x90\x31\xc0\x31\xdb\x31\xc9\"
Я создаю указатель ret
и, используя знание кадра стека, указываю его на базовый адрес буфера.
{
//Some more pointer arithmetic on ret
(*ret) = (int)code;
return ;
}
EIP изменен на
eip 0xbffff5f3 0xbffff5f3
Это прекрасно работает, и мой шелл-код выполняется. Но ret
жестко закодировано с адресом буфера.
Однако теперь я хотел бы, чтобы мой шелл-код содержал заранее известный базовый адрес буфера, чтобы EIP указывал на него после переполнения буфера.
Как я могу узнать базовый адрес буфера заранее?
[![Сам буфер содержит адрес шеллкода][1][1]
Редактировать: уточнение моего вопроса: Учитывая статически объявленный код массива[80], как я могу заранее определить базовый адрес этого массива в стеке, чтобы я мог вставить этот базовый адрес в свой код оболочки и вставьте соответствующие байты заполнения и NOPS, чтобы EIP указывал на код оболочки?
Я видел много примеров в Интернете, и все они демонстрируют использование GDB и определение адреса буфера во время выполнения, однако, если мне нужно программно получить адрес шелл-кода, можно ли это сделать.