基本缓冲区溢出帮助

逆向工程 C 开发 缓冲区溢出
2021-06-16 19:25:00

我目前正在为 CTF 比赛练习,练习挑战之一是缓冲区溢出漏洞利用。在这次挑战之前,我对这些漏洞利用一无所知,但我一直在阅读它们并试图了解基础知识。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void win(void)
{
    system("cat flag.txt");
    return;
}


int main(int argc, char *argv[])
{
    printf("Give me some data: \n");
    fflush(stdout);
    char buffer[32];
    gets(buffer);
    printf("You entered %s\n", buffer);
    fflush(stdout);
    return 0;
}

所以到目前为止我所知道的是我需要重定向到该win()函数并且有一个 32 个字符的缓冲区。我把程序分解成汇编,发现win()函数的地址是0x080484fd. 之后,我连接到程序的服务器并输入 32 个字符和函数的地址。程序只返回我的输入,并没有重定向到win()函数。我做了更多阅读并尝试使用以下命令从另一个 shell 执行此操作:

sudo python -c 'print "a"*32 + "\x08\x04\x84\xfd"' >& /dev/pts/2

可悲的是,这并没有让我进入这个win()功能。我究竟做错了什么?我已经完全阻塞了,不知道还能尝试什么。任何建议和帮助将不胜感激。

1个回答

你做得很好,有一点帮助你可以利用这个程序。首先,让我们看看 Linux 的堆栈布局(我假设它是 Linux,因为sudo并且它比其他类 Unix 操作系统更常见)。

Linux 堆栈布局

old-EIP不是紧跟在我们的缓冲区之后。

我在我的 32 位 Linux Mint 中编译了你的程序,你可以看到 GCC 抛出安全警告。

你可以看到 GCC 警告

让我们准备我们的漏洞利用。

段错误

分段错误,很可能是 EIP 试图执行错误的地址。(也许是因为它是一个 CTF :)

利用缓冲区溢出 程序再次崩溃:

坠毁

您可以看到我们在 old-EIP 之前覆盖了 old-EBP 值。我们只需要找到函数符号并使用该地址敲击堆栈(旧 EIP)值。

在行动中利用

我希望它能让你更清楚一些。

给你的一点安全警告:除非你需要,否则不要使用sudo