尝试在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>
感谢。
答案 0 :(得分:2)
ecx
的价值是错误的。您的代码似乎相当于
char *arg[] = {"/bin/touch", "Everything is OK", 0};
execve(arg[0], arg[0], 0);
但它应该是:
execve(arg[0], arg, 0);
看到区别? ecx
应该包含指向参数的指针列表的地址,而不是指向第一个参数的指针。