exe C时的分段错误错误

时间:2015-03-16 12:12:57

标签: c shellcode

因此,在编译并执行我的程序后,我收到以下错误消息:“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'

使用以下命令组装:nasm -f elf 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 输出显示“Segmentation fault”。

1 个答案:

答案 0 :(得分:2)

目前,您的字符串代码将放入程序内存的一部分,当您声明数组是可变的(而不是const)时,该内存被声明为不可执行。当您尝试将其作为一个函数运行时,您的操作系统将会看到您正在尝试在无法执行的内存区域中运行代码,并将使用段错误来终止您的程序。

要解决此问题,请将code的声明更改为const char

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

这将允许编译器将其放入可执行内存中,从而允许它运行。