exe C时出现分段错误错误

Posted

技术标签:

【中文标题】exe C时出现分段错误错误【英文标题】:Segmentation fault error when exe C 【发布时间】:2015-03-16 12:12:57 【问题描述】:

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

【问题讨论】:

看到没有人知道你到底做了什么(你没有发布代码),我怀疑有人会知道如何解决你的问题。 发布您的代码。你的整个错误。 我们需要先建立术语。您认为什么是“shell 代码”?什么是“将十六进制提取到 C 脚本”?什么是“C 脚本”?通常我们有“shell脚本”和“C代码”。 这是一个运行时错误,首先尝试使用printfexit(0) 查找代码的哪一部分运行良好,然后检查您的动态数组、指针、索引、释放和与记忆......我猜你有一个邪恶的野指针所以寻找他或发布你的代码 @StoryTeller 对不起,我是整个论坛 Qs 和 As 的新手,仍在练习如何以更详细和更易于理解的格式提问... 【参考方案1】:

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

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

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

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

【讨论】:

我进行了更改,它删除了“分段错误”消息并将其替换为所需的输出:)

以上是关于exe C时出现分段错误错误的主要内容,如果未能解决你的问题,请参考以下文章

在 C 中创建大型数组时出现分段错误

返回指针时出现分段错误[重复]

在指针迭代中使用 for 循环时出现分段错误

为啥在访问二级指针时出现分段错误错误? C语言

将结构插入地图时出现分段错误

删除时出现分段错误