exe C 时出现段错误
Segmentation fault error when exe C
因此,在我编译并执行我的程序后,我收到以下错误消息:"Segmentation fault",而 strace 错误消息为:
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++
Segmentation fault
问题是,有什么办法可以修复此错误并在 shell 代码中显示消息吗?
汇编代码:
;r3v.asm
;r3v3rs3c - 3x_z3r0
[SECTION .text]
global _start
_start:
jmp short ender
starter:
xor eax, eax
xor ebx, ebx
xor edx, edx
xor ecx, ecx
mov al, 4
mov bl, 1
pop ecx
mov dl, 18
int 0x80
xor ebx, ebx
int 0x80
ender:
call starter
db 'r3v3rs3c'
Assemble 它与:nasm -f elf r3v.asm
Link 它与:ld -o r3v r3v.o
转储它:objdump -d r3v
将 shell 代码提取到测试程序中:
/*shelltest.c
r3v3s3c - 3x_z3r0*/
char code[] =
"\xeb\x15\x31\xc0\x31\xdb\x31\xd2\x31\xc9\xb0\x04\xb3\x01\x59\xb2\x12\xcd\x80\xdb\xcd\x80\xe8\xe6\xff\xff\xff\x72\x33\x76\x33\x72\x73\x33\x63";
;
int main(int argc, char **argv)
{
int (*exeshell)();
exeshell = (int (*)()) code;
(int)(*exeshell)();
}
然后我编译:gcc shelltest.c -o shelltest
执行它:./shelltest
输出为 "Segmentation fault".
当前,当您将数组声明为可变(非常量)时,您的字符串代码将被放置在声明为不可执行的程序内存的一部分中。当您尝试 运行 它作为一个函数时,您的 OS 会看到您正在尝试 运行 无法执行的内存区域中的代码,并且会因段错误而终止您的程序。
要解决此问题,请将 code
的声明更改为 const char
即
const char code[] = "\xeb......."
这将允许编译器将其放入可执行内存,从而使其成为运行。
因此,在我编译并执行我的程序后,我收到以下错误消息:"Segmentation fault",而 strace 错误消息为:
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++
Segmentation fault
问题是,有什么办法可以修复此错误并在 shell 代码中显示消息吗?
汇编代码:
;r3v.asm
;r3v3rs3c - 3x_z3r0
[SECTION .text]
global _start
_start:
jmp short ender
starter:
xor eax, eax
xor ebx, ebx
xor edx, edx
xor ecx, ecx
mov al, 4
mov bl, 1
pop ecx
mov dl, 18
int 0x80
xor ebx, ebx
int 0x80
ender:
call starter
db 'r3v3rs3c'
Assemble 它与:nasm -f elf r3v.asm Link 它与:ld -o r3v r3v.o 转储它:objdump -d r3v 将 shell 代码提取到测试程序中:
/*shelltest.c
r3v3s3c - 3x_z3r0*/
char code[] =
"\xeb\x15\x31\xc0\x31\xdb\x31\xd2\x31\xc9\xb0\x04\xb3\x01\x59\xb2\x12\xcd\x80\xdb\xcd\x80\xe8\xe6\xff\xff\xff\x72\x33\x76\x33\x72\x73\x33\x63";
;
int main(int argc, char **argv)
{
int (*exeshell)();
exeshell = (int (*)()) code;
(int)(*exeshell)();
}
然后我编译:gcc shelltest.c -o shelltest 执行它:./shelltest 输出为 "Segmentation fault".
当前,当您将数组声明为可变(非常量)时,您的字符串代码将被放置在声明为不可执行的程序内存的一部分中。当您尝试 运行 它作为一个函数时,您的 OS 会看到您正在尝试 运行 无法执行的内存区域中的代码,并且会因段错误而终止您的程序。
要解决此问题,请将 code
的声明更改为 const char
即
const char code[] = "\xeb......."
这将允许编译器将其放入可执行内存,从而使其成为运行。