gpt4 book ai didi

编译 C 以允许缓冲区溢出

转载 作者:太空狗 更新时间:2023-10-29 16:56:28 26 4
gpt4 key购买 nike

我正在学习有关缓冲区溢出的知识,并正在努力解决这个问题。我有这段代码:

#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。

最佳答案

如果您使用 -fno-stack-protector 编译,您的代码已经完成了您想要的操作。您在 GDB 中看不到值为 0x4141414141414141RIP 的原因是在更新 RIP 之前抛出一般保护错误。 (如果发生页面错误,GPF 处理程序通常会从交换区加载页面并从失败的指令开始恢复执行。)

关于编译 C 以允许缓冲区溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14789850/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com