分段错误,当EXEÇ(Segmentation fault error when exe C)

2019-10-22 06:20发布

所以,当我编译和执行我的计划,我得到读取以下错误信息:“段错误”,而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'

与组装起来:NASM -f精灵r3v.asm与链接它: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\31\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和输出写着“段错误”。

Answer 1:

目前您的字符串代码将被放置到被宣布为不可执行,你声明数组是可变的(不是常数)程序的存储器的一部分。 当您尝试运行它作为一个功能,你的操作系统会看到你正在尝试在无法执行的内存区域中运行代码,并会杀死段错误程序。

为了解决这个问题的改变,你的申报code是一个const char

const char code[] = "\xeb......."

这将允许编译器把它转换成可执行内存,从而允许它运行。



文章来源: Segmentation fault error when exe C
标签: c shellcode