【发布时间】:2013-02-09 15:56:19
【问题描述】:
我正在学习缓冲区溢出,并正在尝试制作一个。我有这个代码:
#include <stdio.h>
char *secret = "password";
void go_shell() {
char *shell = "/bin/sh";
char *cmd[] = { "/bin/sh", 0 };
setreuid(0);
execve(shell,cmd,0);
}
int authorize() {
char password[64];
printf("Enter Password: ");
gets(password);
if (!strcmp(password,secret)) {
return 1;
}
else {
return 0;
}
}
int main() {
if (authorize()) {
printf("login successful\n");
go_shell();
} else {
printf("Incorrect password\n");
}
return 0;
}
我用 gcc 编译它,然后在 gdb 中运行它
我输入了大约 100 个“A”作为密码,程序崩溃了。
问题是没有寄存器被覆盖到0x4141414141414141
我用谷歌搜索了这个并将-fno-stack-protector 标志添加到gcc,这允许RBP 被覆盖到0x4141414141414141 但没有别的。
我想知道是否有办法编译代码以便覆盖 RIP。
【问题讨论】:
-
您使用的是 Linux 吗?我认为你还需要在那里设置一些标志。
-
使用 Mac OSX。知道标志是什么吗?
-
我不了解 Mac OSX - 可能会与 Ubuntu 大不相同(抱歉,我实际上是在 Ubuntu 上做的,而不是 Linux)。
-
@nhahtdh Ubuntu 是一个 Linux 发行版。
-
缓冲区溢出通常根本不会覆盖寄存器变量。如果你覆盖堆栈,返回地址可能会被覆盖,如果你有帧指针(没有
-fomit-frame-pointer),可能还会覆盖帧指针。所以这些可能会被拉回寄存器,但那是因为堆栈首先被覆盖,而不是因为寄存器被直接覆盖。
标签: c compilation buffer-overflow