Найти адрес буфера для создания шелл-кода

В своей программе я пытаюсь изменить 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 и определение адреса буфера во время выполнения, однако, если мне нужно программно получить адрес шелл-кода, можно ли это сделать.


person RootPhoenix    schedule 13.11.2015    source источник
comment
Я не думаю, что вы можете просто привести строку к такому указателю.   -  person swiley    schedule 13.11.2015
comment
@swiley строка в C - это просто массив символов.   -  person tangrs    schedule 14.11.2015


Ответы (1)


Прямого пути нет. Вам нужно использовать целевые приемы. Они включают:

  • В относительно статических программах без рандомизации адресного пространства (или если модуль был скомпилирован без перемещений и, следовательно, не может быть перемещен), вы можете угадывать статически (пример: https://reverseengineering.stackexchange.com/questions)./8504/problem-finding-return-address-for-shellcode).
  • переборите все возможные значения, рассчитывая на то, что рано или поздно вы попадете (промахи будут простыми DoSe или могут быть такими же незначительными, как ошибки в журнале сервера, если он, например, перезапустит неисправную часть)
  • повреждать другие объекты в коде вместо/в дополнение к обратному адресу, чтобы они служили вашей цели (примеры: https://en.wikipedia.org/wiki/Return-to-libc_attack, повреждено esp)
  • используйте дополнительную разведывательную атаку, которая заставляет сервер отправить вам подсказку
person ivan_pozdeev    schedule 14.11.2015