When program invoked stack has following layout:
argc <- stack pointer
argv[0]
argv[1]
...
argv[argc-1]
0
envp[0]
envp[1]
...
envp[n]
0
auxv[0]
auxv[1]
...
auxv[n], with auxv[n].a_type = AT_NULL
argv0 - NULL-terminated string, pointed by argv[0]
argv1 - NULL-terminated string, pointed by argv[1]
...
argv-last - NULL-terminated string, pointed by argv[argc-1]
env0 - NULL-terminated string, pointed by envp[0]
env1 - NULL-terminated string, pointed by envp[1]
...
envn - NULL-terminated string, pointed by envp[n]
argv0 - once more time - filename of the program, NULL-terminated.
0 - final dword of 0 <- address 0xBFFFFFFF
(решено)Случайный фактор при формировании стека процесса (просто засада какая-то)
Модератор: Модераторы разделов
- Женя Подсыпальников
- Сообщения: 482
Re: (решено)Случайный фактор при формировании стека процесса
А тута - почему-та, гутарят за некий "финальный" адрес во стэке...
Пойдём на рыбалку !
Re: (решено)Случайный фактор при формировании стека процесса
Женя Подсыпальников писал(а): ↑23.06.2009 10:39А тута - почему-та, гутарят за некий "финальный" адрес во стэке...
Все правильно гутарят.
Вот что я нашёл:
http://www.gelato.unsw.edu.au/IA64wiki/AuxiliaryVector
http://manugarg.googlepages.com/aboutelfauxiliaryvectors
http://www.phrack.org/issues.html?issue=58&id=5#article
http://sources.redhat.com/ml/libc-alpha/20...6/msg00108.html
Но причины откуда берется случайная длина, пока не добрился
Кстати, следующая версия
Код:
#include <stdio.h>
#include <elf.h>
main(int argc, char* argv[], char* envp[]){
Elf32_auxv_t *auxv;
while(*envp++ != NULL); /*from stack diagram above: *envp = NULL marks end of envp*/
for (auxv = (Elf32_auxv_t *)envp; auxv->a_type != AT_NULL; auxv++)
/* auxv->a_type = AT_NULL marks the end of auxv */
{
printf("addr: %x type: %x is: 0x%x\n", (int)auxv, auxv->a_type, auxv->a_un.a_val);
}
printf("\n (int)argv[0] - addr = %x - %x = %x\n",(int)argv[], (int)auxv, (int)argv[0] - (int)auxv);
}
Registerd Linux user #486684 at http://counter.li.org/
Re: (решено)Случайный фактор при формировании стека процесса
Полез, все-таки в код, нашёл какой-то рандомизатор( может и не тот )
Но глубже копать лень.
./linux/fs/binfmt_elf.c:
542 static unsigned long randomize_stack_top(unsigned long stack_top)
Действительно, наверное, эта шутка для защиты предназанчена, от чего, я так и не понял.
Вобщем, спасибо всем за внимание и посты.
Но глубже копать лень.
./linux/fs/binfmt_elf.c:
542 static unsigned long randomize_stack_top(unsigned long stack_top)
Действительно, наверное, эта шутка для защиты предназанчена, от чего, я так и не понял.
Вобщем, спасибо всем за внимание и посты.
Registerd Linux user #486684 at http://counter.li.org/
- aLexx programmer
- Сообщения: 985
- Статус: Турук-Макто
- ОС: Gentoo -> Ubuntu
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: (решено)Случайный фактор при формировании стека процесса
откуда табличка?
откуда вам знать, что у меня?
может через 5 лет short станет 32х битным?
- Женя Подсыпальников
- Сообщения: 482
Re: (решено)Случайный фактор при формировании стека процесса
А туты -
студент гутарит за gcc 3.x , защищённый супротив "эксплойтинга", мол, компилятор...
Дак он даже на местный в некоторой функции буфер - по разному даёт, оказывается...
Пойдём на рыбалку !
Re: (решено)Случайный фактор при формировании стека процесса
Да проверить можно
А я и не знаю, поэтому уточнил, что это верно для gcc. (И M$ компилера вроде тоже)
не станет, в стандарте оговорено:
sizeof(short)<=sizeof(int)<=sizeof(long)<=sizeof(long long)
А от 16 битного типа не станут отказываться
Re: (решено)Случайный фактор при формировании стека процесса
Женя Подсыпальников писал(а): ↑24.06.2009 09:44
А туты -
студент гутарит за gcc 3.x , защищённый супротив "эксплойтинга", мол, компилятор...
Дак он даже на местный в некоторой функции буфер - по разному даёт, оказывается...
спасибо, конечно, но я по немецки не очень
комплятор всякие stackguard пользует, но они вроде бы фиксированного размера и могут применяться к любой функции, а не только к main.
но суть не в этом -
ларчик просто открывался:
sysctl -w kernel.randomize_va_space=0
принуждает ядро не добавлять элемент случайной длины в стек нового процесса
Тему можно закрывать.
Registerd Linux user #486684 at http://counter.li.org/
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: (решено)Случайный фактор при формировании стека процесса
всё верно, но я всё-таки не стану на эту табличку полагаться...
ну для сегодняшнего может и верно, и то, для i86, а в общем случае может быть и не всегда...
спасибо. об этом и не знал