эксплойт в libc: где предоставить аргументы для вызова system ()? - PullRequest
3 голосов
/ 14 октября 2011

Я пытаюсь написать возврат к эксплойту libc, но не могу определить, где в стеке я должен разместить аргумент для моего system() вызова.

Уязвимой функцией является

void func(char *str)
{
     char buffer[12];
     strcpy(buffer,str);
}

Стек для этой функции будет выглядеть примерно так:

 -----------
 str
 -----------
 return address
 -----------
 previous frame pointer
 -----------
 buffer
 -----------

Я понимаю, что должен перезаписать адрес возврата адресом для вызова system(), но где я должен разместить адресза свои аргументы и почему?

Спасибо.

1 Ответ

0 голосов
/ 15 октября 2011

Указатель на аргумент должен быть найден непосредственно над адресом возврата. То есть после перезаписи ваш стек должен выглядеть примерно так:

-----------
shellcode: /bin/whatever ...
...
...
...
\0
-----------
&shellcode    <-- str is here
-----------
&system       <-- return address is here
-----------
previous frame pointer <--- don't corrupt this
-----------
padding       <-- buffer

Обратите внимание, что это означает, что вы должны знать, что такое %esp, когда достигнете strcpy (чтобы не повредить предыдущий указатель кадра). Кроме того, ни один из указателей не может содержать нулевой байт.

...