无法弄清楚这个段错误

时间:2013-05-24 18:49:43

标签: linux assembly dump

尝试在Linux中发出一个execve()系统调用来触摸名为“一切正常”的文件

这是堆栈:

0xffffd33c: 0x6e69622f  0x756f742f  0x45006863  0x79726576

0xffffd34c: 0x6e696874  0x73692067  0x004b4f20  0x00000000

0xffffd35c: 0xf7ff000a  0x00000001  0x080483a0  0x00000000

0xffffd36c: 0x080483c1  0x08048454  0x00000001  0xffffd394

那应该是little-endian命令“/ bin / touch \ 0Everything is 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

我无法弄清楚为什么我的指针(存储在ebx,ecx中)导致execve()参数的格式错误。它们指向相同的数据,但是它是一个以空字符结尾的字符串,后跟第二个以空字符结尾的字符串,后跟一个NULL指针,所以它应该被ebx作为第一个字符串处理为ECX的NULL指针终止数组。 / p>

感谢。

1 个答案:

答案 0 :(得分:2)

ecx的价值是错误的。您的代码似乎相当于

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

但它应该是:

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

看到区别? ecx应该包含指向参数的指针列表的地址,而不是指向第一个参数的指针。