C ASM[打开/读取/写入]外壳代码分段故障

C ASM[打开/读取/写入]外壳代码分段故障,c,assembly,segmentation-fault,shellcode,C,Assembly,Segmentation Fault,Shellcode,我正在尝试编写一个简单的外壳代码来读取文件的内容 这是我的集会: xor eax, eax xor ecx, ecx xor edx, edx push 0x73 ; /home/users/level05/.pass push 0x7361702e ; push 0x2f35306c push 0x6576656c push 0x2f737265 push 0x73752f65 push 0x6d6f682f

我正在尝试编写一个简单的外壳代码来读取文件的内容

这是我的集会:

xor eax, eax
    xor ecx, ecx
    xor edx, edx

    push 0x73 ; /home/users/level05/.pass
    push 0x7361702e ;
    push 0x2f35306c
    push 0x6576656c 
    push 0x2f737265
    push 0x73752f65
    push 0x6d6f682f 
    mov ebx, esp
    mov al, 0x05
    int 0x80 ; open

    mov ebx, eax
    xor eax, eax
    xor edx, edx
    mov dl, 0x10
    mov ecx, esp
    mov al, 0x03
    int 0x80 ; read

    mov ecx, eax
    xor ebx, ebx
    mov bl, 0x01
    mov al, 0x04 
    int 0x80 ; write
`

所以,如果我把它转换成外壳代码,并简单地运行它,我就有一个分段错误

我验证了我的代码,看起来不错。要读取的文件也存在,我对其拥有权限

我将其编译为在x86Linux上运行

我正在使用以下命令编译程序:

#include<stdio.h>
#include<string.h>

unsigned char code[] = \
"MYSHELLCODE";

main()
{

  printf("Shellcode Length:  %d\n", strlen(code));

    int (*ret)() = (int(*)())code;

    ret();

}
#包括
#包括
无符号字符代码[]=\
“MYSHELLCODE”;
main()
{
printf(“外壳代码长度:%d\n”,strlen(代码));
int(*ret)(=(int(*)()代码;
ret();
}
然后我运行:
gcc-shell.c-oshell-fno-stack-protector-z execstack-m32

(代码:<代码:<代码><代码>\x0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\xdb\xb3\x01\xb0\x04\xcd\x80

68字节
`

您的shell代码似乎没有返回值。此外,它不遵循C调用约定,这可能会或可能不会导致崩溃。崩溃本身应该只发生在您的代码之后,但是,您忘记了说明是不是这样。PS:学习使用调试器。向我们展示程序集的完整代码,无法判断它是否已实际组装并与实际的C代码链接。不确定您正在尝试如何编写。您是否试图将字符串写入标准输出?如果是这种情况,则read返回EAX中读取的字符数,而不将缓冲区设置为write。也许你打算把ESP移到ECX?