c - 如何利用缓冲区溢出在堆栈上执行指令
问题描述
我开始修补缓冲区溢出,并编写了以下程序:
#include <unistd.h>
void g() {
execve("/bin/sh", NULL, NULL);
}
void f() {
long *return_address;
char instructions[] = "\xb8\x01\x00\x00\x00\xcd\x80"; // exit(1)
return_address = (long*) (&return_address + 2);
*return_address = (long)&g; // or (long)instructions
}
int main() {
f();
}
它做了我期望它做的事情:用的return_address
地址覆盖返回地址,这会打开一个 shell。但是,如果我将返回地址设置为 ,则会出现分段错误,并且不会执行任何指令。f
g
instructions
instructions
我用 GCC 编译,使用-fno-stack-protector
.
我怎样才能防止发生这种分段错误?
解决方案
至少有一个问题与缓冲区溢出无关。
execve("/bin/sh", NULL, NULL);
第一个 NULL 成为您正在启动的进程的 argv。argv 必须是一个以 NULL结尾的字符串数组。因此,在/bin/sh
启动、尝试读取argv[0]
和取消引用 NULL 时可能会发生段错误。
void g(void) {
char *argv[] = { "/bin/sh", NULL };
execve(argv[0], argv, NULL);
}
您还可以添加-z execstack
到 gcc 命令行,这将告诉链接器允许可执行堆栈。exit(1)
如果您从某个地方的教程中获得它们,您还应该验证您拥有的指令是否可以在您的系统上编译。
推荐阅读
- spring-cloud-config - Spring Cloud Config (Server) Monitor 不通过 RabbitMQ 向客户端发送事件
- c# - 尽管定义了固定的高度和宽度,Microsoft Chart 的大小在不同的构建服务器上有所不同
- php - 运行 shell_exec Laravel 后 API 无法返回响应
- javascript - 模态关闭点击内容外
- asp.net - 未使用 Stackdriver log4net 集成将日志发送到 stackdriver
- sql-server - 如何将 YYWW 转换为基于 SqlServer 中的日期 [例如:给定 YYWW 中的星期一日期] 的日期格式?
- wechat - 我的问题是关于微信页面跳转,当我想跳转到一个页面时,它总是闪烁另一个页面
- r - 如何在Rstudio中将图像函数绘制的图片保存为pdf格式?
- vue.js - 如何在 nuxt.js 中定义路由
- javascript - 当我尝试删除上传的文件时反应输入,删除后我无法第二次上传