2013-05-24 3 views
0

Попытка выдать execve() системный вызов в Linux потрогать файл под названием «Все в порядке»не могу понять этот Segfault

Вот стек:

0xffffd33c: 0x6e69622f 0x756f742f 0x45006863 0x79726576 

0xffffd34c: 0x6e696874 0x73692067 0x004b4f20 0x00000000 

0xffffd35c: 0xf7ff000a 0x00000001 0x080483a0 0x00000000 

0xffffd36c: 0x080483c1 0x08048454 0x00000001 0xffffd394 

Это должно быть мало- endian order "/ bin/touch \ 0Everything OK \ 0", за которым следует байт NULL, который, по-видимому, является.

Вот регистры:

eax   0xfffffff2  -14 
ecx   0xffffd33c  -11460 
edx   0x0 0 
ebx   0xffffd33c  -11460 
esp   0xffffd33c  0xffffd33c 

EAX был 11 (для execve() Linux) до системного вызова в Int 0x80 вызвал ошибку, которая изменила значение EAX до -14

могу» t выяснить, почему мои указатели (хранятся в ebx, ecx) вызывают ошибку формата с аргументами execve(). Они указывают на одни и те же данные, но это строка с нулевым завершением, за которой следует вторая строка с нулевым завершением, за которой следует указатель NULL, поэтому ее следует рассматривать как только первую строку с помощью ebx an как NULL-указатель с завершенным массивом с помощью ECX.

Спасибо.

ответ

2

Ваше значение для ecx неверно. что ваш код, кажется, делает это эквивалент

char *arg[] = {"/bin/touch", "Everything is OK", 0}; 
execve(arg[0], arg[0], 0); 

Но это должно быть:

execve(arg[0], arg, 0); 

разницу? ecx должен содержать адрес списка указателей на аргументы, а не указатель на первый аргумент.

+0

ах большое спасибо – gal

Смежные вопросы